51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
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 })
|
|
}
|
|
}
|