Files

96 lines
2.5 KiB
TypeScript
Raw Permalink Normal View History

2026-06-27 17:08:38 +02:00
import { NextResponse } from "next/server";
import { handleDatabases } from "@/features/agents/utils/status/status.helpers";
import { Body } from "@/features/agents/types";
2025-07-16 18:15:28 +02:00
import * as drizzleDb from "@/db";
2026-06-27 17:08:38 +02:00
import { db } from "@/db";
import { and, eq } from "drizzle-orm";
import { withUpdatedAt } from "@/db/utils";
import { logger } from "@/lib/logger";
import { isUUID } from "@/utils/text";
2026-06-27 17:08:38 +02:00
const log = logger.child({ module: "api/agent/status/route" });
export async function POST(
2026-06-27 17:08:38 +02:00
request: Request,
{ params }: { params: Promise<{ agentId: string }> },
2024-11-11 18:50:42 +01:00
) {
2026-06-27 17:08:38 +02:00
try {
const agentId = (await params).agentId;
log.debug(`Agent ID: ${agentId}`);
const body: Body = await request.json();
const lastContact = new Date();
let message: string;
2025-09-26 09:04:18 +02:00
2026-06-27 17:08:38 +02:00
if (!isUUID(agentId)) {
message = "agentId is not a valid uuid";
log.error({ error: message }, "An error occurred");
return NextResponse.json(
{ error: "agentId is not a valid uuid" },
{ status: 500 },
);
2024-11-11 18:50:42 +01:00
}
2026-06-27 17:08:38 +02:00
const agent = await db.query.agent.findFirst({
where: and(
eq(drizzleDb.schemas.agent.id, agentId),
eq(drizzleDb.schemas.agent.isArchived, false),
),
});
if (!agent) {
message = "Agent not found";
return NextResponse.json({ error: message }, { status: 404 });
}
const [settings] = await db
.select()
.from(drizzleDb.schemas.setting)
.where(eq(drizzleDb.schemas.setting.name, "system"))
.limit(1);
if (!settings) {
2026-07-11 10:04:12 +02:00
return NextResponse.json({ error: "An error occurred" }, { status: 404 });
2026-06-27 17:08:38 +02:00
}
const databasesResponse = await handleDatabases(
body,
agent,
lastContact,
settings,
);
await db
.update(drizzleDb.schemas.agent)
.set(
withUpdatedAt({
version: body.version,
lastContact: lastContact,
healthErrorCount: null,
}),
)
.where(eq(drizzleDb.schemas.agent.id, agentId));
await db.insert(drizzleDb.schemas.healthcheckLog).values({
kind: "agent",
status: "success",
objectId: agentId,
date: lastContact,
});
const response = {
agent: {
id: agentId,
lastContact: lastContact,
},
databases: databasesResponse,
};
return Response.json(response);
} catch (error) {
log.error({ error: error }, "Error in POST handler");
return NextResponse.json(
{ error: "Internal server error" },
{ status: 500 },
);
}
}