refactor(api): extract timeline entry read builders

This commit is contained in:
2026-03-31 15:38:39 +02:00
parent ea10851fe4
commit 93e03e0f65
3 changed files with 282 additions and 32 deletions
+13 -32
View File
@@ -2,14 +2,12 @@ import { z } from "zod";
import { getAnonymizationDirectory } from "../lib/anonymization.js";
import { controllerProcedure, protectedProcedure } from "../trpc.js";
import {
anonymizeResourceOnEntry,
buildSelfServiceTimelineInput,
buildTimelineEntriesDetailInput,
buildTimelineEntriesDetailResponse,
buildTimelineEntriesViewResponse,
createEmptyTimelineEntriesView,
createTimelineDateRange,
createTimelineFilters,
fmtDate,
loadTimelineEntriesReadModel,
summarizeTimelineEntries,
TimelineWindowFiltersSchema,
} from "./timeline-read-shared.js";
import {
@@ -24,7 +22,7 @@ export const timelineEntryReadProcedures = {
.query(async ({ ctx, input }) => {
const readModel = await loadTimelineEntriesReadModel(ctx.db, input);
const directory = await getAnonymizationDirectory(ctx.db);
return readModel.allocations.map((allocation) => anonymizeResourceOnEntry(allocation, directory));
return buildTimelineEntriesViewResponse(readModel, directory).allocations;
}),
getEntriesView: controllerProcedure
@@ -35,11 +33,7 @@ export const timelineEntryReadProcedures = {
getAnonymizationDirectory(ctx.db),
]);
return {
...readModel,
allocations: readModel.allocations.map((allocation) => anonymizeResourceOnEntry(allocation, directory)),
assignments: readModel.assignments.map((assignment) => anonymizeResourceOnEntry(assignment, directory)),
};
return buildTimelineEntriesViewResponse(readModel, directory);
}),
getMyEntriesView: protectedProcedure
@@ -55,11 +49,7 @@ export const timelineEntryReadProcedures = {
getAnonymizationDirectory(ctx.db),
]);
return {
...readModel,
allocations: readModel.allocations.map((allocation) => anonymizeResourceOnEntry(allocation, directory)),
assignments: readModel.assignments.map((assignment) => anonymizeResourceOnEntry(assignment, directory)),
};
return buildTimelineEntriesViewResponse(readModel, directory);
}),
getEntriesDetail: controllerProcedure
@@ -77,9 +67,7 @@ export const timelineEntryReadProcedures = {
}),
)
.query(async ({ ctx, input }) => {
const { startDate, endDate } = createTimelineDateRange(input);
const filters = createTimelineFilters(input);
const timelineInput = { ...filters, startDate, endDate };
const { period, filters, timelineInput } = buildTimelineEntriesDetailInput(input);
const [readModel, directory] = await Promise.all([
loadTimelineEntriesReadModel(ctx.db, timelineInput),
@@ -92,20 +80,13 @@ export const timelineEntryReadProcedures = {
);
const formattedHolidayOverlays = formatHolidayOverlays(holidayOverlays);
return {
period: {
startDate: fmtDate(startDate),
endDate: fmtDate(endDate),
},
return buildTimelineEntriesDetailResponse({
period,
filters,
summary: {
...summarizeTimelineEntries(readModel),
...summarizeHolidayOverlays(formattedHolidayOverlays),
},
allocations: readModel.allocations.map((allocation) => anonymizeResourceOnEntry(allocation, directory)),
demands: readModel.demands,
assignments: readModel.assignments.map((assignment) => anonymizeResourceOnEntry(assignment, directory)),
readModel,
directory,
holidayOverlays: formattedHolidayOverlays,
};
holidaySummary: summarizeHolidayOverlays(formattedHolidayOverlays),
});
}),
};