refactor(api): extract timeline project read builders

This commit is contained in:
2026-03-31 15:09:19 +02:00
parent b1ada431e1
commit 4e9e452b94
3 changed files with 332 additions and 49 deletions
@@ -2,7 +2,10 @@ import { TRPCError } from "@trpc/server";
import { describe, expect, it } from "vitest";
import {
buildTimelineProjectAssignmentConflicts,
buildTimelineProjectContextDetailResponse,
buildTimelineProjectContextResponse,
buildTimelineProjectContextSummary,
buildTimelineShiftPreviewDetailResponse,
resolveTimelineProjectContextPeriod,
} from "../router/timeline-project-context-support.js";
@@ -178,4 +181,194 @@ describe("timeline project context support", () => {
],
});
});
it("builds anonymized project context responses and detail summaries", () => {
const directory = {
config: { enabled: true, mode: "alias", domain: "example.test" },
byResourceId: new Map([
[
"resource_1",
{
displayName: "Anon Alice",
eid: "ANON-001",
email: "anon-alice@example.test",
},
],
]),
byAliasEid: new Map([["anon-001", "resource_1"]]),
};
expect(buildTimelineProjectContextResponse({
project: { id: "project_1" },
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
allResourceAllocations: [
{
id: "booking_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
resourceIds: ["resource_1"],
directory: directory as never,
})).toEqual({
project: { id: "project_1" },
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
allResourceAllocations: [
{
id: "booking_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
resourceIds: ["resource_1"],
});
expect(buildTimelineProjectContextDetailResponse({
project: { id: "project_1" },
period: {
startDate: new Date("2026-04-01T00:00:00.000Z"),
endDate: new Date("2026-04-05T00:00:00.000Z"),
},
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
allResourceAllocations: [
{
id: "booking_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Alice", eid: "E-001" },
},
],
resourceIds: ["resource_1"],
assignmentConflicts: [{ crossProjectOverlapCount: 1, assignmentId: "assignment_1" }],
holidayOverlays: [],
directory: directory as never,
})).toEqual({
project: { id: "project_1" },
period: {
startDate: "2026-04-01",
endDate: "2026-04-05",
},
summary: {
allocationCount: 1,
demandCount: 1,
assignmentCount: 1,
projectCount: 1,
resourceCount: 1,
resourceIds: 1,
allResourceAllocationCount: 1,
conflictedAssignmentCount: 1,
overlayCount: 0,
holidayResourceCount: 0,
byScope: [],
},
allocations: [
{
id: "allocation_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
demands: [{ id: "demand_1", projectId: "project_1" }],
assignments: [
{
id: "assignment_1",
projectId: "project_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
allResourceAllocations: [
{
id: "booking_1",
resourceId: "resource_1",
resource: { id: "resource_1", displayName: "Anon Alice", eid: "ANON-001" },
},
],
assignmentConflicts: [{ crossProjectOverlapCount: 1, assignmentId: "assignment_1" }],
holidayOverlays: [],
resourceIds: ["resource_1"],
});
});
it("builds shift preview detail payloads with formatted dates", () => {
expect(buildTimelineShiftPreviewDetailResponse({
project: {
id: "project_1",
name: "Project One",
shortCode: "PRJ",
status: "ACTIVE",
responsiblePerson: "Alice",
startDate: new Date("2026-04-01T00:00:00.000Z"),
endDate: new Date("2026-04-10T00:00:00.000Z"),
},
requestedShift: {
newStartDate: new Date("2026-04-03T00:00:00.000Z"),
newEndDate: new Date("2026-04-12T00:00:00.000Z"),
},
preview: { valid: true },
})).toEqual({
project: {
id: "project_1",
name: "Project One",
shortCode: "PRJ",
status: "ACTIVE",
responsiblePerson: "Alice",
startDate: "2026-04-01",
endDate: "2026-04-10",
},
requestedShift: {
newStartDate: "2026-04-03",
newEndDate: "2026-04-12",
},
preview: { valid: true },
});
});
});