refactor(api): extract timeline entry procedure support

This commit is contained in:
2026-03-31 18:18:52 +02:00
parent 72b13dfaba
commit 4758c96543
3 changed files with 292 additions and 62 deletions
+9 -62
View File
@@ -1,58 +1,27 @@
import { z } from "zod";
import { getAnonymizationDirectory } from "../lib/anonymization.js";
import { controllerProcedure, protectedProcedure } from "../trpc.js";
import {
buildSelfServiceTimelineInput,
buildTimelineEntriesDetailInput,
createEmptyTimelineEntriesView,
loadTimelineEntriesReadModel,
TimelineWindowFiltersSchema,
} from "./timeline-read-shared.js";
import {
buildTimelineEntriesDetailResponse,
buildTimelineEntriesViewResponse,
} from "./timeline-entry-response-support.js";
import {
formatHolidayOverlays,
loadTimelineHolidayOverlaysForReadModel,
summarizeHolidayOverlays,
} from "./timeline-holiday-read.js";
readMyTimelineEntriesView,
readTimelineEntries,
readTimelineEntriesDetail,
readTimelineEntriesView,
} from "./timeline-entry-procedure-support.js";
export const timelineEntryReadProcedures = {
getEntries: controllerProcedure
.input(TimelineWindowFiltersSchema)
.query(async ({ ctx, input }) => {
const readModel = await loadTimelineEntriesReadModel(ctx.db, input);
const directory = await getAnonymizationDirectory(ctx.db);
return buildTimelineEntriesViewResponse(readModel, directory).allocations;
}),
.query(({ ctx, input }) => readTimelineEntries(ctx.db, input)),
getEntriesView: controllerProcedure
.input(TimelineWindowFiltersSchema)
.query(async ({ ctx, input }) => {
const [readModel, directory] = await Promise.all([
loadTimelineEntriesReadModel(ctx.db, input),
getAnonymizationDirectory(ctx.db),
]);
return buildTimelineEntriesViewResponse(readModel, directory);
}),
.query(({ ctx, input }) => readTimelineEntriesView(ctx.db, input)),
getMyEntriesView: protectedProcedure
.input(TimelineWindowFiltersSchema)
.query(async ({ ctx, input }) => {
const selfServiceInput = await buildSelfServiceTimelineInput(ctx, input);
if (!selfServiceInput) {
return createEmptyTimelineEntriesView();
}
const [readModel, directory] = await Promise.all([
loadTimelineEntriesReadModel(ctx.db, selfServiceInput),
getAnonymizationDirectory(ctx.db),
]);
return buildTimelineEntriesViewResponse(readModel, directory);
}),
.query(({ ctx, input }) => readMyTimelineEntriesView(ctx, input)),
getEntriesDetail: controllerProcedure
.input(
@@ -68,27 +37,5 @@ export const timelineEntryReadProcedures = {
countryCodes: z.array(z.string()).optional(),
}),
)
.query(async ({ ctx, input }) => {
const { period, filters, timelineInput } = buildTimelineEntriesDetailInput(input);
const [readModel, directory] = await Promise.all([
loadTimelineEntriesReadModel(ctx.db, timelineInput),
getAnonymizationDirectory(ctx.db),
]);
const holidayOverlays = await loadTimelineHolidayOverlaysForReadModel(
ctx.db,
timelineInput,
readModel,
);
const formattedHolidayOverlays = formatHolidayOverlays(holidayOverlays);
return buildTimelineEntriesDetailResponse({
period,
filters,
readModel,
directory,
holidayOverlays: formattedHolidayOverlays,
holidaySummary: summarizeHolidayOverlays(formattedHolidayOverlays),
});
}),
.query(({ ctx, input }) => readTimelineEntriesDetail(ctx.db, input)),
};