Optimize Convex queries and stack config

This commit is contained in:
Esdras Renan 2025-11-12 22:13:50 -03:00
parent 004f345d92
commit 3e4943f79c
4 changed files with 469 additions and 408 deletions

View file

@ -6,7 +6,7 @@ import type { QueryCtx } from "./_generated/server"
import {
OPEN_STATUSES,
ONE_DAY_MS,
fetchScopedTickets,
fetchOpenScopedTickets,
fetchScopedTicketsByCreatedRange,
fetchScopedTicketsByResolvedRange,
normalizeStatus,
@ -189,13 +189,14 @@ async function computeAgentStats(
rangeDays: number,
agentFilter?: Id<"users">,
) {
const scopedTickets = await fetchScopedTickets(ctx, tenantId, viewer)
const end = new Date()
end.setUTCHours(0, 0, 0, 0)
const endMs = end.getTime() + ONE_DAY_MS
const startMs = endMs - rangeDays * ONE_DAY_MS
const statsMap = new Map<string, AgentStatsRaw>()
const openTickets = await fetchOpenScopedTickets(ctx, tenantId, viewer)
const scopedTickets = await fetchScopedTicketsByCreatedRange(ctx, tenantId, viewer, startMs, endMs)
const matchesFilter = (ticket: Doc<"tickets">) => {
if (!ticket.assigneeId) return false
@ -203,7 +204,7 @@ async function computeAgentStats(
return true
}
for (const ticket of scopedTickets) {
for (const ticket of openTickets) {
if (!matchesFilter(ticket)) continue
const stats = ensureAgentStats(statsMap, ticket)
if (!stats) continue
@ -215,9 +216,7 @@ async function computeAgentStats(
}
}
const inRange = scopedTickets.filter(
(ticket) => matchesFilter(ticket) && ticket.createdAt >= startMs && ticket.createdAt < endMs,
)
const inRange = scopedTickets.filter((ticket) => matchesFilter(ticket))
const now = Date.now()
for (const ticket of inRange) {
const stats = ensureAgentStats(statsMap, ticket)
@ -336,7 +335,10 @@ const metricResolvers: Record<string, MetricResolver> = {
}
},
"tickets.waiting_action_now": async (ctx, { tenantId, viewer, params }) => {
const tickets = filterTicketsByQueue(await fetchScopedTickets(ctx, tenantId, viewer), parseQueueIds(params))
const tickets = filterTicketsByQueue(
await fetchOpenScopedTickets(ctx, tenantId, viewer),
parseQueueIds(params),
)
const now = Date.now()
let total = 0
let atRisk = 0
@ -361,7 +363,10 @@ const metricResolvers: Record<string, MetricResolver> = {
end.setUTCHours(0, 0, 0, 0)
const endMs = end.getTime() + ONE_DAY_MS
const startMs = endMs - rangeDays * ONE_DAY_MS
const tickets = filterTicketsByQueue(await fetchScopedTickets(ctx, tenantId, viewer), parseQueueIds(params))
const tickets = filterTicketsByQueue(
await fetchScopedTicketsByCreatedRange(ctx, tenantId, viewer, startMs, endMs),
parseQueueIds(params),
)
const daily: Record<string, { total: number; atRisk: number }> = {}
for (let offset = rangeDays - 1; offset >= 0; offset -= 1) {
@ -500,7 +505,7 @@ const metricResolvers: Record<string, MetricResolver> = {
ensureEntry(key)
}
const scopedTickets = await fetchScopedTickets(ctx, tenantId, viewer)
const scopedTickets = await fetchOpenScopedTickets(ctx, tenantId, viewer)
for (const ticket of scopedTickets) {
const key = normalizeKey(ticket.queueId ?? null)
if (filterHas && queueFilter && !queueFilter.includes(key)) continue
@ -626,7 +631,10 @@ const metricResolvers: Record<string, MetricResolver> = {
},
"tickets.awaiting_table": async (ctx, { tenantId, viewer, params }) => {
const limit = parseLimit(params, 20)
const tickets = filterTicketsByQueue(await fetchScopedTickets(ctx, tenantId, viewer), parseQueueIds(params))
const tickets = filterTicketsByQueue(
await fetchOpenScopedTickets(ctx, tenantId, viewer),
parseQueueIds(params),
)
const awaiting = tickets
.filter((ticket) => OPEN_STATUSES.has(normalizeStatus(ticket.status)))
.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))