Files
TREK/server/src/nest/integrations/dawarich.module.ts
T
Maurice 1a9855cf70 refactor(mcp): the demo-mode write block runs once, in the registry's tool gate
Every write tool used to open with its own demo check, 196 copies across 30
tool files, most of them injecting AuthService for nothing else. The
registry now takes a toolGate (built from the container) that runs before
each registered tool handler, and TREK's gate refuses a demo account on
every tool not annotated read-only with the same canned result. The
per-tool checks, the AuthService injections, AuthService.isDemoUser and the
AuthModule imports that only fed them are gone; ESLint refuses a demo check
in a tool file, and a registry-wide test calls every write tool as the
demo account.
2026-10-10 20:15:57 +02:00

87 lines
4.1 KiB
TypeScript

import { Module } from '@nestjs/common';
import { MikroOrmModule } from '@mikro-orm/nestjs';
import { AddonsModule } from '../addons/addons.module';
import { AuditModule } from '../audit/audit.module';
import { AtlasModule } from '../atlas/atlas.module';
import { PermissionsModule } from '../permissions/permissions.module';
import { PlacesModule } from '../places/places.module';
import { AssignmentsDomainModule } from '../assignments/assignments-domain.module';
import { JourneyDomainModule } from '../journey/journey-domain.module';
import { SchedulingModule } from '../scheduling/scheduling.module';
import { McpSharedModule } from '../mcp-shared/mcp-shared.module';
import { DawarichConnections } from '../../db/entities/DawarichConnections.entity';
import { DawarichVisitSuggestions } from '../../db/entities/DawarichVisitSuggestions.entity';
import { Trips } from '../../db/entities/Trips.entity';
import { Places } from '../../db/entities/Places.entity';
import { BucketList } from '../../db/entities/BucketList.entity';
import { Users } from '../../db/entities/Users.entity';
import { AppSettings } from '../../db/entities/AppSettings.entity';
import { DawarichClient } from './dawarich.client';
import { DawarichController } from './dawarich.controller';
import { DawarichMcp } from './dawarich.mcp';
import { DawarichService } from './dawarich.service';
import { DawarichSuggestionsService } from './dawarich-suggestions.service';
import { DawarichSyncJob } from './dawarich-sync.job';
import { DawarichSyncService } from './dawarich-sync.service';
import { DawarichTracksService } from './dawarich-tracks.service';
/**
* The Dawarich integration (#2279): a per-user connection to a self-hosted
* location-history instance, the visits it reports, and the recorded route
* drawn over a trip.
*
* Everything hangs off `/api/integrations/dawarich`, so there is no cycle to
* dodge and no split into a core module the way AirTrail needed — nothing in
* TREK injects Dawarich, Dawarich injects TREK. The direction of that arrow is
* the architecture: this module reads other domains' services to *create* what
* a user accepted, and never the other way round.
*
* The leaf modules are picked deliberately. `AssignmentsDomainModule` rather
* than `AssignmentsModule`, and `JourneyDomainModule` rather than
* `JourneyModule`, so accepting a suggestion does not drag two controller
* stacks and both photo providers into this graph.
*
* `MikroOrmModule.forFeature` registers every entity this module's own
* services' `@InjectRepository` constructors need (Plan 3h Task 3):
* `DawarichConnections`/`DawarichVisitSuggestions` (this domain's own two
* tables) plus the cross-domain repositories `DawarichSuggestionsService`/
* `DawarichSyncService`/`DawarichTracksService`/`DawarichSyncJob` reach —
* `Trips` (3c, access + sync candidates), `Places` (3c, the `source` stamp),
* `BucketList` (3f, ticks/scan/bounding-box), `Users` (3b, the role lookup
* `requirePermission` needs) and `AppSettings` (3a, the poll-interval
* setting) — every module that CONSTRUCTS these services needs its own
* registration of the entity, not only the entity's own home module (the
* program-wide BOOT GATE rule).
*/
@Module({
imports: [
MikroOrmModule.forFeature([DawarichConnections, DawarichVisitSuggestions, Trips, Places, BucketList, Users, AppSettings]),
AddonsModule,
AuditModule,
// The MCP tools ask AuthService whether the caller is the demo user, the
// same gate every other write tool carries.
AtlasModule,
// Accepting a stay writes a place and a day assignment, so it asks the same
// permissions the planner asks before doing either.
PermissionsModule,
PlacesModule,
AssignmentsDomainModule,
JourneyDomainModule,
SchedulingModule,
McpSharedModule,
],
controllers: [DawarichController],
providers: [
DawarichClient,
DawarichService,
DawarichSyncService,
DawarichSuggestionsService,
DawarichTracksService,
DawarichSyncJob,
DawarichMcp,
],
exports: [DawarichService, DawarichSuggestionsService, DawarichTracksService],
})
export class DawarichModule {}