import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi'; import type { Bindings } from '../types'; import { getPendingAliases, confirmPendingAlias, rejectPendingAlias, } from '../actions/entity-pending'; import { listTripletEntities } from '../actions/triplet-entities'; import { makeKbdbClient } from '../lib/kbdb-client'; const entityRoutes = new OpenAPIHono<{ Bindings: Bindings }>(); // GET / (列出 entities) const listEntitiesRoute = createRoute({ method: 'get', path: '/', request: { query: z.object({ limit: z.string().optional(), offset: z.string().optional(), q: z.string().optional(), }), }, responses: { 200: { description: 'List of entities' }, }, tags: ['Entities'], }); entityRoutes.openapi(listEntitiesRoute, async (c) => { const limit = parseInt(c.req.query('limit') || '100'); const offset = parseInt(c.req.query('offset') || '0'); const q = c.req.query('q') || ''; const result = await listTripletEntities(makeKbdbClient(c.env), { limit, offset, q: q || undefined }); return c.json(result); }); // GET /pending (列出待確認) const listPendingRoute = createRoute({ method: 'get', path: '/pending', responses: { 200: { description: 'List of pending aliases' }, }, tags: ['Entities'], }); entityRoutes.openapi(listPendingRoute, async (c) => { const limit = parseInt(c.req.query('limit') || '100'); const pending = await getPendingAliases(makeKbdbClient(c.env), limit); return c.json(pending); }); entityRoutes.post('/pending/:id/confirm', async (c) => { const id = c.req.param('id'); await confirmPendingAlias(makeKbdbClient(c.env), id); return c.json({ success: true, action: 'confirmed', id }); }); entityRoutes.post('/pending/:id/reject', async (c) => { const id = c.req.param('id'); const newEntity = await rejectPendingAlias(makeKbdbClient(c.env), id); return c.json({ success: true, action: 'rejected', newEntity }); }); export { entityRoutes };