/** * @copyright 2026 NHCarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { FastifyPluginAsync } from "fastify"; import { AuditService } from "../../services/audit.service"; import { adminGuard } from "../../middleware/admin-guard"; import type { AuditAction, AuditCategory } from "@library/shared-types"; interface AuditLogQuery { action?: AuditAction; category?: AuditCategory; userId?: string; success?: string; startDate?: string; endDate?: string; page?: string; limit?: string; } const auditRoutes: FastifyPluginAsync = async (app) => { /** * Get audit logs (admin only). */ app.get<{ Querystring: AuditLogQuery }>( "/", { preValidation: [app.authenticate, adminGuard], }, async (request) => { const { action, category, userId, success, startDate, endDate, page, limit } = request.query; return AuditService.getLogs({ action: action as AuditAction | undefined, category: category as AuditCategory | undefined, userId, success: success === undefined ? undefined : success === "true", startDate: startDate ? new Date(startDate) : undefined, endDate: endDate ? new Date(endDate) : undefined, page: page ? parseInt(page, 10) : 1, limit: limit ? parseInt(limit, 10) : 50, }); } ); /** * Get security logs (admin only). */ app.get<{ Querystring: { page?: string; limit?: string } }>( "/security", { preValidation: [app.authenticate, adminGuard], }, async (request) => { const { page, limit } = request.query; return AuditService.getSecurityLogs( page ? parseInt(page, 10) : 1, limit ? parseInt(limit, 10) : 50 ); } ); /** * Get logs for a specific user (admin only). */ app.get<{ Params: { userId: string }; Querystring: { page?: string; limit?: string } }>( "/user/:userId", { preValidation: [app.authenticate, adminGuard], }, async (request) => { const { userId } = request.params; const { page, limit } = request.query; return AuditService.getLogsByUser( userId, page ? parseInt(page, 10) : 1, limit ? parseInt(limit, 10) : 50 ); } ); }; export default auditRoutes;