import { FastifyInstance } from "fastify"; import prisma from "../../config/database"; import { requirePermission } from "../../middleware/auth"; import { success, paginated, error } from "../../utils/response"; import { parsePagination, buildPaginationMeta } from "../../utils/pagination"; export default async function auditLogRoutes( fastify: FastifyInstance, ): Promise { fastify.get( "/", { preHandler: requirePermission("settings.audit") }, async (request, reply) => { const query = request.query as Record; const { page, limit, skip, order, search } = parsePagination(query); const where: Record = {}; if (query.action) where.action = String(query.action); if (query.entity_type) where.entity_type = String(query.entity_type); if (query.user_id) where.user_id = Number(query.user_id); if (search) where.description = { contains: search }; if (query.date_from || query.date_to) { const dateFilter: Record = {}; if (query.date_from) dateFilter.gte = new Date(String(query.date_from)); if (query.date_to) dateFilter.lte = new Date(String(query.date_to) + "T23:59:59"); where.created_at = dateFilter; } const [logs, total] = await Promise.all([ prisma.audit_logs.findMany({ where, skip, take: limit, orderBy: { created_at: order }, }), prisma.audit_logs.count({ where }), ]); return paginated(reply, logs, buildPaginationMeta(total, page, limit)); }, ); // POST /api/admin/audit-log/cleanup — delete old audit logs fastify.post( "/cleanup", { preHandler: requirePermission("settings.audit") }, async (request, reply) => { const body = request.body as Record; const days = body.days !== undefined ? Number(body.days) : null; // days === 0 means "delete all" (from frontend "Vše" option) if (days === 0 || body.action === "all") { const result = await prisma.audit_logs.deleteMany({}); return success(reply, null, 200, `Smazáno ${result.count} záznamů`); } if (days && days > 0) { const cutoff = new Date(); cutoff.setDate(cutoff.getDate() - days); const result = await prisma.audit_logs.deleteMany({ where: { created_at: { lt: cutoff } }, }); return success( reply, null, 200, `Smazáno ${result.count} záznamů starších než ${days} dní`, ); } return error(reply, "Zadejte počet dní", 400); }, ); }