livechat: inicializar sessão com não lidas prévias

This commit is contained in:
esdrasrenan 2025-12-09 01:44:24 -03:00
parent c7711dfda5
commit fe361ff4d8

View file

@ -103,6 +103,42 @@ export const startSession = mutation({
const now = Date.now()
// Calcular não lidas iniciais: mensagens do ticket após a última sessão encerrada
// que não foram enviadas pela própria máquina/usuário vinculado.
const lastEndedSession = await ctx.db
.query("liveChatSessions")
.withIndex("by_ticket", (q) => q.eq("ticketId", ticketId))
.filter((q) => q.eq(q.field("status"), "ENDED"))
.collect()
.then((sessions) =>
sessions.reduce(
(latest, current) =>
!latest || (current.endedAt ?? 0) > (latest.endedAt ?? 0) ? current : latest,
null as typeof sessions[number] | null
)
)
const cutoff = lastEndedSession?.endedAt ?? 0
const machineUserIds = [
machine.assignedUserId,
...(machine.linkedUserIds ?? []),
ticket.requesterId,
]
.filter(Boolean)
.map((id) => id!.toString())
const unreadByMachine = await ctx.db
.query("ticketChatMessages")
.withIndex("by_ticket_created", (q) => q.eq("ticketId", ticketId))
.collect()
.then((messages) =>
messages.filter((msg) => {
if (msg.createdAt <= cutoff) return false
return !machineUserIds.includes(msg.authorId.toString())
}).length
)
// Criar nova sessao
const sessionId = await ctx.db.insert("liveChatSessions", {
tenantId: ticket.tenantId,
@ -117,7 +153,7 @@ export const startSession = mutation({
status: "ACTIVE",
startedAt: now,
lastActivityAt: now,
unreadByMachine: 0,
unreadByMachine,
unreadByAgent: 0,
})