feat(11-06): saved-searches CRUD routes on TendersController (FILTER-06)

Adds GET/POST /saved-searches and PATCH/DELETE /saved-searches/:searchId,
registers TenderSavedSearchService as a module provider, and wires it into
the controller via extractTriageContext (userId/tenantId from the auth
context, never the body/query — T-11-14/V4 IDOR). Static saved-searches
routes are declared before @Get(':id') (Pitfall 5/T-11-16); mutation routes
use :searchId to avoid ambiguity with the Tender :id param.

Also fixes a Prisma InputJsonValue type mismatch in
TenderSavedSearchService (Rule 1 — caught by tsc --noEmit, same cast
convention as dashboard.service.ts).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-21 16:48:00 +02:00
parent df94d921ef
commit 38fbf35c75
4 changed files with 294 additions and 18 deletions
+6
View File
@@ -6,6 +6,7 @@ import { DoeOpenDataAdapter } from './adapters/doe-opendata.adapter';
import { seedTendersModule } from './tenders.seed';
import { TenderIngestionService } from './tender-ingestion.service';
import { TenderNormalizerService } from './tender-normalizer.service';
import { TenderSavedSearchService } from './tender-saved-search.service';
import { TenderSchedulerService } from './tender-scheduler.service';
import { TenderTriageService } from './tender-triage.service';
import { TendersController } from './tenders.controller';
@@ -26,6 +27,10 @@ import { TendersController } from './tenders.controller';
*
* PrismaModule is global (no explicit import needed).
*
* Plan 06 adds TenderSavedSearchService (per-user Suchprofile, FILTER-06)
* as a further provider — same userId-scoping convention as
* TenderTriageService, no forTenant()/RLS (Pitfall 4).
*
* Seeds itself into the module registry on application startup via
* OnModuleInit lifecycle hook — same pattern as DkvModule.
*/
@@ -38,6 +43,7 @@ import { TendersController } from './tenders.controller';
TenderIngestionService,
TenderSchedulerService,
TenderTriageService,
TenderSavedSearchService,
],
})
export class TendersModule implements OnModuleInit {