feat(tickets): preserve requester/assignee/company snapshots + timeline fallbacks; chore: add requester index\n\n- Add requesterSnapshot, assigneeSnapshot, companySnapshot to tickets\n- Use snapshots as fallback in list/get/play\n- Update snapshots on assignee changes/startWork\n- Preserve snapshots before deleting users/companies\n- Add index tickets.by_tenant_requester\n- Add migrations.backfillTicketSnapshots\n\nchore(convex): upgrade to ^1.28.0 and run codegen\nchore(next): upgrade Next.js to 15.5.6 and update React/eslint-config-next\nfix: remove any and lint warnings; tighten types across API routes and components\ndocs: add docs/ticket-snapshots.md

This commit is contained in:
Esdras Renan 2025-10-20 10:13:37 -03:00
parent 0d82162a0e
commit 216feca971
16 changed files with 884 additions and 552 deletions

View file

@ -102,6 +102,28 @@ export const removeBySlug = mutation({
return { removed: false }
}
// Preserve company snapshot on related tickets before deletion
const relatedTickets = await ctx.db
.query("tickets")
.withIndex("by_tenant_company", (q) => q.eq("tenantId", tenantId).eq("companyId", existing._id))
.collect()
if (relatedTickets.length > 0) {
const companySnapshot = {
name: existing.name,
slug: existing.slug,
isAvulso: existing.isAvulso ?? undefined,
}
for (const t of relatedTickets) {
const needsPatch = !t.companySnapshot ||
t.companySnapshot.name !== companySnapshot.name ||
t.companySnapshot.slug !== companySnapshot.slug ||
Boolean(t.companySnapshot.isAvulso ?? false) !== Boolean(companySnapshot.isAvulso ?? false)
if (needsPatch) {
await ctx.db.patch(t._id, { companySnapshot })
}
}
}
await ctx.db.delete(existing._id)
return { removed: true }
},