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

@ -42,10 +42,7 @@ export async function PATCH(request: Request, { params }: { params: Promise<{ id
}
try {
// Tipos do Prisma podem estar desatualizados em relação ao schema nessa máquina/ambiente.
// Atualize o client quando possível; por ora liberamos o shape dinamicamente.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const company = await prisma.company.update({ where: { id }, data: updates as any })
const company = await prisma.company.update({ where: { id }, data: updates })
if (company.provisioningCode) {
const synced = await syncConvexCompany({

View file

@ -85,7 +85,7 @@ export async function POST(request: Request) {
)
}
const tenantId = companyRecord.tenantId ?? DEFAULT_TENANT_ID
const tenantId: string = companyRecord.tenantId ?? DEFAULT_TENANT_ID
const persona = payload.accessRole ?? undefined
const collaborator = payload.collaborator ?? null
@ -146,14 +146,14 @@ export async function POST(request: Request) {
let assignedUserId: Id<"users"> | undefined
if (collaborator) {
const ensuredUser = (await client.mutation(api.users.ensureUser, {
const ensuredUser = await client.mutation(api.users.ensureUser, {
tenantId,
email: collaborator.email,
name: collaborator.name ?? collaborator.email,
avatarUrl: undefined,
role: persona?.toUpperCase(),
companyId: registration.companyId ? (registration.companyId as Id<"companies">) : undefined,
})) as { _id?: Id<"users"> } | null
})
await ensureCollaboratorAccount({
email: collaborator.email,