feat(management): admin actions and session history #192

Closed
opened 2026-10-03 13:14:17 +00:00 by yuris · 0 comments
Owner

Problem

Store owners/admins have no visibility into administrative operations (such as inventory stock adjustments, user creation/edits, password resets, and order modifications) and cannot inspect or revoke active user login sessions across devices.

Acceptance Criteria

  1. Schema & Database:
    • Define actionLogs (action_logs) in apps/management/lib/db/schema.ts tracking userId, userName, userRole, action, entityType, entityId, description, metadata (jsonb), ipAddress, and createdAt.
    • Map existing Better Auth sessions (session) in apps/management/lib/db/schema.ts referencing users.id.
    • Add database migration file for action_logs in apps/management/drizzle/.
  2. Audit & Session Backend:
    • Implement logAction(txOrDb, entry) in apps/management/lib/audit/service.ts.
    • Instrument key mutation paths to log actions:
      • Stock adjustments (adjustStockAction in apps/management/lib/inventory/actions.ts)
      • User management (createUserAction, updateUserAction, resetPasswordAction in apps/management/lib/users/actions.ts)
      • Order updates (updateOrderAction in apps/management/lib/orders/actions.ts)
    • Implement server actions in apps/management/lib/audit/actions.ts:
      • getActionLogs(filter) guarded by requireAdmin().
      • getSessions() guarded by requireAdmin(), identifying current session and parsing userAgent for device/browser.
      • revokeSessionAction(sessionId) guarded by requireAdmin() (disallowing self-revocation).
      • revokeAllOtherSessionsAction() guarded by requireAdmin().
  3. Admin UI:
    • Page at /settings/audit guarded by requireAdmin() (non-admins redirected to /).
    • Tab 1: "Riwayat Aksi" with search, entity filter, table showing timestamp, actor, action, target entity, description, and metadata sheet viewer.
    • Tab 2: "Sesi Pengguna" displaying active sessions, device info, IP, last active time, and revoke session buttons.
    • Add navigation link to "Audit & Sesi" in desktop settings dropup and mobile drawer for admins in dashboard-nav.tsx.
  4. Verification:
    • Unit tests covering logAction, getActionLogs, getSessions, and revokeSessionAction with admin checks in apps/management/lib/audit/actions.test.ts.
    • pnpm --filter garage test passes.
    • pnpm --filter garage typecheck passes.
    • .forgejo/scripts/biome-gate.sh passes.
## Problem Store owners/admins have no visibility into administrative operations (such as inventory stock adjustments, user creation/edits, password resets, and order modifications) and cannot inspect or revoke active user login sessions across devices. ## Acceptance Criteria 1. **Schema & Database:** - Define `actionLogs` (`action_logs`) in `apps/management/lib/db/schema.ts` tracking `userId`, `userName`, `userRole`, `action`, `entityType`, `entityId`, `description`, `metadata` (jsonb), `ipAddress`, and `createdAt`. - Map existing Better Auth `sessions` (`session`) in `apps/management/lib/db/schema.ts` referencing `users.id`. - Add database migration file for `action_logs` in `apps/management/drizzle/`. 2. **Audit & Session Backend:** - Implement `logAction(txOrDb, entry)` in `apps/management/lib/audit/service.ts`. - Instrument key mutation paths to log actions: - Stock adjustments (`adjustStockAction` in `apps/management/lib/inventory/actions.ts`) - User management (`createUserAction`, `updateUserAction`, `resetPasswordAction` in `apps/management/lib/users/actions.ts`) - Order updates (`updateOrderAction` in `apps/management/lib/orders/actions.ts`) - Implement server actions in `apps/management/lib/audit/actions.ts`: - `getActionLogs(filter)` guarded by `requireAdmin()`. - `getSessions()` guarded by `requireAdmin()`, identifying current session and parsing userAgent for device/browser. - `revokeSessionAction(sessionId)` guarded by `requireAdmin()` (disallowing self-revocation). - `revokeAllOtherSessionsAction()` guarded by `requireAdmin()`. 3. **Admin UI:** - Page at `/settings/audit` guarded by `requireAdmin()` (non-admins redirected to `/`). - Tab 1: "Riwayat Aksi" with search, entity filter, table showing timestamp, actor, action, target entity, description, and metadata sheet viewer. - Tab 2: "Sesi Pengguna" displaying active sessions, device info, IP, last active time, and revoke session buttons. - Add navigation link to "Audit & Sesi" in desktop settings dropup and mobile drawer for admins in `dashboard-nav.tsx`. 4. **Verification:** - Unit tests covering `logAction`, `getActionLogs`, `getSessions`, and `revokeSessionAction` with admin checks in `apps/management/lib/audit/actions.test.ts`. - `pnpm --filter garage test` passes. - `pnpm --filter garage typecheck` passes. - `.forgejo/scripts/biome-gate.sh` passes.
yuris closed this issue 2026-10-03 13:49:40 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
yuris/garage#192
No description provided.