diff --git a/account/sql/migrations/202510050000_admin_settings.down.sql b/account/sql/migrations/202510050000_admin_settings.down.sql deleted file mode 100644 index dc0f224..0000000 --- a/account/sql/migrations/202510050000_admin_settings.down.sql +++ /dev/null @@ -1 +0,0 @@ --- No-op down migration; manual rollback required. diff --git a/account/sql/migrations/202510050000_admin_settings.up.sql b/account/sql/migrations/202510050000_admin_settings.up.sql deleted file mode 100644 index 1c2b99c..0000000 --- a/account/sql/migrations/202510050000_admin_settings.up.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Migration: create admin_settings table for permission matrix - -BEGIN; - -CREATE TABLE IF NOT EXISTS admin_settings ( - id BIGSERIAL PRIMARY KEY, - module_key TEXT NOT NULL, - role TEXT NOT NULL, - enabled BOOLEAN NOT NULL DEFAULT FALSE, - version BIGINT NOT NULL, - created_at TIMESTAMPTZ NOT NULL DEFAULT now(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), - CONSTRAINT admin_settings_module_role_uk UNIQUE (module_key, role) -); - -CREATE INDEX IF NOT EXISTS idx_admin_settings_version ON admin_settings (version); - -DROP TRIGGER IF EXISTS trg_admin_settings_set_updated_at ON admin_settings; -CREATE TRIGGER trg_admin_settings_set_updated_at -BEFORE UPDATE ON admin_settings -FOR EACH ROW EXECUTE FUNCTION set_updated_at(); - -COMMIT; diff --git a/account/sql/migrations/202510070000_to_rbac.down.sql b/account/sql/migrations/202510070000_to_rbac.down.sql deleted file mode 100644 index dc0f224..0000000 --- a/account/sql/migrations/202510070000_to_rbac.down.sql +++ /dev/null @@ -1 +0,0 @@ --- No-op down migration; manual rollback required. diff --git a/account/sql/migrations/202510070000_to_rbac.up.sql b/account/sql/migrations/202510070000_to_rbac.up.sql deleted file mode 100644 index 54eb016..0000000 --- a/account/sql/migrations/202510070000_to_rbac.up.sql +++ /dev/null @@ -1,36 +0,0 @@ -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; diff --git a/account/sql/migrations/202510080100_generated_columns.down.sql b/account/sql/migrations/202510080100_generated_columns.down.sql deleted file mode 100644 index dc0f224..0000000 --- a/account/sql/migrations/202510080100_generated_columns.down.sql +++ /dev/null @@ -1 +0,0 @@ --- No-op down migration; manual rollback required. diff --git a/account/sql/migrations/202510080100_generated_columns.up.sql b/account/sql/migrations/202510080100_generated_columns.up.sql deleted file mode 100644 index db50a73..0000000 --- a/account/sql/migrations/202510080100_generated_columns.up.sql +++ /dev/null @@ -1,97 +0,0 @@ --- ========================================= --- 20251008-fix-generated-columns.sql --- Migration: Remove generated columns incompatible with pglogical --- Safe to re-run (幂等) --- ========================================= - -BEGIN; - --- 尝试确保当前用户对 pglogical schema 有访问权限 -DO $grant$ -BEGIN - BEGIN - EXECUTE 'GRANT USAGE ON SCHEMA pglogical TO ' || current_user; - EXECUTE 'GRANT ALL ON ALL TABLES IN SCHEMA pglogical TO ' || current_user; - EXECUTE 'GRANT ALL ON ALL SEQUENCES IN SCHEMA pglogical TO ' || current_user; - EXECUTE 'GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA pglogical TO ' || current_user; - RAISE NOTICE 'Granted pglogical schema permissions to current_user: %', current_user; - EXCEPTION WHEN others THEN - RAISE NOTICE 'Skipping GRANT for schema pglogical (possibly already granted or insufficient privilege)'; - END; -END; -$grant$; - --- ========================================= --- Step 1. 检查并删除旧的 generated column --- ========================================= -DO $drop$ -BEGIN - IF EXISTS ( - SELECT 1 - FROM information_schema.columns - WHERE table_schema = 'public' - AND table_name = 'users' - AND column_name = 'email_verified' - AND is_generated = 'ALWAYS' - ) THEN - RAISE NOTICE 'Detected generated column: users.email_verified — dropping it for pglogical compatibility'; - EXECUTE 'ALTER TABLE public.users DROP COLUMN email_verified'; - ELSE - RAISE NOTICE 'No generated column detected: users.email_verified is safe'; - END IF; -END; -$drop$; - --- ========================================= --- Step 2. 添加普通布尔列 (safe re-run) --- ========================================= -DO $add$ -BEGIN - IF NOT EXISTS ( - SELECT 1 - FROM information_schema.columns - WHERE table_schema = 'public' - AND table_name = 'users' - AND column_name = 'email_verified' - ) THEN - RAISE NOTICE 'Adding normal column: users.email_verified (BOOLEAN DEFAULT false)'; - EXECUTE 'ALTER TABLE public.users ADD COLUMN email_verified BOOLEAN DEFAULT false NOT NULL'; - ELSE - RAISE NOTICE 'Column users.email_verified already exists, skipping ADD COLUMN'; - END IF; -END; -$add$; - --- ========================================= --- Step 3. 创建维护触发器 --- ========================================= -DROP FUNCTION IF EXISTS maintain_email_verified() CASCADE; - -CREATE FUNCTION maintain_email_verified() RETURNS trigger -LANGUAGE plpgsql -AS $$ -BEGIN - NEW.email_verified := (NEW.email_verified_at IS NOT NULL); - RETURN NEW; -END; -$$; - -DROP TRIGGER IF EXISTS trg_users_maintain_email_verified ON public.users; - -CREATE TRIGGER trg_users_maintain_email_verified -BEFORE INSERT OR UPDATE ON public.users -FOR EACH ROW EXECUTE FUNCTION maintain_email_verified(); - --- ========================================= --- Step 4. 修正现有数据 --- ========================================= -UPDATE public.users -SET email_verified = (email_verified_at IS NOT NULL) -WHERE email_verified IS DISTINCT FROM (email_verified_at IS NOT NULL); - -COMMIT; - --- ========================================= --- End of migration --- ========================================= - diff --git a/account/sql/migrations/202510080200_email_verified.down.sql b/account/sql/migrations/202510080200_email_verified.down.sql deleted file mode 100644 index dc0f224..0000000 --- a/account/sql/migrations/202510080200_email_verified.down.sql +++ /dev/null @@ -1 +0,0 @@ --- No-op down migration; manual rollback required. diff --git a/account/sql/migrations/202510080200_email_verified.up.sql b/account/sql/migrations/202510080200_email_verified.up.sql deleted file mode 100644 index 96a75ed..0000000 --- a/account/sql/migrations/202510080200_email_verified.up.sql +++ /dev/null @@ -1,86 +0,0 @@ --- ========================================= --- 20251008.migrate.generated-columns.sql --- Migration: Convert generated columns to normal + trigger --- Safe to re-run (幂等) --- ========================================= - -BEGIN; - --- 1️⃣ 兼容 pglogical:确保当前用户可访问 schema -DO $$ -BEGIN - BEGIN - GRANT USAGE ON SCHEMA pglogical TO CURRENT_USER; - RAISE NOTICE 'Granted USAGE on schema pglogical to current user'; - EXCEPTION WHEN OTHERS THEN - RAISE NOTICE 'Skipping GRANT for schema pglogical (possibly already granted or insufficient privilege)'; - END; -END; -$$; - --- 2️⃣ 删除不兼容的 generated column -DO $$ -BEGIN - IF EXISTS ( - SELECT 1 - FROM information_schema.columns - WHERE table_schema = 'public' - AND table_name = 'users' - AND column_name = 'email_verified' - AND is_generated = 'ALWAYS' - ) THEN - RAISE NOTICE 'Detected generated column: users.email_verified — dropping it for pglogical compatibility'; - ALTER TABLE public.users DROP COLUMN email_verified; - ELSE - RAISE NOTICE 'No generated column detected: users.email_verified is safe'; - END IF; -END; -$$; - --- 3️⃣ 确保存在普通列 email_verified -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'public' - AND table_name = 'users' - AND column_name = 'email_verified' - ) THEN - RAISE NOTICE 'Adding normal column: users.email_verified (BOOLEAN DEFAULT false)'; - ALTER TABLE public.users ADD COLUMN email_verified BOOLEAN DEFAULT false NOT NULL; - ELSE - RAISE NOTICE 'Column users.email_verified already exists, skipping ADD COLUMN'; - END IF; -END; -$$; - --- 4️⃣ 定义幂等触发器函数 -DROP FUNCTION IF EXISTS public.maintain_email_verified() CASCADE; - -CREATE FUNCTION public.maintain_email_verified() RETURNS trigger -LANGUAGE plpgsql -AS $$ -BEGIN - NEW.email_verified := (NEW.email_verified_at IS NOT NULL); - RETURN NEW; -END; -$$; - --- 5️⃣ 触发器同步 email_verified 与 email_verified_at -DROP TRIGGER IF EXISTS trg_users_maintain_email_verified ON public.users; - -CREATE TRIGGER trg_users_maintain_email_verified -BEFORE INSERT OR UPDATE ON public.users -FOR EACH ROW EXECUTE FUNCTION public.maintain_email_verified(); - --- 6️⃣ 修正历史数据 -UPDATE public.users -SET email_verified = (email_verified_at IS NOT NULL) -WHERE email_verified IS DISTINCT FROM (email_verified_at IS NOT NULL); - -COMMIT; - --- ========================================= --- End of migration --- ========================================= -