feat(17-01): move TenderEmailConfig ownership from tenant to user
Alert-Postfach gehoert jetzt dem einzelnen Nutzer (userId @unique) statt
dem Mandanten (D-01) — ein zweiter Kollege desselben Mandanten kann sein
eigenes Postfach anbinden. tenantId bleibt denormalisiert (SMTP-Aufloesung,
Herkunftsmarkierung), wird auf create UND update mitgeschrieben.
- Handgeschriebene Migration (prisma migrate dev verweigert die
nicht-interaktive Shell): befuellt Bestandszeilen mit dem aeltesten
aktiven Administrator ihres Mandanten, entfernt verwaiste Zeilen ohne
Administrator, ersetzt die tenantId-Eindeutigkeit durch userId.
Lokal getestet (0 Bestandszeilen lokal und auf alpha — Zaehlung im
Task-1-Checkpoint), Index-Ergebnis verifiziert.
- TenderEmailConfigService.getConfigForApi/saveConfig auf userId als
Schluessel umgestellt; saveConfig nimmt {userId, tenantId}.
- TendersController: email-config-Routen von @Roles(ADMIN,SUPER_ADMIN)
auf @UseModule('tender-radar') umgestellt (Postfach ist jetzt
Nutzereinstellung); Route-Reihenfolge vor @Get(':id') unveraendert.
- Neue Seite /modules/tender-radar/my-sources ("Meine Quellen") mit dem
unveraenderten EmailAlertConfigForm; Hinweistext benennt D-05 (Tender
bleibt plattform-global — nur wer Quellen einspeist aendert sich).
- tenders.controller.spec.ts an neue Service-Signatur angepasst (Rule 3,
nicht im Plan gelistet, aber zum Kompilieren/Bestehen erforderlich).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -275,9 +275,15 @@ model DkvModuleConfig {
|
||||
// DKV invoice inbox). Credentials are encrypted via CalendarCryptoService
|
||||
// (same AES-256-GCM iv:authTag:ciphertext format as DkvModuleConfig/
|
||||
// SmtpConfig) and excluded from every API response (Safe-Select, T-07-12).
|
||||
// Phase 17 (D-01): ownership lives at the USER, not the tenant — each user
|
||||
// connects their own alert mailbox, so two colleagues at the same tenant can
|
||||
// each run their own inbox in parallel. `tenantId` stays as a denormalized
|
||||
// field (SMTP resolution, ownerTenantId tagging on ingested Tender rows) —
|
||||
// same role as `tenantId` on TenderMatch, not the ownership key anymore.
|
||||
model TenderEmailConfig {
|
||||
id String @id @default(uuid())
|
||||
tenantId String @unique
|
||||
userId String @unique
|
||||
tenantId String
|
||||
protocol String @default("imap") // 'imap' | 'exchange'
|
||||
host String?
|
||||
port Int?
|
||||
@@ -291,6 +297,7 @@ model TenderEmailConfig {
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([tenantId])
|
||||
@@index([userId])
|
||||
}
|
||||
|
||||
model DkvVehicleMaster {
|
||||
|
||||
Reference in New Issue
Block a user