diff --git a/src/routes/admin/projects.ts b/src/routes/admin/projects.ts index d75056c..9f68dc4 100644 --- a/src/routes/admin/projects.ts +++ b/src/routes/admin/projects.ts @@ -6,11 +6,14 @@ import { parsePagination, buildPaginationMeta } from "../../utils/pagination"; import { parseBody } from "../../schemas/common"; import { UpdateProjectSchema, + CreateProjectSchema, CreateProjectNoteSchema, } from "../../schemas/projects.schema"; import { listProjects, getProject, + createProject, + getNextProjectNumber, updateProject, deleteProject, createProjectNote, @@ -46,6 +49,40 @@ export default async function projectsRoutes( }, ); + // GET /api/admin/projects/next-number — preview the next shared number + fastify.get( + "/next-number", + { preHandler: requirePermission("projects.create") }, + async (_request, reply) => { + const number = await getNextProjectNumber(); + return success(reply, { number, next_number: number }); + }, + ); + + // POST /api/admin/projects — create a standalone (manual) project + fastify.post( + "/", + { preHandler: requirePermission("projects.create") }, + async (request, reply) => { + const parsed = parseBody(CreateProjectSchema, request.body); + if ("error" in parsed) return error(reply, parsed.error, 400); + + const result = await createProject(parsed.data); + if ("error" in result) + return error(reply, result.error, (result as any).status ?? 400); + + await logAudit({ + request, + authData: request.authData, + action: "create", + entityType: "project", + entityId: result.id, + description: `Vytvořen projekt ${result.project_number}`, + }); + return success(reply, { id: result.id }, 201, "Projekt byl vytvořen"); + }, + ); + fastify.get<{ Params: { id: string } }>( "/:id", { preHandler: requirePermission("projects.view") },