32 lines
917 B
TypeScript
32 lines
917 B
TypeScript
import prisma from './db';
|
|||
|
|
|
||
|
|
/**
|
||
|
|
* Logs an API request to the database.
|
||
|
|
* This is intentionally fire-and-forget — it never blocks the response path.
|
||
|
|
*/
|
||
|
|
export function logApiRequest(
|
||
|
|
endpoint: string,
|
||
|
|
status: number,
|
||
|
|
duration: number
|
||
|
|
): void {
|
||
|
|
prisma.apiRequestLog
|
||
|
|
.create({ data: { endpoint, status, duration } })
|
||
|
|
.catch((error) => console.error('Failed to log API request:', error));
|
||
|
|
|
||
|
|
// Prune old logs in the background (keep last 7 days)
|
||
|
|
pruneOldLogs();
|
||
|
|
}
|
||
|
|
|
||
|
|
let lastPruneAt = 0;
|
||
|
|
const PRUNE_INTERVAL = 60 * 60 * 1000; // prune at most once per hour
|
||
|
|
|
||
|
|
function pruneOldLogs(): void {
|
||
|
|
if (Date.now() - lastPruneAt < PRUNE_INTERVAL) return;
|
||
|
|
lastPruneAt = Date.now();
|
||
|
|
|
||
|
|
const cutoff = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
|
||
|
|
prisma.apiRequestLog
|
||
|
|
.deleteMany({ where: { createdAt: { lt: cutoff } } })
|
||
|
|
.catch((error) => console.error('Failed to prune API logs:', error));
|
||
|
|
}
|