feat: add users and templates routes, enhance existing API routes

New routes:
- GET /users — list all users
- GET/POST /templates — list and create templates
- PATCH /templates/:id — update template
- POST /templates/preview — render template with ticket/demo context

Enhanced routes:
- tickets: custom field support on create, status classification helper
- custom-fields: PATCH endpoint, auto-generate short key from name
- lifecycles: PATCH endpoint
- queues: PATCH endpoint

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Gjermund Høsøien Wiggen
2026-06-09 10:43:08 +02:00
parent e960df61ad
commit 54ef6fcc5b
6 changed files with 675 additions and 28 deletions

View File

@@ -2,7 +2,7 @@ import { Hono } from 'hono';
import { HTTPException } from 'hono/http-exception';
import type { Db } from '../db/index.ts';
import { lifecycles } from '../db/schema.ts';
import { asc } from 'drizzle-orm';
import { asc, eq } from 'drizzle-orm';
export function createLifecyclesRouter(db: Db): Hono {
const router = new Hono();
@@ -34,5 +34,29 @@ export function createLifecyclesRouter(db: Db): Hono {
return c.json(lifecycle, 201);
});
router.patch('/:id', async (c) => {
const id = c.req.param('id');
const body = await c.req.json();
const existing = await db.query.lifecycles.findFirst({
where: eq(lifecycles.id, id),
});
if (!existing) {
throw new HTTPException(404, { message: 'Lifecycle not found' });
}
const updateData: Partial<typeof lifecycles.$inferInsert> = {};
if (body.name !== undefined) updateData.name = String(body.name);
if (body.definition !== undefined) updateData.definition = body.definition;
const [updated] = await db.update(lifecycles)
.set(updateData)
.where(eq(lifecycles.id, id))
.returning();
return c.json(updated);
});
return router;
}