feat: overhaul admin user management and desktop UX

This commit is contained in:
Esdras Renan 2025-10-13 10:36:38 -03:00
parent 7d6f3bea01
commit ecad81b0ea
16 changed files with 1546 additions and 395 deletions

View file

@ -7,6 +7,7 @@ import { env } from "@/lib/env"
import { DEFAULT_TENANT_ID } from "@/lib/constants"
import { ensureMachineAccount } from "@/server/machines-auth"
import { createCorsPreflight, jsonWithCors } from "@/server/cors"
import { normalizeSlug } from "@/lib/slug"
const registerSchema = z
.object({
@ -27,7 +28,7 @@ const registerSchema = z
collaborator: z
.object({
email: z.string().email(),
name: z.string().optional(),
name: z.string().min(1, "Informe o nome do colaborador/gestor"),
})
.optional(),
})
@ -66,11 +67,13 @@ export async function POST(request: Request) {
}
const client = new ConvexHttpClient(convexUrl)
let normalizedCompanySlug: string | undefined
try {
const tenantId = payload.tenantId ?? DEFAULT_TENANT_ID
const persona = payload.accessRole ?? undefined
const collaborator = payload.collaborator ?? null
normalizedCompanySlug = normalizeSlug(payload.companySlug)
if (persona && !collaborator) {
return jsonWithCors(
@ -99,7 +102,7 @@ export async function POST(request: Request) {
const registration = await client.mutation(api.machines.register, {
provisioningSecret: payload.provisioningSecret,
tenantId,
companySlug: payload.companySlug ?? undefined,
companySlug: normalizedCompanySlug,
hostname: payload.hostname,
os: payload.os,
macAddresses: payload.macAddresses,
@ -179,6 +182,10 @@ export async function POST(request: Request) {
const isInvalidSecret = msg.includes("código de provisionamento inválido")
const isConvexError = msg.includes("convexerror")
const status = isCompanyNotFound ? 404 : isInvalidSecret ? 401 : isConvexError ? 400 : 500
return jsonWithCors({ error: "Falha ao provisionar máquina", details }, status, request.headers.get("origin"), CORS_METHODS)
const payload = { error: "Falha ao provisionar máquina", details } as Record<string, unknown>
if (isCompanyNotFound && normalizedCompanySlug) {
payload["companySlug"] = normalizedCompanySlug
}
return jsonWithCors(payload, status, request.headers.get("origin"), CORS_METHODS)
}
}