import { getAnonymizationDirectory } from "../lib/anonymization.js"; import { buildSelfServiceTimelineInput, buildTimelineEntriesDetailInput, createEmptyTimelineEntriesView, loadTimelineEntriesReadModel, } from "./timeline-read-shared.js"; import { buildTimelineEntriesDetailResponse, buildTimelineEntriesViewResponse, } from "./timeline-entry-response-support.js"; import { formatHolidayOverlays, loadTimelineHolidayOverlaysForReadModel, summarizeHolidayOverlays, } from "./timeline-holiday-read.js"; type TimelineEntryProcedureDb = & Parameters[0] & Parameters[0] & Parameters[0]; type TimelineEntrySelfServiceContext = Parameters[0]; type TimelineEntryViewInput = Parameters[1]; type TimelineEntryDetailInput = Parameters[0]; async function loadTimelineEntriesViewResponse( db: TimelineEntryProcedureDb, input: TimelineEntryViewInput, ) { const [readModel, directory] = await Promise.all([ loadTimelineEntriesReadModel(db, input), getAnonymizationDirectory(db), ]); return buildTimelineEntriesViewResponse(readModel, directory); } export async function readTimelineEntries( db: TimelineEntryProcedureDb, input: TimelineEntryViewInput, ) { return (await loadTimelineEntriesViewResponse(db, input)).allocations; } export async function readTimelineEntriesView( db: TimelineEntryProcedureDb, input: TimelineEntryViewInput, ) { return loadTimelineEntriesViewResponse(db, input); } export async function readMyTimelineEntriesView( ctx: TimelineEntrySelfServiceContext, input: TimelineEntryViewInput, ) { const selfServiceInput = await buildSelfServiceTimelineInput(ctx, input); if (!selfServiceInput) { return createEmptyTimelineEntriesView(); } return readTimelineEntriesView(ctx.db, selfServiceInput); } export async function readTimelineEntriesDetail( db: TimelineEntryProcedureDb, input: TimelineEntryDetailInput, ) { const { period, filters, timelineInput } = buildTimelineEntriesDetailInput(input); const [readModel, directory] = await Promise.all([ loadTimelineEntriesReadModel(db, timelineInput), getAnonymizationDirectory(db), ]); const holidayOverlays = await loadTimelineHolidayOverlaysForReadModel( db, timelineInput, readModel, ); const formattedHolidayOverlays = formatHolidayOverlays(holidayOverlays); return buildTimelineEntriesDetailResponse({ period, filters, readModel, directory, holidayOverlays: formattedHolidayOverlays, holidaySummary: summarizeHolidayOverlays(formattedHolidayOverlays), }); }