Przejdź do głównej zawartości

admin_users

Konta administratorów platformy (oddzielne od Customer Accounts) oraz przepływ impersonacji.

Publiczne API​

CRUD użytkowników i ról jest gated przez uprawnienie admin_users:manage.

Verb + PathCel
POST /api/v1/auth/admin/loginLogowanie admina (wyzwanie 2FA, gdy Rola tego wymaga)
POST /api/v1/auth/admin/logoutZniszczenie sesji admina
GET /api/v1/admin/admin-usersLista użytkowników admina (wiersze usunięte są filtrowane)
POST /api/v1/admin/admin-usersUtworzenie użytkownika admina; odrzuca duplikat e-mail z EMAIL_ALREADY_REGISTERED
PATCH /api/v1/admin/admin-users/:idAktualizacja imienia / przypisania roli / statusu
DELETE /api/v1/admin/admin-users/:idSoft delete (ustawia deletedAt + status='inactive')
GET /api/v1/admin/admin-rolesLista ról z tablicami uprawnień
PUT /api/v1/admin/admin-roles/:codeUpsert roli po code; nieznane uprawnienia zwracają 400 VALIDATION_FAILED
DELETE /api/v1/admin/admin-roles/:idUsunięcie; odmowa z 409 ADMIN_ROLE_IN_USE, gdy jakikolwiek użytkownik nadal ma przypisaną rolę — w tym soft-deleted, którego przypisanie wraca po przywróceniu konta. Odmowa wymienia, która populacja trzyma rolę (details.code to assigned lub assigned_to_deleted) i ile ich jest
GET /api/v1/admin/permissionsKanoniczny katalog uprawnień (moduł / code / label) używany przez UI macierzy
POST /api/v1/admin/organizations/:id/impersonateRozpoczęcie impersonacji; zapisuje wiersz audytu impersonation.start przed wydaniem cookie
POST /api/v1/admin/impersonation/endPrzywrócenie oryginalnej sesji admina

Model impersonacji​

impersonation-service.ts implementuje wzorzec switch-user: rozpoczyna nową sesję przypisaną do docelowego Customer + shadow id admina; kończy się czysto, zapisując impersonation.end. Każda akcja podczas sesji impersonowanej niesie zarówno actorAdminUserId, jak i impersonatedCustomerAccountId przez log audytu.

Encje​

AdminUser (email, passwordHash, stan two-factor, pojedyncze adminRoleId, status, soft-delete deletedAt).

AdminRole (code, nazwa wyświetlana, JSONB permissions[], requiresTwoFactor). Wildcard * jest tylko bootstrapowy i jest odrzucany przez trasę upsert.

Punkty rozszerzenia​

  • Niestandardowe wyzwania logowania — slot przed weryfikacją hasła w admin-auth-service.ts.
  • Konsumenci audytu impersonacji — każdy wiersz audytu z akcją impersonation.start|end ma tę samą strukturę; downstream reporting może łączyć po nich.