77 lines
2.6 KiB
TypeScript
77 lines
2.6 KiB
TypeScript
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<void> {
|
|
fastify.get(
|
|
"/",
|
|
{ preHandler: requirePermission("settings.audit") },
|
|
async (request, reply) => {
|
|
const query = request.query as Record<string, unknown>;
|
|
const { page, limit, skip, order, search } = parsePagination(query);
|
|
|
|
const where: Record<string, unknown> = {};
|
|
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<string, Date> = {};
|
|
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<string, unknown>;
|
|
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);
|
|
},
|
|
);
|
|
}
|