feat(ECR-013A): Admin RBAC 实现并 Closed

角色权限、RequirePermission、/me permissions 与 migration 000015;
Reviewer Approve → Closed。Next:ECR-013B Contract Definition。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-07 17:19:45 +08:00
co-authored by Cursor
parent 85ed0901bb
commit b5a05941d9
35 changed files with 1518 additions and 49 deletions
@@ -0,0 +1,4 @@
UPDATE admin_accounts SET role_id = NULL WHERE role_id IS NOT NULL;
ALTER TABLE admin_accounts DROP COLUMN IF EXISTS role_id;
DROP TABLE IF EXISTS admin_role_permissions;
DROP TABLE IF EXISTS admin_roles;
@@ -0,0 +1,42 @@
-- ECR-013A Admin RBAC
CREATE TABLE IF NOT EXISTS admin_roles (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
name varchar(64) NOT NULL UNIQUE,
system boolean NOT NULL DEFAULT false,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS admin_role_permissions (
role_id uuid NOT NULL REFERENCES admin_roles(id) ON DELETE CASCADE,
code varchar(64) NOT NULL,
PRIMARY KEY (role_id, code)
);
ALTER TABLE admin_accounts
ADD COLUMN IF NOT EXISTS role_id uuid REFERENCES admin_roles(id);
INSERT INTO admin_roles(id, name, system)
VALUES ('00000000-0000-4000-8000-000000000001', 'super_admin', true)
ON CONFLICT (name) DO NOTHING;
INSERT INTO admin_role_permissions(role_id, code)
SELECT r.id, p.code
FROM admin_roles r
CROSS JOIN (VALUES
('admin.users.read'),
('admin.users.membership.grant'),
('admin.users.ask_quota.grant'),
('admin.orders.read'),
('admin.audit.read'),
('admin.analytics.read'),
('admin.content.write'),
('admin.roles.read'),
('admin.roles.write')
) AS p(code)
WHERE r.name = 'super_admin'
ON CONFLICT DO NOTHING;
UPDATE admin_accounts
SET role_id = (SELECT id FROM admin_roles WHERE name = 'super_admin')
WHERE role_id IS NULL AND deleted_at IS NULL;