import type { ListAuditQueryDto } from './dto/list-audit-query.dto'; export interface AuditFilters { clause: string; parameters: unknown[]; } export function buildAuditFilters(query: ListAuditQueryDto): AuditFilters { const conditions: string[] = []; const parameters: unknown[] = []; const add = (condition: (parameter: string) => string, value: unknown) => { parameters.push(value); conditions.push(condition(`$${parameters.length}`)); }; if (query.actorUserId) { add((parameter) => `event.actor_user_id = ${parameter}`, query.actorUserId); } if (query.actorUsername) { add( (parameter) => `event.actor_username ILIKE ${parameter}`, `%${query.actorUsername}%`, ); } if (query.action) { add((parameter) => `event.action = ${parameter}`, query.action); } if (query.source) { add((parameter) => `event.source = ${parameter}`, query.source); } if (query.entityType) { add((parameter) => `event.entity_type = ${parameter}`, query.entityType); } if (query.entityId) { add((parameter) => `event.entity_id = ${parameter}`, query.entityId); } if (query.requestId) { add((parameter) => `event.request_id = ${parameter}`, query.requestId); } if (query.from) { add((parameter) => `event.occurred_at >= ${parameter}`, new Date(query.from)); } if (query.to) { add((parameter) => `event.occurred_at <= ${parameter}`, new Date(query.to)); } if (query.search) { add( (parameter) => ` ( event.actor_username ILIKE ${parameter} OR event.action ILIKE ${parameter} OR event.entity_type ILIKE ${parameter} OR event.entity_id ILIKE ${parameter} OR event.request_id ILIKE ${parameter} ) `, `%${query.search}%`, ); } return { clause: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '', parameters, }; }