Skip to content

[FEAT] Implement Admin Dashboard REST API with Role-Based Access Control #63

Description

@Queenode

🟡 Priority: High
Difficulty: Hard
Estimated Effort: 4-5 days
Relevant Files: src/routes/, src/controllers/, src/middleware/, prisma/schema.prisma
Labels: enhancement, priority:high, admin

Requirements

  1. Admin User Model

    • Add an AdminUser model to Prisma:
      model AdminUser {
        id          String   @id @default(uuid())
        email       String   @unique
        password    String   // bcrypt hashed
        role        String   @default("VIEWER") // VIEWER, MODERATOR, ADMIN, SUPER_ADMIN
        lastLogin   DateTime?
        createdAt   DateTime @default(now())
      }
    • Seed a default SUPER_ADMIN account on first deployment
  2. Authentication

    • POST /admin/login — email + password, returns a JWT with { adminId, role, exp }
    • JWT secret must be separate from any other secret in the system
    • Token expiry: 1 hour for VIEWER, 4 hours for ADMIN/SUPER_ADMIN
    • Refresh tokens with 7-day expiry stored in Redis
  3. RBAC Middleware

    • Create src/middleware/rbac.middleware.ts
    • Define permissions:
      • VIEWER: read-only access to dashboards and reports
      • MODERATOR: can flag/unflag users, resolve disputes
      • ADMIN: can manage groups, trigger payouts, view financials
      • SUPER_ADMIN: can manage admin users, rotate encryption keys, access audit logs
    • Middleware checks req.admin.role against required permission for each route
  4. Dashboard Endpoints

    • GET /admin/dashboard/stats — total users, active groups, total contributions, total payouts (last 24h, 7d, 30d)
    • GET /admin/users?page=1&limit=20&search=phone — paginated user list with search
    • GET /admin/users/:id — user detail with wallet info (public key only), group memberships, contribution history
    • GET /admin/groups?page=1&limit=20&status=active — paginated group list
    • GET /admin/groups/:id — group detail with members, contributions, payout history
    • GET /admin/transactions?page=1&limit=50&status=failed — transaction log with filters
    • POST /admin/groups/:id/trigger-payout — manually trigger a payout (ADMIN only)
    • POST /admin/users/:id/flag — flag a user for review (MODERATOR+)
  5. Audit Logging

    • Every admin action must be logged in an AdminAuditLog table:
      model AdminAuditLog {
        id        String   @id @default(uuid())
        adminId   String
        action    String
        target    String   // e.g., "user:abc123" or "group:def456"
        metadata  Json?
        ip        String
        createdAt DateTime @default(now())
      }
    • Audit logs are append-only (no updates or deletes)
  6. Testing

    • Unit test: RBAC middleware correctly blocks unauthorized access
    • Unit test: JWT validation works for valid/expired/tampered tokens
    • Integration test: full login → access dashboard → trigger payout flow
    • Test: VIEWER cannot trigger payouts, ADMIN can
    • Target: >85% coverage on admin module

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    GrantFox OSSIssue tracked in GrantFox OSSMaybe RewardedIssue may be eligible for a GrantFox rewardThird CampaignCampaign: Third Campaign

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions