Ajusta sessão de máquina para vincular colaborador do metadata
This commit is contained in:
parent
ecbd32e735
commit
32488d48ca
1 changed files with 76 additions and 14 deletions
|
|
@ -10,6 +10,12 @@ import { DEFAULT_TENANT_ID } from "@/lib/constants"
|
||||||
|
|
||||||
const MACHINE_CTX_COOKIE = "machine_ctx"
|
const MACHINE_CTX_COOKIE = "machine_ctx"
|
||||||
|
|
||||||
|
type CollaboratorMetadata = {
|
||||||
|
email: string
|
||||||
|
name: string | null
|
||||||
|
role: "collaborator" | "manager" | null
|
||||||
|
}
|
||||||
|
|
||||||
function decodeMachineCookie(value: string) {
|
function decodeMachineCookie(value: string) {
|
||||||
try {
|
try {
|
||||||
const json = Buffer.from(value, "base64url").toString("utf8")
|
const json = Buffer.from(value, "base64url").toString("utf8")
|
||||||
|
|
@ -37,6 +43,44 @@ function encodeMachineCookie(payload: {
|
||||||
return Buffer.from(JSON.stringify(payload)).toString("base64url")
|
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<string, unknown>
|
||||||
|
const raw = record["collaborator"]
|
||||||
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const base = raw as Record<string, unknown>
|
||||||
|
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) {
|
export async function GET(request: NextRequest) {
|
||||||
const session = await assertAuthenticatedSession()
|
const session = await assertAuthenticatedSession()
|
||||||
if (!session || session.user?.role !== "machine") {
|
if (!session || session.user?.role !== "machine") {
|
||||||
|
|
@ -89,19 +133,27 @@ export async function GET(request: NextRequest) {
|
||||||
authEmail: string | null
|
authEmail: string | null
|
||||||
}
|
}
|
||||||
|
|
||||||
let ensuredAssignedUserId = context.assignedUserId
|
const metadataCollaborator = extractCollaboratorFromMetadata(context.metadata)
|
||||||
let ensuredAssignedUserName = context.assignedUserName
|
|
||||||
let ensuredAssignedUserRole = context.assignedUserRole
|
|
||||||
|
|
||||||
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 {
|
try {
|
||||||
const personaRole = (context.persona ?? context.assignedUserRole ?? "collaborator").toString().toLowerCase()
|
const personaRoleCandidate = ensuredPersona ?? ensuredAssignedUserRole ?? "collaborator"
|
||||||
const normalizedPersona = personaRole && typeof personaRole === "string" ? personaRole : "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, {
|
const ensuredUser = (await client.mutation(api.users.ensureUser, {
|
||||||
tenantId: context.tenantId ?? DEFAULT_TENANT_ID,
|
tenantId: context.tenantId ?? DEFAULT_TENANT_ID,
|
||||||
email: context.assignedUserEmail,
|
email: ensuredAssignedUserEmail,
|
||||||
name: context.assignedUserName ?? context.assignedUserEmail,
|
name: ensuredAssignedUserName ?? ensuredAssignedUserEmail,
|
||||||
role: normalizedPersona.toUpperCase(),
|
role: normalizedPersona.toUpperCase(),
|
||||||
companyId: context.companyId ? (context.companyId as Id<"companies">) : undefined,
|
companyId: context.companyId ? (context.companyId as Id<"companies">) : undefined,
|
||||||
})) as {
|
})) as {
|
||||||
|
|
@ -112,16 +164,17 @@ export async function GET(request: NextRequest) {
|
||||||
|
|
||||||
if (ensuredUser?._id) {
|
if (ensuredUser?._id) {
|
||||||
ensuredAssignedUserId = ensuredUser._id as string
|
ensuredAssignedUserId = ensuredUser._id as string
|
||||||
ensuredAssignedUserName = ensuredUser.name ?? context.assignedUserName
|
ensuredAssignedUserName = ensuredUser.name ?? ensuredAssignedUserName ?? ensuredAssignedUserEmail
|
||||||
ensuredAssignedUserRole = ensuredUser.role ?? context.assignedUserRole
|
ensuredAssignedUserRole = ensuredUser.role ?? ensuredAssignedUserRole ?? assignedRole
|
||||||
|
ensuredPersona = normalizedPersona
|
||||||
|
|
||||||
await client.mutation(api.machines.updatePersona, {
|
await client.mutation(api.machines.updatePersona, {
|
||||||
machineId: machineId as Id<"machines">,
|
machineId: machineId as Id<"machines">,
|
||||||
persona: normalizedPersona,
|
persona: normalizedPersona,
|
||||||
assignedUserId: ensuredUser._id as Id<"users">,
|
assignedUserId: ensuredUser._id as Id<"users">,
|
||||||
assignedUserEmail: context.assignedUserEmail,
|
assignedUserEmail: ensuredAssignedUserEmail,
|
||||||
assignedUserName: ensuredAssignedUserName ?? undefined,
|
assignedUserName: ensuredAssignedUserName ?? undefined,
|
||||||
assignedUserRole: (ensuredAssignedUserRole ?? context.persona ?? "collaborator").toUpperCase(),
|
assignedUserRole: (ensuredAssignedUserRole ?? assignedRole).toUpperCase(),
|
||||||
})
|
})
|
||||||
|
|
||||||
context = (await client.query(api.machines.getContext, {
|
context = (await client.query(api.machines.getContext, {
|
||||||
|
|
@ -129,19 +182,26 @@ export async function GET(request: NextRequest) {
|
||||||
})) as typeof context
|
})) as typeof context
|
||||||
|
|
||||||
ensuredAssignedUserId = context.assignedUserId ?? ensuredAssignedUserId
|
ensuredAssignedUserId = context.assignedUserId ?? ensuredAssignedUserId
|
||||||
|
ensuredAssignedUserEmail = context.assignedUserEmail ?? ensuredAssignedUserEmail
|
||||||
ensuredAssignedUserName = context.assignedUserName ?? ensuredAssignedUserName
|
ensuredAssignedUserName = context.assignedUserName ?? ensuredAssignedUserName
|
||||||
ensuredAssignedUserRole = context.assignedUserRole ?? ensuredAssignedUserRole
|
ensuredAssignedUserRole = context.assignedUserRole ?? ensuredAssignedUserRole
|
||||||
|
ensuredPersona = context.persona ?? ensuredPersona
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[machines.session] Falha ao garantir usuário vinculado", error)
|
console.error("[machines.session] Falha ao garantir usuário vinculado", error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const resolvedPersona =
|
||||||
|
context.persona ??
|
||||||
|
ensuredPersona ??
|
||||||
|
(ensuredAssignedUserRole ? ensuredAssignedUserRole.toLowerCase() : null)
|
||||||
|
|
||||||
const responsePayload = {
|
const responsePayload = {
|
||||||
machineId: context.id,
|
machineId: context.id,
|
||||||
persona: context.persona ?? (ensuredAssignedUserRole ? ensuredAssignedUserRole.toLowerCase() : null),
|
persona: resolvedPersona,
|
||||||
assignedUserId: ensuredAssignedUserId,
|
assignedUserId: ensuredAssignedUserId,
|
||||||
assignedUserEmail: context.assignedUserEmail,
|
assignedUserEmail: ensuredAssignedUserEmail,
|
||||||
assignedUserName: ensuredAssignedUserName,
|
assignedUserName: ensuredAssignedUserName,
|
||||||
assignedUserRole: ensuredAssignedUserRole,
|
assignedUserRole: ensuredAssignedUserRole,
|
||||||
}
|
}
|
||||||
|
|
@ -149,6 +209,8 @@ export async function GET(request: NextRequest) {
|
||||||
const response = NextResponse.json({
|
const response = NextResponse.json({
|
||||||
machine: {
|
machine: {
|
||||||
...context,
|
...context,
|
||||||
|
persona: resolvedPersona,
|
||||||
|
assignedUserEmail: ensuredAssignedUserEmail ?? null,
|
||||||
assignedUserId: ensuredAssignedUserId ?? null,
|
assignedUserId: ensuredAssignedUserId ?? null,
|
||||||
assignedUserName: ensuredAssignedUserName ?? null,
|
assignedUserName: ensuredAssignedUserName ?? null,
|
||||||
assignedUserRole: ensuredAssignedUserRole ?? null,
|
assignedUserRole: ensuredAssignedUserRole ?? null,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue