From f60a48e7b3d2cd019d35dfcca240488526786b45 Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Thu, 16 Oct 2025 17:29:08 -0300 Subject: [PATCH] =?UTF-8?q?admin/companies:=20melhorar=20cria=C3=A7=C3=A3o?= =?UTF-8?q?/edi=C3=A7=C3=A3o\n\n-=20Aceita=20isAvulso=20e=20contractedHour?= =?UTF-8?q?sPerMonth=20no=20POST\n-=20Retorna=20409=20para=20duplicidade?= =?UTF-8?q?=20(slug/provisioningCode)\n-=20Retorna=20409=20para=20duplicid?= =?UTF-8?q?ade=20no=20PATCH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/admin/companies/[id]/route.ts | 3 +++ src/app/api/admin/companies/route.ts | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/app/api/admin/companies/[id]/route.ts b/src/app/api/admin/companies/[id]/route.ts index 57d2420..7357065 100644 --- a/src/app/api/admin/companies/[id]/route.ts +++ b/src/app/api/admin/companies/[id]/route.ts @@ -48,6 +48,9 @@ export async function PATCH(request: Request, { params }: { params: Promise<{ id return NextResponse.json({ company }) } catch (error) { console.error("Failed to update company", error) + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2002") { + return NextResponse.json({ error: "Já existe uma empresa com este slug." }, { status: 409 }) + } return NextResponse.json({ error: "Falha ao atualizar empresa" }, { status: 500 }) } } diff --git a/src/app/api/admin/companies/route.ts b/src/app/api/admin/companies/route.ts index ec35306..d34d617 100644 --- a/src/app/api/admin/companies/route.ts +++ b/src/app/api/admin/companies/route.ts @@ -2,6 +2,7 @@ import { NextResponse } from "next/server" import { randomBytes } from "crypto" import { prisma } from "@/lib/prisma" +import { Prisma } from "@prisma/client" import { assertStaffSession } from "@/lib/auth-server" import { isAdmin } from "@/lib/authz" @@ -27,13 +28,15 @@ export async function POST(request: Request) { const body = (await request.json()) as Partial<{ name: string slug: string + isAvulso: boolean + contractedHoursPerMonth: number | string | null cnpj: string | null domain: string | null phone: string | null description: string | null address: string | null }> - const { name, slug, cnpj, domain, phone, description, address } = body ?? {} + const { name, slug, isAvulso, contractedHoursPerMonth, cnpj, domain, phone, description, address } = body ?? {} if (!name || !slug) { return NextResponse.json({ error: "Nome e slug são obrigatórios" }, { status: 400 }) } @@ -46,7 +49,14 @@ export async function POST(request: Request) { name: String(name), slug: String(slug), provisioningCode, - // Campos opcionais (isAvulso, contractedHoursPerMonth) podem ser definidos via PATCH posteriormente. + // Campos opcionais + isAvulso: Boolean(isAvulso ?? false), + contractedHoursPerMonth: + typeof contractedHoursPerMonth === "number" + ? contractedHoursPerMonth + : contractedHoursPerMonth + ? Number(contractedHoursPerMonth) + : null, cnpj: cnpj ? String(cnpj) : null, domain: domain ? String(domain) : null, phone: phone ? String(phone) : null, @@ -57,6 +67,13 @@ export async function POST(request: Request) { return NextResponse.json({ company }) } catch (error) { console.error("Failed to create company", error) + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2002") { + // Duplicidade de slug por tenant ou provisioningCode único + return NextResponse.json( + { error: "Já existe uma empresa com este slug ou código de provisionamento." }, + { status: 409 } + ) + } return NextResponse.json({ error: "Falha ao criar empresa" }, { status: 500 }) } }