This commit is contained in:
2026-03-18 12:05:28 -05:00
parent f12744f05d
commit 69dfec98ad
16 changed files with 245 additions and 18 deletions

View File

@@ -14,6 +14,7 @@ import {
listProjectQuoteOptions,
listProjectShipmentOptions,
updateProject,
updateProjectMilestoneStatus,
} from "./service.js";
const projectSchema = z.object({
@@ -51,6 +52,10 @@ const projectOptionQuerySchema = z.object({
customerId: z.string().optional(),
});
const milestoneStatusSchema = z.object({
status: z.enum(projectMilestoneStatuses),
});
function getRouteParam(value: unknown) {
return typeof value === "string" ? value : null;
}
@@ -147,3 +152,23 @@ projectsRouter.put("/:projectId", requirePermissions([permissions.projectsWrite]
return ok(response, result.project);
});
projectsRouter.patch("/:projectId/milestones/:milestoneId/status", requirePermissions([permissions.projectsWrite]), async (request, response) => {
const projectId = getRouteParam(request.params.projectId);
const milestoneId = getRouteParam(request.params.milestoneId);
if (!projectId || !milestoneId) {
return fail(response, 400, "INVALID_INPUT", "Project or milestone id is invalid.");
}
const parsed = milestoneStatusSchema.safeParse(request.body);
if (!parsed.success) {
return fail(response, 400, "INVALID_INPUT", "Project milestone status payload is invalid.");
}
const result = await updateProjectMilestoneStatus(projectId, milestoneId, parsed.data, request.authUser?.id);
if (!result.ok) {
return fail(response, 400, "INVALID_INPUT", result.reason);
}
return ok(response, result.project);
});