refactor(api): extract timeline entry procedure support
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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<typeof getAnonymizationDirectory>[0]
|
||||
& Parameters<typeof loadTimelineEntriesReadModel>[0]
|
||||
& Parameters<typeof loadTimelineHolidayOverlaysForReadModel>[0];
|
||||
type TimelineEntrySelfServiceContext = Parameters<typeof buildSelfServiceTimelineInput>[0];
|
||||
type TimelineEntryViewInput = Parameters<typeof loadTimelineEntriesReadModel>[1];
|
||||
type TimelineEntryDetailInput = Parameters<typeof buildTimelineEntriesDetailInput>[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),
|
||||
});
|
||||
}
|
||||
@@ -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)),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user