From 32488d48caeb15debd3fb414de3839ecdd220ecb Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Mon, 13 Oct 2025 22:01:33 -0300 Subject: [PATCH] =?UTF-8?q?Ajusta=20sess=C3=A3o=20de=20m=C3=A1quina=20para?= =?UTF-8?q?=20vincular=20colaborador=20do=20metadata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/machines/session/route.ts | 90 ++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 14 deletions(-) diff --git a/src/app/api/machines/session/route.ts b/src/app/api/machines/session/route.ts index d2cb7c0..9be66dd 100644 --- a/src/app/api/machines/session/route.ts +++ b/src/app/api/machines/session/route.ts @@ -10,6 +10,12 @@ import { DEFAULT_TENANT_ID } from "@/lib/constants" const MACHINE_CTX_COOKIE = "machine_ctx" +type CollaboratorMetadata = { + email: string + name: string | null + role: "collaborator" | "manager" | null +} + function decodeMachineCookie(value: string) { try { const json = Buffer.from(value, "base64url").toString("utf8") @@ -37,6 +43,44 @@ function encodeMachineCookie(payload: { return Buffer.from(JSON.stringify(payload)).toString("base64url") } +function extractCollaboratorFromMetadata(metadata: unknown): CollaboratorMetadata | null { + if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) { + return null + } + const record = metadata as Record + const raw = record["collaborator"] + if (!raw || typeof raw !== "object" || Array.isArray(raw)) { + return null + } + const base = raw as Record + const emailValue = base["email"] + if (typeof emailValue !== "string") { + return null + } + const email = emailValue.trim().toLowerCase() + if (!email) { + return null + } + + const nameValue = base["name"] + const roleValue = base["role"] + const name = typeof nameValue === "string" ? (nameValue.trim() || null) : null + const normalizedRole = + typeof roleValue === "string" ? roleValue.trim().toLowerCase() : null + const role = + normalizedRole === "manager" + ? "manager" + : normalizedRole === "collaborator" + ? "collaborator" + : null + + return { + email, + name, + role, + } +} + export async function GET(request: NextRequest) { const session = await assertAuthenticatedSession() if (!session || session.user?.role !== "machine") { @@ -89,19 +133,27 @@ export async function GET(request: NextRequest) { authEmail: string | null } - let ensuredAssignedUserId = context.assignedUserId - let ensuredAssignedUserName = context.assignedUserName - let ensuredAssignedUserRole = context.assignedUserRole + const metadataCollaborator = extractCollaboratorFromMetadata(context.metadata) - if (!ensuredAssignedUserId && context.assignedUserEmail) { + let ensuredAssignedUserId = context.assignedUserId + let ensuredAssignedUserEmail = context.assignedUserEmail ?? metadataCollaborator?.email ?? null + let ensuredAssignedUserName = context.assignedUserName ?? metadataCollaborator?.name ?? null + let ensuredAssignedUserRole = + context.assignedUserRole ?? + (metadataCollaborator?.role ? metadataCollaborator.role.toUpperCase() : null) + let ensuredPersona = context.persona ?? metadataCollaborator?.role ?? null + + if (!ensuredAssignedUserId && ensuredAssignedUserEmail) { try { - const personaRole = (context.persona ?? context.assignedUserRole ?? "collaborator").toString().toLowerCase() - const normalizedPersona = personaRole && typeof personaRole === "string" ? personaRole : "collaborator" + const personaRoleCandidate = ensuredPersona ?? ensuredAssignedUserRole ?? "collaborator" + const personaRole = personaRoleCandidate.toString().toLowerCase() + const normalizedPersona = personaRole === "manager" ? "manager" : "collaborator" + const assignedRole = normalizedPersona === "manager" ? "MANAGER" : "COLLABORATOR" const ensuredUser = (await client.mutation(api.users.ensureUser, { tenantId: context.tenantId ?? DEFAULT_TENANT_ID, - email: context.assignedUserEmail, - name: context.assignedUserName ?? context.assignedUserEmail, + email: ensuredAssignedUserEmail, + name: ensuredAssignedUserName ?? ensuredAssignedUserEmail, role: normalizedPersona.toUpperCase(), companyId: context.companyId ? (context.companyId as Id<"companies">) : undefined, })) as { @@ -112,16 +164,17 @@ export async function GET(request: NextRequest) { if (ensuredUser?._id) { ensuredAssignedUserId = ensuredUser._id as string - ensuredAssignedUserName = ensuredUser.name ?? context.assignedUserName - ensuredAssignedUserRole = ensuredUser.role ?? context.assignedUserRole + ensuredAssignedUserName = ensuredUser.name ?? ensuredAssignedUserName ?? ensuredAssignedUserEmail + ensuredAssignedUserRole = ensuredUser.role ?? ensuredAssignedUserRole ?? assignedRole + ensuredPersona = normalizedPersona await client.mutation(api.machines.updatePersona, { machineId: machineId as Id<"machines">, persona: normalizedPersona, assignedUserId: ensuredUser._id as Id<"users">, - assignedUserEmail: context.assignedUserEmail, + assignedUserEmail: ensuredAssignedUserEmail, assignedUserName: ensuredAssignedUserName ?? undefined, - assignedUserRole: (ensuredAssignedUserRole ?? context.persona ?? "collaborator").toUpperCase(), + assignedUserRole: (ensuredAssignedUserRole ?? assignedRole).toUpperCase(), }) context = (await client.query(api.machines.getContext, { @@ -129,19 +182,26 @@ export async function GET(request: NextRequest) { })) as typeof context ensuredAssignedUserId = context.assignedUserId ?? ensuredAssignedUserId + ensuredAssignedUserEmail = context.assignedUserEmail ?? ensuredAssignedUserEmail ensuredAssignedUserName = context.assignedUserName ?? ensuredAssignedUserName ensuredAssignedUserRole = context.assignedUserRole ?? ensuredAssignedUserRole + ensuredPersona = context.persona ?? ensuredPersona } } catch (error) { console.error("[machines.session] Falha ao garantir usuário vinculado", error) } } + const resolvedPersona = + context.persona ?? + ensuredPersona ?? + (ensuredAssignedUserRole ? ensuredAssignedUserRole.toLowerCase() : null) + const responsePayload = { machineId: context.id, - persona: context.persona ?? (ensuredAssignedUserRole ? ensuredAssignedUserRole.toLowerCase() : null), + persona: resolvedPersona, assignedUserId: ensuredAssignedUserId, - assignedUserEmail: context.assignedUserEmail, + assignedUserEmail: ensuredAssignedUserEmail, assignedUserName: ensuredAssignedUserName, assignedUserRole: ensuredAssignedUserRole, } @@ -149,6 +209,8 @@ export async function GET(request: NextRequest) { const response = NextResponse.json({ machine: { ...context, + persona: resolvedPersona, + assignedUserEmail: ensuredAssignedUserEmail ?? null, assignedUserId: ensuredAssignedUserId ?? null, assignedUserName: ensuredAssignedUserName ?? null, assignedUserRole: ensuredAssignedUserRole ?? null,