feat(server): injectable RealtimeService over the ws singleton

Nest services inject RealtimeService (call-time delegation to the
websocket module, DatabaseService pattern) instead of importing
broadcast/broadcastToUser globals. Zero behavior change; test edits
are constructor-arg additions plus RealtimeModule in e2e harness
imports only.
This commit is contained in:
jubnl
2026-07-29 00:07:51 +02:00
parent 80f3958569
commit a2861d40f3
64 changed files with 367 additions and 181 deletions
+11 -9
View File
@@ -26,6 +26,7 @@ import { TodoMcp } from '../../src/nest/todo/todo.mcp';
import { TodoService } from '../../src/nest/todo/todo.service';
import { VacayMcp } from '../../src/nest/vacay/vacay.mcp';
import { VacayService } from '../../src/nest/vacay/vacay.service';
import { RealtimeService } from '../../src/nest/realtime/realtime.service';
/**
* Hand-wired counterpart of the boot-time discovery in McpRegistryService,
@@ -37,22 +38,23 @@ import { VacayService } from '../../src/nest/vacay/vacay.service';
export function createMcpTestRegistry(): McpRegistry {
const dbService = new DatabaseService(db);
const permissionsService = new PermissionsService(dbService);
const daysService = new DaysService(dbService, permissionsService);
const realtimeService = new RealtimeService();
const daysService = new DaysService(dbService, permissionsService, realtimeService);
const exchangeRatesService = new ExchangeRatesService();
const budgetService = new BudgetService(dbService, permissionsService, exchangeRatesService);
const budgetService = new BudgetService(dbService, permissionsService, exchangeRatesService, realtimeService);
return createTestRegistry(
[
new TagsMcp(new TagsService(dbService)),
new CategoriesMcp(new CategoriesService(dbService)),
new TodoMcp(new TodoService(dbService, permissionsService)),
new PackingMcp(new PackingService(dbService, permissionsService)),
new TodoMcp(new TodoService(dbService, permissionsService, realtimeService)),
new PackingMcp(new PackingService(dbService, permissionsService, realtimeService)),
new BudgetMcp(budgetService, exchangeRatesService, dbService),
new ReservationsMcp(new ReservationsService(dbService, permissionsService, budgetService), daysService, budgetService),
new DayNotesMcp(new DayNotesService(dbService, permissionsService)),
new ReservationsMcp(new ReservationsService(dbService, permissionsService, budgetService, realtimeService), daysService, budgetService),
new DayNotesMcp(new DayNotesService(dbService, permissionsService, realtimeService)),
new DaysMcp(daysService, dbService),
new AssignmentsMcp(new AssignmentsService(dbService, permissionsService), daysService),
new CollabMcp(new CollabService(dbService, permissionsService)),
new VacayMcp(new VacayService(dbService)),
new AssignmentsMcp(new AssignmentsService(dbService, permissionsService, realtimeService), daysService),
new CollabMcp(new CollabService(dbService, permissionsService, realtimeService)),
new VacayMcp(new VacayService(dbService, realtimeService)),
],
{ accessPolicy: trekMcpAccessPolicy, validateAccess: trekMcpValidateAccess },
);