import { NextResponse } from "next/server" import { z } from "zod" import { ConvexHttpClient } from "convex/browser" import { api } from "@/convex/_generated/api" import { env } from "@/lib/env" const heartbeatSchema = z.object({ machineToken: z.string().min(1), status: z.string().optional(), hostname: z.string().optional(), os: z .object({ name: z.string(), version: z.string().optional(), architecture: z.string().optional(), }) .optional(), metrics: z.record(z.string(), z.unknown()).optional(), inventory: z.record(z.string(), z.unknown()).optional(), metadata: z.record(z.string(), z.unknown()).optional(), }) export async function POST(request: Request) { if (request.method !== "POST") { return NextResponse.json({ error: "Método não permitido" }, { status: 405 }) } const convexUrl = env.NEXT_PUBLIC_CONVEX_URL if (!convexUrl) { return NextResponse.json({ error: "Convex não configurado" }, { status: 500 }) } let payload try { const raw = await request.json() payload = heartbeatSchema.parse(raw) } catch (error) { return NextResponse.json({ error: "Payload inválido", details: error instanceof Error ? error.message : String(error) }, { status: 400 }) } const client = new ConvexHttpClient(convexUrl) try { const response = await client.mutation(api.machines.heartbeat, payload) return NextResponse.json(response) } catch (error) { console.error("[machines.heartbeat] Falha ao registrar heartbeat", error) return NextResponse.json({ error: "Falha ao registrar heartbeat" }, { status: 500 }) } }