This document details the step-by-step workflow for implementing issue #47 Backend: Implement Admin API endpoint to fetch all active disputes for dashboard in SwiftChain_Backend.
- Endpoint:
GET /api/v1/admin/disputes - Authentication & Authorization: Protected with
authenticatemiddleware andrequireRole(UserRole.ADMIN)middleware. - Filtering: Supports status filter (
open,under_review,resolved,rejected,active,all). Defaults to active disputes (open&under_review) when thestatusquery parameter is omitted. - Pagination: Supports
page(default1) andlimit(default10, max100). - Layered Architecture: Strict
Controller -> Service -> Modelpattern.
- Utilizes the existing
DisputeMongoose model located at Dispute.ts. - Queries real database records via Mongoose methods (
Dispute.findandDispute.countDocuments).
- Added
getAdminDisputesin adminService.ts. - Defined TypeScript DTO interfaces
GetAdminDisputesInputandGetAdminDisputesResult. - Applied filtering logic:
- Default /
active:{ status: { $in: ['open', 'under_review'] } } all:{}(unfiltered by status)- Specific status (
open,under_review,resolved,rejected):{ status } - Invalid status: Throws
AppErrorwith status code400 Bad Request.
- Default /
- Implemented pagination calculation (
skip = (page - 1) * limit,totalPages = Math.ceil(total / limit)).
- Added
getDisputesin adminController.ts. - Validated numeric
pageandlimitquery parameters. - Invoked
getAdminDisputesServiceand returned response format:{ "status": "success", "data": [ /* list of dispute documents */ ], "pagination": { "total": 2, "page": 1, "limit": 10, "totalPages": 1 } }
- Registered
GET /disputesin adminRoutes.ts. - Mounted under
/api/v1/admin/disputeswith authentication and admin role verification automatically inherited. - Added OpenAPI / Swagger JSDoc annotations.
- Created unit & integration test suite in adminDisputes.test.ts.
- Test Scenarios Covered:
200 OK: Default request returns active disputes (OPENandUNDER_REVIEW).200 OK: Filtering by status (resolved,all, etc.).200 OK: Pagination handling (page&limit).400 Bad Request: Invalid status filter or invalid page/limit parameters.401 Unauthorized: Request missing JWT token.403 Forbidden: Non-admin role attempting access.
- Branch:
feat/admin-fetch-disputes - Issue: Closes #47