refactor(api): split timeline read schemas

This commit is contained in:
2026-03-31 18:56:01 +02:00
parent 424ee24280
commit d61527b38c
6 changed files with 42 additions and 38 deletions
@@ -1,10 +1,12 @@
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { import {
buildTimelineEntriesDetailInput, buildTimelineEntriesDetailInput,
} from "../router/timeline-read-shared.js";
import {
TimelineDetailFiltersSchema, TimelineDetailFiltersSchema,
TimelineProjectContextDetailSchema, TimelineProjectContextDetailSchema,
TimelineProjectIdSchema, TimelineProjectIdSchema,
} from "../router/timeline-read-shared.js"; } from "../router/timeline-read-schema-support.js";
describe("timeline read shared", () => { describe("timeline read shared", () => {
it("builds detail input from period and normalized filters", () => { it("builds detail input from period and normalized filters", () => {
@@ -2,7 +2,7 @@ import { controllerProcedure, protectedProcedure } from "../trpc.js";
import { import {
TimelineDetailFiltersSchema, TimelineDetailFiltersSchema,
TimelineWindowFiltersSchema, TimelineWindowFiltersSchema,
} from "./timeline-read-shared.js"; } from "./timeline-read-schema-support.js";
import { import {
readMyTimelineEntriesView, readMyTimelineEntriesView,
readTimelineEntries, readTimelineEntries,
@@ -2,7 +2,7 @@ import { controllerProcedure, protectedProcedure } from "../trpc.js";
import { import {
TimelineDetailFiltersSchema, TimelineDetailFiltersSchema,
TimelineWindowFiltersSchema, TimelineWindowFiltersSchema,
} from "./timeline-read-shared.js"; } from "./timeline-read-schema-support.js";
import { import {
loadTimelineHolidayOverlays, loadTimelineHolidayOverlays,
} from "./timeline-holiday-load-support.js"; } from "./timeline-holiday-load-support.js";
@@ -3,7 +3,7 @@ import { controllerProcedure } from "../trpc.js";
import { import {
TimelineProjectContextDetailSchema, TimelineProjectContextDetailSchema,
TimelineProjectIdSchema, TimelineProjectIdSchema,
} from "./timeline-read-shared.js"; } from "./timeline-read-schema-support.js";
import { import {
readTimelineProjectContextDetailResponse, readTimelineProjectContextDetailResponse,
readTimelineProjectContextResponse, readTimelineProjectContextResponse,
@@ -0,0 +1,35 @@
import { z } from "zod";
export const TimelineWindowFiltersSchema = z.object({
startDate: z.coerce.date(),
endDate: z.coerce.date(),
resourceIds: z.array(z.string()).optional(),
projectIds: z.array(z.string()).optional(),
clientIds: z.array(z.string()).optional(),
chapters: z.array(z.string()).optional(),
eids: z.array(z.string()).optional(),
countryCodes: z.array(z.string()).optional(),
});
export const TimelineDetailFiltersSchema = z.object({
startDate: z.string().optional(),
endDate: z.string().optional(),
durationDays: z.number().int().min(1).max(366).optional(),
resourceIds: z.array(z.string()).optional(),
projectIds: z.array(z.string()).optional(),
clientIds: z.array(z.string()).optional(),
chapters: z.array(z.string()).optional(),
eids: z.array(z.string()).optional(),
countryCodes: z.array(z.string()).optional(),
});
export const TimelineProjectContextDetailSchema = z.object({
projectId: z.string(),
startDate: z.string().optional(),
endDate: z.string().optional(),
durationDays: z.number().int().min(1).max(366).optional(),
});
export const TimelineProjectIdSchema = z.object({
projectId: z.string(),
});
@@ -1,6 +1,7 @@
import { buildSplitAllocationReadModel } from "@capakraken/application"; import { buildSplitAllocationReadModel } from "@capakraken/application";
import type { PrismaClient } from "@capakraken/db"; import type { PrismaClient } from "@capakraken/db";
import { z } from "zod"; import { z } from "zod";
import { TimelineWindowFiltersSchema } from "./timeline-read-schema-support.js";
import { loadTimelineEntryRecords } from "./timeline-entry-query-support.js"; import { loadTimelineEntryRecords } from "./timeline-entry-query-support.js";
export { export {
buildSelfServiceTimelineInput, buildSelfServiceTimelineInput,
@@ -30,40 +31,6 @@ export type TimelineEntriesFilters = {
countryCodes?: string[] | undefined; countryCodes?: string[] | undefined;
}; };
export const TimelineWindowFiltersSchema = z.object({
startDate: z.coerce.date(),
endDate: z.coerce.date(),
resourceIds: z.array(z.string()).optional(),
projectIds: z.array(z.string()).optional(),
clientIds: z.array(z.string()).optional(),
chapters: z.array(z.string()).optional(),
eids: z.array(z.string()).optional(),
countryCodes: z.array(z.string()).optional(),
});
export const TimelineDetailFiltersSchema = z.object({
startDate: z.string().optional(),
endDate: z.string().optional(),
durationDays: z.number().int().min(1).max(366).optional(),
resourceIds: z.array(z.string()).optional(),
projectIds: z.array(z.string()).optional(),
clientIds: z.array(z.string()).optional(),
chapters: z.array(z.string()).optional(),
eids: z.array(z.string()).optional(),
countryCodes: z.array(z.string()).optional(),
});
export const TimelineProjectContextDetailSchema = z.object({
projectId: z.string(),
startDate: z.string().optional(),
endDate: z.string().optional(),
durationDays: z.number().int().min(1).max(366).optional(),
});
export const TimelineProjectIdSchema = z.object({
projectId: z.string(),
});
type TimelineWindowFiltersInput = z.infer<typeof TimelineWindowFiltersSchema>; type TimelineWindowFiltersInput = z.infer<typeof TimelineWindowFiltersSchema>;
export function getAssignmentResourceIds( export function getAssignmentResourceIds(