Claude
396752349f
feat(server): platform admin API with audit log and DB-backed disabled users
...
Adds the backend for the operations console: platform_admin roles
(super_admin / operator / viewer), an admin_audit_log table, and
user.disabled_at so disabling an account is a stored state instead of a
hard-coded denylist. The in-process disabled set is now refreshed from the
database every 30 seconds, and the old emergency denylist entries are
migrated into it.
/api/admin exposes overview counts, user and workspace listings with
detail, disable/enable, token revocation, the audit log, and platform
role management. Every write requires a reason and is recorded with the
actor, IP and user agent. PLATFORM_ADMIN_EMAILS bootstraps the first
super_admin.
Co-Authored-By: Claude Fable 5.1 <[email protected] >
Claude-Session: https://claude.ai/code/session_01FrVjAFWeckYV69HS51xUhy
2026-10-31 10:05:25 +00:00
..
2026-09-27 18:15:01 +08:00
2026-09-23 18:30:31 +08:00
2026-09-10 14:12:16 +08:00
2026-09-10 14:12:16 +08:00
2026-09-10 14:12:16 +08:00
2026-09-10 14:12:16 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-23 18:30:31 +08:00
2026-09-15 15:25:20 +08:00
2026-09-15 15:25:20 +08:00
2026-09-15 15:25:20 +08:00
2026-09-15 15:25:20 +08:00
2026-09-23 18:30:31 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 18:30:31 +08:00
2026-09-16 18:44:59 +08:00
2026-09-16 18:44:59 +08:00
2026-09-16 18:44:59 +08:00
2026-09-16 18:44:59 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-24 13:08:11 +08:00
2026-09-24 12:41:47 +08:00
2026-09-24 12:41:47 +08:00
2026-09-24 12:41:47 +08:00
2026-09-24 12:41:47 +08:00
2026-09-23 18:30:31 +08:00
2026-09-01 16:04:34 +08:00
2026-09-01 16:04:34 +08:00
2026-08-25 22:43:16 +08:00
2026-09-01 16:04:34 +08:00
2026-09-29 23:27:27 -07:00
2026-10-07 13:33:02 +08:00
2026-10-07 13:33:02 +08:00
2026-10-13 14:25:49 +08:00
2026-10-07 13:33:02 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-27 03:23:21 +08:00
2026-09-27 03:23:21 +08:00
2026-09-27 03:23:21 +08:00
2026-09-27 03:23:21 +08:00
2026-09-27 03:23:21 +08:00
2026-09-23 18:30:31 +08:00
2026-08-20 00:22:04 +08:00
2026-09-01 16:04:34 +08:00
2026-08-20 00:22:04 +08:00
2026-09-01 16:04:34 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-10-12 15:56:39 +08:00
2026-10-12 15:56:39 +08:00
2026-10-12 15:56:39 +08:00
2026-10-12 15:56:39 +08:00
2026-10-12 15:56:39 +08:00
2026-09-23 18:30:31 +08:00
2026-09-01 16:04:34 +08:00
2026-09-01 16:04:34 +08:00
2026-08-05 13:42:05 +08:00
2026-09-01 16:04:34 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 02:26:24 +08:00
2026-09-27 02:26:24 +08:00
2026-09-27 02:26:24 +08:00
2026-10-31 10:05:25 +00:00
2026-10-31 10:05:25 +00:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-23 18:30:31 +08:00
2026-09-16 13:47:30 +08:00
2026-09-16 13:47:30 +08:00
2026-09-16 13:47:30 +08:00
2026-09-16 13:47:30 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-23 18:30:31 +08:00
2026-09-17 15:51:59 +08:00
2026-09-17 15:51:59 +08:00
2026-09-17 15:51:59 +08:00
2026-09-17 15:51:59 +08:00
2026-09-23 18:30:31 +08:00
2026-09-27 02:26:24 +08:00
2026-09-27 02:26:24 +08:00
2026-09-27 02:26:24 +08:00
2026-09-27 02:26:24 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-23 18:30:31 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 14:33:43 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-21 18:29:50 +08:00
2026-09-08 22:51:19 +08:00
2026-09-23 18:30:31 +08:00
2026-09-01 16:04:34 +08:00
2026-08-20 00:22:04 +08:00
2026-09-01 16:04:34 +08:00
2026-09-01 16:04:34 +08:00
2026-09-24 14:25:49 +08:00
2026-09-24 14:25:49 +08:00
2026-09-24 14:25:49 +08:00
2026-09-24 14:25:49 +08:00
2026-09-24 14:25:49 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-10-14 14:43:47 +08:00
2026-09-27 18:15:01 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-01 16:04:34 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-10-12 13:26:00 +08:00
2026-10-12 13:26:00 +08:00
2026-10-12 13:26:00 +08:00
2026-10-12 13:26:00 +08:00
2026-10-12 13:26:00 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-10-08 01:18:08 +08:00
2026-10-08 01:18:08 +08:00
2026-10-08 01:18:08 +08:00
2026-10-08 01:18:08 +08:00
2026-10-08 01:18:08 +08:00
2026-09-23 18:30:31 +08:00
2026-09-01 16:04:34 +08:00
2026-09-01 16:04:34 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-23 18:30:31 +08:00
2026-09-20 14:57:49 +08:00
2026-09-20 14:57:49 +08:00
2026-09-20 14:57:49 +08:00
2026-09-20 14:57:49 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-27 02:11:19 +08:00
2026-09-27 02:11:19 +08:00
2026-09-27 02:11:19 +08:00
2026-09-27 02:11:19 +08:00
2026-09-27 02:11:19 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-01 16:04:34 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-27 18:15:01 +08:00
2026-09-23 18:30:31 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00
2026-09-03 22:53:11 +08:00