accounts/account/sql/20251007.migrate.to_rbac.sql
root e8635c1758 chore(sql,pglogical): migrate schema for pglogical compatibility & cleanup
- rename old migration files to standard *.migrate.*.sql
- add 20251008.migrate.generated-columns.sql (fix generated columns)
- update Makefile for MIGRATION_FILES auto-detection
- add sql/readme.md & generate-postgres-tls.sh
- cleanup deprecated git-branch-keeper.sh
- update pglogical.md and setup_ubuntu_2204.sh
2025-10-08 19:45:20 +08:00

37 lines
1.4 KiB
PL/PgSQL

BEGIN;
ALTER TABLE public.users
ADD COLUMN IF NOT EXISTS level INTEGER DEFAULT 20 NOT NULL,
ADD COLUMN IF NOT EXISTS role TEXT DEFAULT 'user' NOT NULL,
ADD COLUMN IF NOT EXISTS groups JSONB DEFAULT '[]'::jsonb NOT NULL,
ADD COLUMN IF NOT EXISTS permissions JSONB DEFAULT '[]'::jsonb NOT NULL,
ADD COLUMN IF NOT EXISTS mfa_totp_secret TEXT,
ADD COLUMN IF NOT EXISTS mfa_enabled BOOLEAN DEFAULT false NOT NULL,
ADD COLUMN IF NOT EXISTS mfa_secret_issued_at TIMESTAMPTZ,
ADD COLUMN IF NOT EXISTS mfa_confirmed_at TIMESTAMPTZ,
ADD COLUMN IF NOT EXISTS email_verified_at TIMESTAMPTZ,
ADD COLUMN IF NOT EXISTS email_verified BOOLEAN GENERATED ALWAYS AS ((email_verified_at IS NOT NULL)) STORED;
-- 重新创建最新的用户索引
CREATE UNIQUE INDEX IF NOT EXISTS users_username_lower_uk ON public.users (lower(username));
CREATE UNIQUE INDEX IF NOT EXISTS users_email_lower_uk ON public.users (lower(email)) WHERE email IS NOT NULL;
UPDATE public.users
SET role = CASE level
WHEN 0 THEN 'admin'
WHEN 10 THEN 'operator'
ELSE 'user'
END,
groups = CASE level
WHEN 0 THEN '["Admin"]'::jsonb
WHEN 10 THEN '["Operator"]'::jsonb
ELSE '["User"]'::jsonb
END,
permissions = CASE level
WHEN 0 THEN '["session:read","session:write","user:manage"]'::jsonb
WHEN 10 THEN '["session:read","session:write"]'::jsonb
ELSE '["session:read"]'::jsonb
END
WHERE role IS NULL OR role = '' OR groups = '[]'::jsonb;
COMMIT;