32 lines
2.3 KiB
SQL
32 lines
2.3 KiB
SQL
-- 0010_user_confirmation — подтверждение аккаунта после регистрации.
|
||
--
|
||
-- Саморегистрация (POST /auth/register) создаёт неподтверждённого
|
||
-- клиента: войти нельзя (Login → 403 account not confirmed), пока
|
||
-- подтверждение не выставит админ (POST /users/:id/confirm).
|
||
-- До этой миграции SMTP и подтверждения не было вовсе — поэтому
|
||
-- бэкфилл помечает существующих пользователей подтверждёнными.
|
||
--
|
||
-- Правила, проверяемые в SQL, а не в хендлерах:
|
||
-- * подтверждает админ — любой неподтверждённый аккаунт; клиент —
|
||
-- только созданного им мастера (ConfirmUser: обе ветки в WHERE,
|
||
-- чужой мастер и несуществующий id неразличимы — 404);
|
||
-- * повторное подтверждение отсекает WHERE confirmed_at IS NULL
|
||
-- (иначе 409 already confirmed);
|
||
-- * создание админом = подтверждение сразу («создатель и есть
|
||
-- подтверждающий») — в том же INSERT, что и создание строки;
|
||
-- * созданные админом аккаунты работают без дополнительных кликов.
|
||
--
|
||
-- confirmed_by/created_by — ON DELETE SET NULL: удалённый создатель
|
||
-- не должен ломать каскадное удаление профилей.
|
||
--
|
||
-- Применённый файл не редактировать (checksum в schema_migrations).
|
||
|
||
ALTER TABLE profiles
|
||
ADD COLUMN confirmed_at timestamptz, -- NULL — ждёт подтверждения
|
||
ADD COLUMN confirmed_by uuid REFERENCES profiles(id) ON DELETE SET NULL,
|
||
ADD COLUMN created_by uuid REFERENCES profiles(id) ON DELETE SET NULL;
|
||
|
||
-- Бэкфилл: подтверждения раньше не существовало, все существующие
|
||
-- аккаунты обязаны входить как прежде.
|
||
UPDATE profiles SET confirmed_at = now() WHERE confirmed_at IS NULL;
|