Skip to content

Commit 407e4ba

Browse files
committed
refactor: handler use infrastructure
1 parent 34670f7 commit 407e4ba

3 files changed

Lines changed: 24 additions & 16 deletions

File tree

src/main/application/timesheet_query_handler.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// Copyright (c) 2026 Falko Schumann. All rights reserved. MIT license.
22

3-
import { Temporal } from "@js-temporal/polyfill";
4-
53
import { Clock, isTimestampInPeriod } from "../../shared/domain/temporal";
64
import type {
75
TimesheetQuery,
@@ -14,55 +12,58 @@ import { VacationChangedEvent } from "../domain/vacation_changed_event";
1412
import type { EventStore } from "../infrastructure/event_store";
1513
import { HolidayRepository } from "../infrastructure/holiday_repository";
1614
import { VacationRepository } from "../infrastructure/vacation_repository";
15+
import type { SettingsProvider } from "../infrastructure/settings_provider";
1716

1817
export class TimesheetQueryHandler {
1918
static create({
20-
capacity = "PT30M",
2119
eventStore,
2220
holidayRepository,
2321
vacationRepository,
22+
settingsProvider,
2423
clock = Clock.systemDefaultZone(),
2524
}: {
26-
capacity?: Temporal.DurationLike | string;
2725
eventStore: EventStore;
2826
holidayRepository: HolidayRepository;
2927
vacationRepository: VacationRepository;
28+
settingsProvider: SettingsProvider;
3029
clock?: Clock;
3130
}) {
3231
return new TimesheetQueryHandler(
33-
capacity,
3432
eventStore,
3533
holidayRepository,
3634
vacationRepository,
35+
settingsProvider,
3736
clock,
3837
);
3938
}
4039

41-
capacity: Temporal.Duration;
42-
43-
readonly #eventStore: EventStore;
44-
readonly #holidayRepository: HolidayRepository;
45-
readonly #vacationRepository: VacationRepository;
46-
readonly #clock: Clock;
40+
readonly #eventStore;
41+
readonly #holidayRepository;
42+
readonly #vacationRepository;
43+
readonly #settingsProvider;
44+
readonly #clock;
4745

4846
private constructor(
49-
capacity: Temporal.DurationLike | string,
5047
eventStore: EventStore,
5148
holidayRepository: HolidayRepository,
5249
vacationRepository: VacationRepository,
50+
settingsProvider: SettingsProvider,
5351
clock: Clock,
5452
) {
55-
this.capacity = Temporal.Duration.from(capacity);
5653
this.#eventStore = eventStore;
5754
this.#holidayRepository = holidayRepository;
5855
this.#vacationRepository = vacationRepository;
56+
this.#settingsProvider = settingsProvider;
5957
this.#clock = clock;
6058
}
6159

6260
async handle(query: TimesheetQuery): Promise<TimesheetQueryResult> {
6361
const readModel = new TimesheetReadModel();
6462

65-
readModel.project(CapacityChangedEvent.create({ capacity: this.capacity }));
63+
const settings = await this.#settingsProvider.load();
64+
readModel.project(
65+
CapacityChangedEvent.create({ capacity: settings.capacity }),
66+
);
6667

6768
const holidays = await this.#holidayRepository.findAllByDate(
6869
query.from,

src/main/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ const timesheetQueryHandler = TimesheetQueryHandler.create({
9797
eventStore,
9898
holidayRepository,
9999
vacationRepository,
100+
settingsProvider,
100101
});
101102
const exportTimesheetCommandHandler = ExportTimesheetCommandHandler.create({
102103
timesheetExporter,
@@ -165,7 +166,6 @@ function applySettings(settings: Settings) {
165166
eventStore.fileName = `${settings.dataDir}/activity-log.csv`;
166167
holidayRepository.fileName = `${settings.dataDir}/holidays.csv`;
167168
vacationRepository.fileName = `${settings.dataDir}/vacation.csv`;
168-
timesheetQueryHandler.capacity = settings.capacity;
169169
}
170170

171171
async function installDevTools() {

test/main/unit/timesheet.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import {
1313
} from "../../../src/shared/domain/timesheet_query";
1414
import { ActivityLoggedEvent } from "../../../src/main/domain/activity_logged_event";
1515
import { Holiday, Vacation } from "../../../src/main/domain/calendar";
16+
import { Settings } from "../../../src/main/domain/settings";
1617
import { EventStore } from "../../../src/main/infrastructure/event_store";
1718
import { HolidayRepository } from "../../../src/main/infrastructure/holiday_repository";
1819
import { VacationRepository } from "../../../src/main/infrastructure/vacation_repository";
20+
import { SettingsProvider } from "../../../src/main/infrastructure/settings_provider";
1921

2022
describe("Timesheet", () => {
2123
describe("Summarize hours worked on tasks", () => {
@@ -456,11 +458,13 @@ function configure({
456458
events,
457459
holidays,
458460
vacations,
461+
settings = Settings.create(),
459462
fixedInstant,
460463
}: {
461464
events?: ActivityLoggedEvent[];
462465
holidays?: Holiday[];
463466
vacations?: Vacation[];
467+
settings?: Settings;
464468
fixedInstant?: string;
465469
} = {}) {
466470
const eventStore = EventStore.createNull({ events });
@@ -470,15 +474,18 @@ function configure({
470474
const vacationRepository = VacationRepository.createNull({
471475
readFileResponses: vacations ? [vacations] : undefined,
472476
});
477+
const settingsProvider = SettingsProvider.createNull({
478+
readFileResponses: settings ? [settings] : undefined,
479+
});
473480
const clock = Clock.fixed(
474481
fixedInstant ?? "1970-01-01T00:00:00Z",
475482
"Europe/Berlin",
476483
);
477484
const handler = TimesheetQueryHandler.create({
478-
capacity: Temporal.Duration.from("PT40H"),
479485
eventStore,
480486
holidayRepository,
481487
vacationRepository,
488+
settingsProvider,
482489
clock,
483490
});
484491
return { handler };

0 commit comments

Comments
 (0)