sistema-de-chamados/src/app/api/admin/companies/[id]/route.ts
2025-10-13 15:23:53 -03:00

82 lines
3.2 KiB
TypeScript

import { NextResponse } from "next/server"
import { Prisma } from "@prisma/client"
import { prisma } from "@/lib/prisma"
import { assertAdminSession } from "@/lib/auth-server"
export const runtime = "nodejs"
export async function PATCH(request: Request, { params }: { params: Promise<{ id: string }> }) {
const session = await assertAdminSession()
if (!session) return NextResponse.json({ error: "Não autorizado" }, { status: 401 })
const { id } = await params
const raw = (await request.json()) as Partial<{
name: string
slug: string
cnpj: string | null
domain: string | null
phone: string | null
description: string | null
address: string | null
isAvulso: boolean
contractedHoursPerMonth: number | string | null
}>
const updates: Record<string, unknown> = {}
if (typeof raw.name === "string" && raw.name.trim()) updates.name = raw.name.trim()
if (typeof raw.slug === "string" && raw.slug.trim()) updates.slug = raw.slug.trim()
if ("cnpj" in raw) updates.cnpj = raw.cnpj ?? null
if ("domain" in raw) updates.domain = raw.domain ?? null
if ("phone" in raw) updates.phone = raw.phone ?? null
if ("description" in raw) updates.description = raw.description ?? null
if ("address" in raw) updates.address = raw.address ?? null
if ("isAvulso" in raw) updates.isAvulso = Boolean(raw.isAvulso)
if ("contractedHoursPerMonth" in raw) {
const v = raw.contractedHoursPerMonth
updates.contractedHoursPerMonth = typeof v === "number" ? v : v ? Number(v) : null
}
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 })
return NextResponse.json({ company })
} catch (error) {
console.error("Failed to update company", error)
return NextResponse.json({ error: "Falha ao atualizar empresa" }, { status: 500 })
}
}
export async function DELETE(_: Request, { params }: { params: Promise<{ id: string }> }) {
const session = await assertAdminSession()
if (!session) return NextResponse.json({ error: "Não autorizado" }, { status: 401 })
const { id } = await params
const company = await prisma.company.findUnique({
where: { id },
select: { id: true, tenantId: true, name: true },
})
if (!company) {
return NextResponse.json({ error: "Empresa não encontrada" }, { status: 404 })
}
if (company.tenantId !== (session.user.tenantId ?? company.tenantId)) {
return NextResponse.json({ error: "Acesso negado" }, { status: 403 })
}
try {
await prisma.company.delete({ where: { id: company.id } })
return NextResponse.json({ ok: true })
} catch (error) {
if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2003") {
return NextResponse.json(
{ error: "Não é possível remover esta empresa pois existem registros vinculados." },
{ status: 409 }
)
}
console.error("Failed to delete company", error)
return NextResponse.json({ error: "Falha ao excluir empresa" }, { status: 500 })
}
}