nxtgauge-backend-rust/crates/db/migrations/20260415010002_backfill_user_role_profiles.up.sql
Tracewebstudio Dev 03376b9567 feat: Add database redesign documentation and Phase 1-2 migrations
- Add schema_audit.md documenting current schema issues
- Add target_schema.md with complete target schema design
- Add old_to_new_mapping.md with table mapping
- Add migration_plan.md with phased migration strategy
- Add Phase 1 migrations (core infrastructure):
  - user_sessions table
  - users missing columns
  - departments updates
  - designations updates
  - employees updates
- Add Phase 2 migrations (profile domain - CRITICAL):
  - create user_role_profiles root table
  - backfill user_role_profiles from existing profiles
  - add user_role_profile_id to extension tables
  - remove forbidden external portfolio links
- Add user_role_profile Rust model
- Update photographer model to use user_role_profile_id
2026-04-12 23:21:11 +02:00

262 lines
10 KiB
SQL

-- Phase 2.2: Backfill user_role_profiles from existing profile tables
-- Migration: 20260415010002
-- Backfill from photographer_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'photographer',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM photographer_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'photographer'
);
-- Backfill from tutor_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'tutor',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM tutor_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'tutor'
);
-- Backfill from makeup_artist_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'makeup_artist',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM makeup_artist_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'makeup_artist'
);
-- Backfill from developer_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'developer',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM developer_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'developer'
);
-- Backfill from video_editor_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'video_editor',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM video_editor_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'video_editor'
);
-- Backfill from graphic_designer_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'graphic_designer',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM graphic_designer_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'graphic_designer'
);
-- Backfill from social_media_manager_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'social_media_manager',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM social_media_manager_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'social_media_manager'
);
-- Backfill from fitness_trainer_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'fitness_trainer',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM fitness_trainer_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'fitness_trainer'
);
-- Backfill from catering_service_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'catering_service',
COALESCE(p.business_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM catering_service_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'catering_service'
);
-- Backfill from ugc_content_creator_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, verification_status, approval_status, rejection_reason, approved_at, created_at, updated_at)
SELECT
gen_random_uuid(),
p.user_id,
'ugc_content_creator',
COALESCE(p.display_name, ''),
p.bio,
p.location,
COALESCE(p.status, 'ACTIVE'),
CASE WHEN p.status = 'VERIFIED' THEN 'VERIFIED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
CASE WHEN p.status = 'APPROVED' THEN 'APPROVED' WHEN p.status = 'REJECTED' THEN 'REJECTED' ELSE 'PENDING' END,
p.rejection_reason,
p.approved_at,
p.created_at,
COALESCE(p.updated_at, NOW())
FROM ugc_content_creator_profiles p
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = p.user_id AND urp.role_key = 'ugc_content_creator'
);
-- Backfill from company_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, created_at, updated_at)
SELECT
gen_random_uuid(),
cp.user_id,
'company',
cp.company_name,
cp.bio,
NULL,
COALESCE(cp.status, 'ACTIVE'),
cp.created_at,
COALESCE(cp.updated_at, NOW())
FROM company_profiles cp
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = cp.user_id AND urp.role_key = 'company'
);
-- Backfill from customer_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, location, status, created_at, updated_at)
SELECT
gen_random_uuid(),
cp.user_id,
'customer',
COALESCE(cp.full_name, ''),
cp.city,
COALESCE(cp.status, 'ACTIVE'),
cp.created_at,
COALESCE(cp.updated_at, NOW())
FROM customer_profiles cp
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = cp.user_id AND urp.role_key = 'customer'
);
-- Backfill from job_seeker_profiles
INSERT INTO user_role_profiles (id, user_id, role_key, display_name, bio, location, status, created_at, updated_at)
SELECT
gen_random_uuid(),
jsp.user_id,
'candidate',
COALESCE(jsp.full_name, ''),
jsp.bio,
jsp.location,
COALESCE(jsp.status, 'ACTIVE'),
jsp.created_at,
COALESCE(jsp.updated_at, NOW())
FROM job_seeker_profiles jsp
WHERE NOT EXISTS (
SELECT 1 FROM user_role_profiles urp WHERE urp.user_id = jsp.user_id AND urp.role_key = 'candidate'
);