/** * stats.repository.ts * Queries para obter os totais agrupados. */ import { sql } from 'drizzle-orm'; import type { Database } from '@/db/connection.js'; import { tickets } from '@/db/schema.js'; export async function getTicketsStats(db: Database) { // Uma Ășnica query para agrupar as contagens por status const rows = await db .select({ status: tickets.status, count: sql`count(*)`, }) .from(tickets) .groupBy(tickets.status); // Inicializa o mapa com 0 const stats = { totalOpen: 0, totalInProgress: 0, totalWaiting: 0, totalResolved: 0, totalClosed: 0, }; for (const row of rows) { if (row.status === 'open') stats.totalOpen = row.count; if (row.status === 'in_progress') stats.totalInProgress = row.count; if (row.status === 'waiting') stats.totalWaiting = row.count; if (row.status === 'resolved') stats.totalResolved = row.count; if (row.status === 'closed') stats.totalClosed = row.count; } return { ...stats, totalPending: stats.totalOpen + stats.totalInProgress, }; }