Yimaru-BackEnd/db/migrations/000012_profile_completion.up.sql

72 lines
2.1 KiB
PL/PgSQL

-- Add profile_completion_percentage column
ALTER TABLE users ADD COLUMN profile_completion_percentage SMALLINT NOT NULL DEFAULT 0;
-- Create function to calculate profile completion
CREATE OR REPLACE FUNCTION calculate_profile_completion()
RETURNS TRIGGER AS $$
DECLARE
filled_count INTEGER := 0;
BEGIN
-- Check first_name
IF NULLIF(TRIM(NEW.first_name), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
-- Check last_name
IF NULLIF(TRIM(NEW.last_name), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
-- Check email OR phone_number (counts as 1 if either is filled)
IF NULLIF(TRIM(NEW.email), '') IS NOT NULL OR NULLIF(TRIM(NEW.phone_number), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
-- Check preferred_language
IF NULLIF(TRIM(NEW.preferred_language), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
--- Check country
IF NULLIF(TRIM(NEW.country), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
-- Check age_group
IF NULLIF(TRIM(NEW.age_group), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
-- Check learning_goal
IF NULLIF(TRIM(NEW.learning_goal), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
-- Check language_goal
IF NULLIF(TRIM(NEW.language_goal), '') IS NOT NULL THEN
filled_count := filled_count + 1;
END IF;
-- Calculate percentage (8 total required fields)
NEW.profile_completion_percentage := (filled_count * 100 / 8)::SMALLINT;
-- Set profile_completed if 100%
IF NEW.profile_completion_percentage = 100 THEN
NEW.profile_completed := true;
ELSE
NEW.profile_completed := false;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Create trigger
CREATE TRIGGER trg_update_profile_completion
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION calculate_profile_completion();
-- Backfill existing rows
UPDATE users SET updated_at = updated_at;