mirror of
https://github.com/Portabase/portabase.git
synced 2026-07-14 11:16:13 +02:00
feat: register agent routes in OpenAPI spec
This commit is contained in:
@@ -0,0 +1,197 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
import { OpenAPIRegistry } from "@asteasolutions/zod-to-openapi";
|
||||||
|
import "@/lib/api-v1/openapi/registry";
|
||||||
|
|
||||||
|
const AgentSchema = z
|
||||||
|
.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
slug: z.string(),
|
||||||
|
version: z.string().nullable(),
|
||||||
|
name: z.string(),
|
||||||
|
healthErrorCount: z.number().int().nullable(),
|
||||||
|
description: z.string(),
|
||||||
|
isArchived: z.boolean().nullable(),
|
||||||
|
lastContact: z.string().datetime().nullable(),
|
||||||
|
organizationId: z.string().uuid().nullable(),
|
||||||
|
createdAt: z.string().datetime(),
|
||||||
|
updatedAt: z.string().datetime().nullable(),
|
||||||
|
deletedAt: z.string().datetime().nullable(),
|
||||||
|
})
|
||||||
|
.openapi("Agent");
|
||||||
|
|
||||||
|
const UuidParam = z
|
||||||
|
.string()
|
||||||
|
.uuid()
|
||||||
|
.openapi({ example: "123e4567-e89b-12d3-a456-426614174000" });
|
||||||
|
|
||||||
|
const security = [{ apiKeyAuth: [] }];
|
||||||
|
|
||||||
|
const ErrorSchema = z.object({ error: z.string() });
|
||||||
|
|
||||||
|
export function registerAgentRoutes(registry: OpenAPIRegistry) {
|
||||||
|
registry.register("Agent", AgentSchema);
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "get",
|
||||||
|
path: "/agents",
|
||||||
|
summary: "List agents",
|
||||||
|
security,
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
description: "List of accessible agents",
|
||||||
|
content: {
|
||||||
|
"application/json": {
|
||||||
|
schema: z.object({ data: z.array(AgentSchema) }),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
401: {
|
||||||
|
description: "Missing or invalid API key",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
500: {
|
||||||
|
description: "Internal server error",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "post",
|
||||||
|
path: "/agents",
|
||||||
|
summary: "Create an agent",
|
||||||
|
security,
|
||||||
|
request: {
|
||||||
|
body: {
|
||||||
|
required: true,
|
||||||
|
content: {
|
||||||
|
"application/json": {
|
||||||
|
schema: z.object({
|
||||||
|
name: z.string().min(1).openapi({ example: "my-agent" }),
|
||||||
|
organizationId: z.string().uuid().optional(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responses: {
|
||||||
|
201: {
|
||||||
|
description: "Agent created",
|
||||||
|
content: {
|
||||||
|
"application/json": { schema: z.object({ data: AgentSchema }) },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
400: {
|
||||||
|
description: "Bad request",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
401: {
|
||||||
|
description: "Missing or invalid API key",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
403: {
|
||||||
|
description: "Forbidden — organization not accessible",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
422: {
|
||||||
|
description: "Invalid request body",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
500: {
|
||||||
|
description: "Internal server error",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "get",
|
||||||
|
path: "/agents/{id}",
|
||||||
|
summary: "Get agent by ID",
|
||||||
|
security,
|
||||||
|
request: { params: z.object({ id: UuidParam }) },
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
description: "Agent details",
|
||||||
|
content: {
|
||||||
|
"application/json": { schema: z.object({ data: AgentSchema }) },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
401: {
|
||||||
|
description: "Missing or invalid API key",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
403: {
|
||||||
|
description: "Forbidden",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
404: {
|
||||||
|
description: "Agent not found",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
500: {
|
||||||
|
description: "Internal server error",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "delete",
|
||||||
|
path: "/agents/{id}",
|
||||||
|
summary: "Delete agent",
|
||||||
|
security,
|
||||||
|
request: { params: z.object({ id: UuidParam }) },
|
||||||
|
responses: {
|
||||||
|
204: { description: "Agent deleted" },
|
||||||
|
401: {
|
||||||
|
description: "Missing or invalid API key",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
403: {
|
||||||
|
description: "Forbidden",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
404: {
|
||||||
|
description: "Agent not found",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
500: {
|
||||||
|
description: "Internal server error",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "get",
|
||||||
|
path: "/agents/{id}/key",
|
||||||
|
summary: "Get agent edge key",
|
||||||
|
security,
|
||||||
|
request: { params: z.object({ id: UuidParam }) },
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
description: "Agent edge key string",
|
||||||
|
content: {
|
||||||
|
"application/json": { schema: z.object({ data: z.string() }) },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
401: {
|
||||||
|
description: "Missing or invalid API key",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
403: {
|
||||||
|
description: "Forbidden",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
404: {
|
||||||
|
description: "Agent not found",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
500: {
|
||||||
|
description: "Internal server error",
|
||||||
|
content: { "application/json": { schema: ErrorSchema } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user