mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
8018f10273
The rule that a multi-statement write runs in uow.transactional was written down but nothing held it. scripts/tx-writes.mjs reads every class under src/ with the TypeScript parser and counts, per method, the writes it issues outside a transactional callback: repository calls that build an INSERT, UPDATE or DELETE, calls to methods that write (on the class itself or on a constructor-injected one), and a transaction holding writes as one. A write in a loop counts twice, of two branches only the larger counts, local helpers count where they are called, and a helper whose every call sits inside a transaction is not reported. --explain lists the line of every call that counted. Today's 102 reported methods sit in scripts/tx-writes-baseline.json and may only shrink; most are syncs with network I/O between their writes, plugin lifecycle steps and adapters calling two service writes. A new method fails CI, and an entry above what its method holds fails until --update lowers it, the same ratchet as lint:size and lint:boundaries. Two JSDoc tags mark the deliberate cases with their reason in the tag: @txStandalone for a write that stands on its own whatever the caller does (the audit row, notification sends, the booking price mirror, the assignment journey refresh, the quota retention purge), @txIndependent for writes complete one by one on purpose (the OAuth token retention sweep, the notification claim and its release). Runs in CI after lint:boundaries; documented in server/CLAUDE.md, the root CLAUDE.md and the wiki's dev setup page.
105 lines
8.0 KiB
JSON
105 lines
8.0 KiB
JSON
{
|
|
"src/db/repositories/DemoRepository.ts#DemoRepository.restoreInstanceApiKeys": 2,
|
|
"src/nest/admin/admin.controller.ts#AdminController.updateAddon": 2,
|
|
"src/nest/atlas/atlas.service.ts#AtlasService.cacheRegionsInBackground": 2,
|
|
"src/nest/atlas/atlas.service.ts#AtlasService.repairStaleRegionCache": 2,
|
|
"src/nest/atlas/place-regions-repair.job.ts#PlaceRegionsRepairJob.runOnce": 2,
|
|
"src/nest/auth/passkey.service.ts#PasskeyService.passkeyLoginOptions": 2,
|
|
"src/nest/auth/passkey.service.ts#PasskeyService.passkeyLoginVerify": 2,
|
|
"src/nest/auth/passkey.service.ts#PasskeyService.passkeyRegisterOptions": 2,
|
|
"src/nest/auth/passkey.service.ts#PasskeyService.passkeyRegisterVerify": 2,
|
|
"src/nest/auth/user-cleanup.service.ts#UserCleanupService.erasePluginUserData": 2,
|
|
"src/nest/booking-import/booking-import.service.ts#BookingImportService.confirm": 6,
|
|
"src/nest/doc-sync/doc-sync-config.service.ts#DocSyncConfigService.upsertConnection": 3,
|
|
"src/nest/doc-sync/doc-sync.controller.ts#DocSyncController.createLink": 4,
|
|
"src/nest/doc-sync/doc-sync.controller.ts#DocSyncController.deleteConnection": 2,
|
|
"src/nest/doc-sync/doc-sync.controller.ts#DocSyncController.deleteLink": 2,
|
|
"src/nest/doc-sync/doc-sync.controller.ts#DocSyncController.listConnections": 2,
|
|
"src/nest/doc-sync/doc-sync.controller.ts#DocSyncController.syncNow": 2,
|
|
"src/nest/doc-sync/doc-sync.controller.ts#DocSyncController.testConnection": 2,
|
|
"src/nest/doc-sync/doc-sync.controller.ts#DocSyncController.upsertConnection": 2,
|
|
"src/nest/doc-sync/doc-sync.job.ts#DocSyncJob.tick": 3,
|
|
"src/nest/doc-sync/doc-sync.mcp.ts#DocSyncMcp.syncNow": 4,
|
|
"src/nest/doc-sync/doc-sync.service.ts#DocSyncService.applyAction": 2,
|
|
"src/nest/doc-sync/doc-sync.service.ts#DocSyncService.pull": 3,
|
|
"src/nest/doc-sync/doc-sync.service.ts#DocSyncService.push": 2,
|
|
"src/nest/doc-sync/doc-sync.service.ts#DocSyncService.renameRemoteTo": 2,
|
|
"src/nest/doc-sync/doc-sync.service.ts#DocSyncService.resolveConflict": 3,
|
|
"src/nest/doc-sync/doc-sync.service.ts#DocSyncService.runLink": 4,
|
|
"src/nest/doc-sync/doc-sync.service.ts#DocSyncService.syncLink": 2,
|
|
"src/nest/integrations/airtrail-import.service.ts#AirtrailImportService.importAirtrailFlights": 8,
|
|
"src/nest/integrations/airtrail-link.service.ts#AirtrailLinkService.pushReservationToAirtrail": 2,
|
|
"src/nest/integrations/airtrail-sync.service.ts#AirtrailSyncService.runAirtrailSync": 2,
|
|
"src/nest/integrations/airtrail-sync.service.ts#AirtrailSyncService.syncOwner": 8,
|
|
"src/nest/integrations/airtrail.service.ts#AirtrailService.saveSettings": 2,
|
|
"src/nest/integrations/dawarich-sync.service.ts#DawarichSyncService.runSync": 2,
|
|
"src/nest/integrations/dawarich-sync.service.ts#DawarichSyncService.syncTripWindow": 11,
|
|
"src/nest/integrations/dawarich-sync.service.ts#DawarichSyncService.syncUserOnce": 4,
|
|
"src/nest/journey/journey.controller.ts#JourneyController.galleryProviderPhotos": 2,
|
|
"src/nest/journey/journey.controller.ts#JourneyController.providerPhotos": 2,
|
|
"src/nest/journey/journey.controller.ts#JourneyController.uploadEntryPhotos": 4,
|
|
"src/nest/journey/journey.mcp.ts#JourneyMcp.addJourneyProviderPhotos": 2,
|
|
"src/nest/maps/maps.service.ts#MapsService.getPlaceDetails": 2,
|
|
"src/nest/maps/maps.service.ts#MapsService.getPlaceDetailsExpanded": 2,
|
|
"src/nest/maps/maps.service.ts#MapsService.getPlacePhoto": 7,
|
|
"src/nest/memories/immich.controller.ts#ImmichMemoriesController.putSettings": 2,
|
|
"src/nest/memories/photo-resolver.service.ts#PhotoResolverService.streamCachedThumbnail": 3,
|
|
"src/nest/memories/photo-resolver.service.ts#PhotoResolverService.streamPhoto": 2,
|
|
"src/nest/memories/synology.service.ts#SynologyService._fetchAllSynologyAlbums": 2,
|
|
"src/nest/memories/synology.service.ts#SynologyService._getSynologySession": 2,
|
|
"src/nest/memories/synology.service.ts#SynologyService._requestSynologyApi": 3,
|
|
"src/nest/memories/synology.service.ts#SynologyService.collectSynologyAlbumSelection": 2,
|
|
"src/nest/memories/synology.service.ts#SynologyService.getSynologyAlbumPhotos": 2,
|
|
"src/nest/memories/synology.service.ts#SynologyService.listSynologyAlbums": 3,
|
|
"src/nest/memories/synology.service.ts#SynologyService.testSynologyConnection": 2,
|
|
"src/nest/memories/synology.service.ts#SynologyService.updateSynologySettings": 2,
|
|
"src/nest/memories/trek-photo-cache.job.ts#TrekPhotoCacheJob.onApplicationBootstrap": 2,
|
|
"src/nest/memories/trek-photo-cache.service.ts#TrekPhotoCacheService.sweepExpired": 2,
|
|
"src/nest/memories/unified-memories.service.ts#UnifiedMemoriesService.addTripPhotos": 4,
|
|
"src/nest/memories/unified-memories.service.ts#UnifiedMemoriesService.syncImmichAlbum": 2,
|
|
"src/nest/memories/unified-memories.service.ts#UnifiedMemoriesService.syncSynologyAlbum": 3,
|
|
"src/nest/notifications/push/push.controller.ts#PushController.subscribe": 2,
|
|
"src/nest/notifications/reminder-jobs.service.ts#ReminderJobsService.onApplicationBootstrap": 2,
|
|
"src/nest/notifications/reminder-jobs.service.ts#ReminderJobsService.todoTick": 4,
|
|
"src/nest/notifications/reminder-jobs.service.ts#ReminderJobsService.tripTick": 4,
|
|
"src/nest/notifications/transports/web-push.service.ts#WebPushService.deliver": 3,
|
|
"src/nest/notifications/transports/web-push.service.ts#WebPushService.deliverTo": 2,
|
|
"src/nest/notifications/transports/web-push.service.ts#WebPushService.settle": 2,
|
|
"src/nest/oidc/oidc.controller.ts#OidcController.callback": 2,
|
|
"src/nest/place-enrichment/place-enrichment.service.ts#PlaceEnrichmentService.collectPhotos": 5,
|
|
"src/nest/place-enrichment/place-enrichment.service.ts#PlaceEnrichmentService.enrich": 5,
|
|
"src/nest/place-enrichment/place-enrichment.service.ts#PlaceEnrichmentService.readCache": 2,
|
|
"src/nest/place-enrichment/place-enrichment.service.ts#PlaceEnrichmentService.storeCandidate": 2,
|
|
"src/nest/place-photos/place-photo-cache.job.ts#PlacePhotoCacheJob.onApplicationBootstrap": 2,
|
|
"src/nest/place-photos/place-photo-cache.service.ts#PlacePhotoCacheService.sweepOrphans": 2,
|
|
"src/nest/places/places.mcp.ts#PlacesMcp.bulkDeletePlaces": 3,
|
|
"src/nest/places/places.mcp.ts#PlacesMcp.createAndAssignPlace": 2,
|
|
"src/nest/places/places.mcp.ts#PlacesMcp.deletePlace": 2,
|
|
"src/nest/places/places.rpc.ts#PlacesRpc.create": 2,
|
|
"src/nest/places/places.rpc.ts#PlacesRpc.delete": 2,
|
|
"src/nest/places/places.rpc.ts#PlacesRpc.update": 2,
|
|
"src/nest/places/places.service.ts#PlacesService.backfillMissingAddresses": 2,
|
|
"src/nest/places/places.service.ts#PlacesService.enrichImportedList": 2,
|
|
"src/nest/places/places.service.ts#PlacesService.enrichOne": 4,
|
|
"src/nest/places/places.service.ts#PlacesService.importGoogleDirections": 2,
|
|
"src/nest/places/places.service.ts#PlacesService.importGoogleList": 2,
|
|
"src/nest/places/places.service.ts#PlacesService.importNaverList": 2,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.activate": 2,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.deactivateForDisabledAddon": 2,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.deactivateWithDependents": 2,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.link": 3,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.onApplicationBootstrap": 7,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.reload": 2,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.runDrainOnce": 4,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.setOperatorEgressHosts": 2,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.sideload": 2,
|
|
"src/nest/plugins/plugin-runtime.service.ts#PluginRuntimeService.update": 3,
|
|
"src/nest/plugins/plugins.controller.ts#PluginsController.install": 2,
|
|
"src/nest/plugins/plugins.controller.ts#PluginsController.update": 2,
|
|
"src/nest/plugins/plugins.controller.ts#PluginsController.updateConfig": 3,
|
|
"src/nest/reservations/reservations.controller.ts#ReservationsController.update": 2,
|
|
"src/nest/trip-members/trip-members.service.ts#TripMembersService.deleteGuest": 2,
|
|
"src/nest/trips/trips.service.ts#TripsService.update": 2,
|
|
"src/nest/vacay/vacay.service.ts#VacayService.updatePlan": 2
|
|
}
|