Optimize Convex queries and stack config
This commit is contained in:
parent
004f345d92
commit
3e4943f79c
4 changed files with 469 additions and 408 deletions
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue