109_auth_identity_compat_backfill.sql 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. INSERT INTO auth_identities (
  2. user_id,
  3. provider_type,
  4. provider_key,
  5. provider_subject,
  6. verified_at,
  7. metadata
  8. )
  9. SELECT
  10. u.id,
  11. 'email',
  12. 'email',
  13. LOWER(BTRIM(u.email)),
  14. COALESCE(u.updated_at, u.created_at, NOW()),
  15. jsonb_build_object(
  16. 'backfill_source', 'users.email',
  17. 'migration', '109_auth_identity_compat_backfill'
  18. )
  19. FROM users AS u
  20. WHERE u.deleted_at IS NULL
  21. AND BTRIM(COALESCE(u.email, '')) <> ''
  22. AND RIGHT(LOWER(BTRIM(u.email)), LENGTH('@linuxdo-connect.invalid')) <> '@linuxdo-connect.invalid'
  23. AND RIGHT(LOWER(BTRIM(u.email)), LENGTH('@oidc-connect.invalid')) <> '@oidc-connect.invalid'
  24. AND RIGHT(LOWER(BTRIM(u.email)), LENGTH('@wechat-connect.invalid')) <> '@wechat-connect.invalid'
  25. ON CONFLICT (provider_type, provider_key, provider_subject) DO NOTHING;
  26. INSERT INTO auth_identities (
  27. user_id,
  28. provider_type,
  29. provider_key,
  30. provider_subject,
  31. verified_at,
  32. metadata
  33. )
  34. SELECT
  35. u.id,
  36. 'linuxdo',
  37. 'linuxdo',
  38. SUBSTRING(BTRIM(u.email) FROM '(?i)^linuxdo-(.+)@linuxdo-connect\.invalid$'),
  39. COALESCE(u.updated_at, u.created_at, NOW()),
  40. jsonb_build_object(
  41. 'backfill_source', 'synthetic_email',
  42. 'legacy_email', BTRIM(u.email),
  43. 'migration', '109_auth_identity_compat_backfill'
  44. )
  45. FROM users AS u
  46. WHERE u.deleted_at IS NULL
  47. AND LOWER(BTRIM(u.email)) ~ '^linuxdo-.+@linuxdo-connect\.invalid$'
  48. ON CONFLICT (provider_type, provider_key, provider_subject) DO NOTHING;
  49. INSERT INTO auth_identities (
  50. user_id,
  51. provider_type,
  52. provider_key,
  53. provider_subject,
  54. verified_at,
  55. metadata
  56. )
  57. SELECT
  58. u.id,
  59. 'wechat',
  60. 'wechat',
  61. SUBSTRING(BTRIM(u.email) FROM '(?i)^wechat-(.+)@wechat-connect\.invalid$'),
  62. COALESCE(u.updated_at, u.created_at, NOW()),
  63. jsonb_build_object(
  64. 'backfill_source', 'synthetic_email',
  65. 'legacy_email', BTRIM(u.email),
  66. 'migration', '109_auth_identity_compat_backfill'
  67. )
  68. FROM users AS u
  69. WHERE u.deleted_at IS NULL
  70. AND LOWER(BTRIM(u.email)) ~ '^wechat-.+@wechat-connect\.invalid$'
  71. ON CONFLICT (provider_type, provider_key, provider_subject) DO NOTHING;
  72. UPDATE users
  73. SET signup_source = 'linuxdo'
  74. WHERE deleted_at IS NULL
  75. AND LOWER(BTRIM(COALESCE(email, ''))) ~ '^linuxdo-.+@linuxdo-connect\.invalid$';
  76. UPDATE users
  77. SET signup_source = 'wechat'
  78. WHERE deleted_at IS NULL
  79. AND LOWER(BTRIM(COALESCE(email, ''))) ~ '^wechat-.+@wechat-connect\.invalid$';
  80. UPDATE users
  81. SET signup_source = 'oidc'
  82. WHERE deleted_at IS NULL
  83. AND LOWER(BTRIM(COALESCE(email, ''))) ~ '^oidc-.+@oidc-connect\.invalid$';
  84. INSERT INTO auth_identity_migration_reports (report_type, report_key, details)
  85. SELECT
  86. 'oidc_synthetic_email_requires_manual_recovery',
  87. CAST(u.id AS TEXT),
  88. jsonb_build_object(
  89. 'user_id', u.id,
  90. 'email', LOWER(BTRIM(u.email)),
  91. 'reason', 'cannot recover issuer_plus_sub deterministically from synthetic email alone',
  92. 'migration', '109_auth_identity_compat_backfill'
  93. )
  94. FROM users AS u
  95. WHERE u.deleted_at IS NULL
  96. AND LOWER(BTRIM(u.email)) ~ '^oidc-.+@oidc-connect\.invalid$'
  97. ON CONFLICT (report_type, report_key) DO NOTHING;
  98. INSERT INTO auth_identity_migration_reports (report_type, report_key, details)
  99. SELECT
  100. 'wechat_openid_only_requires_remediation',
  101. CAST(u.id AS TEXT),
  102. jsonb_build_object(
  103. 'user_id', u.id,
  104. 'email', LOWER(BTRIM(u.email)),
  105. 'reason', 'legacy wechat synthetic identity requires explicit unionid remediation if channel-only data exists',
  106. 'migration', '109_auth_identity_compat_backfill'
  107. )
  108. FROM users AS u
  109. WHERE u.deleted_at IS NULL
  110. AND LOWER(BTRIM(u.email)) ~ '^wechat-.+@wechat-connect\.invalid$'
  111. AND NOT EXISTS (
  112. SELECT 1
  113. FROM auth_identities ai
  114. WHERE ai.user_id = u.id
  115. AND ai.provider_type = 'wechat'
  116. AND ai.provider_key = 'wechat'
  117. )
  118. ON CONFLICT (report_type, report_key) DO NOTHING;