fix(260911-e2s): Guard-Umbau und Kommentarkorrekturen nachtragen (Aufgabe 2 vollstaendig)
Die vorige Aufgabe-2-Teilcommit (11f5731) hatte nur die Loeschung von
tenant.middleware.ts und die neue tenant.guard.spec.ts erfasst — ein
`git add` mit mehreren Pfaden schlug wegen eines bereits entfernten
Pfads fataler fehl und liess die restlichen fuenf Dateien unstaged,
ohne dass das beim Commit auffiel (Rule 1 — Prozessfehler, hier
korrigiert). Dieser Commit traegt den eigentlichen Umbau nach:
tenant.guard.ts ohne Prisma-Abhaengigkeit, die geleerte
FORTENANT_ASSIGNMENT_EXCEPTIONS samt Wachhund-Test in
rls-access-inventory.spec.ts, und die drei berichtigten
Kommentarzeilen (app.module.ts, module.guard.ts, dkv.controller.ts).
Inhaltlich identisch mit dem, was bereits verifiziert wurde (891 Tests
gruen, Typpruefung sauber) — nur die Staging-Reihenfolge war fehlerhaft.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AMASaSxv5QMY7RncqZriRR
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
||||
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
||||
import { join, relative } from 'node:path';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
@@ -43,17 +43,27 @@ const DOC_PATH = join(REPO_ROOT, 'docs/mandantentrennung-zugriffsklassifikation.
|
||||
|
||||
/**
|
||||
* Dateien, in denen ein `forTenant(`-Aufruf bewusst NICHT der erkannten
|
||||
* `const <Name> = forTenant(`-Zuweisungsform folgt. Beide veroeffentlichen
|
||||
* den gebundenen Client auf dem Anfrageobjekt (`req.tenantPrisma = ...`)
|
||||
* statt ihn einer lokalen Konstante zuzuweisen — genau dieser Weg ist die
|
||||
* offene Architekturfrage aus docs/mandantentrennung-zugriffsklassifikation.md
|
||||
* ("Was diese Etappe NICHT entscheidet"), hier bewusst offen gehalten statt
|
||||
* stillschweigend als Erkennungsluecke durchzurutschen.
|
||||
* `const <Name> = forTenant(`-Zuweisungsform folgt.
|
||||
*
|
||||
* Bis 260911-e2s standen hier zwei Dateien (`tenant.middleware.ts`,
|
||||
* `tenant.guard.ts`): beide veroeffentlichten einen gebundenen Client auf
|
||||
* dem Anfrageobjekt statt ihn einer lokalen Konstante zuzuweisen — der Weg
|
||||
* war die offene Architekturfrage aus
|
||||
* docs/mandantentrennung-zugriffsklassifikation.md ("Was diese Etappe NICHT
|
||||
* entscheidet").
|
||||
*
|
||||
* Die Frage ist mit 260911-e2s (Aufgabe 2) ENTSCHIEDEN: die
|
||||
* dienst-interne Bindung (ein Klient je Methode, wie es alle neun vor
|
||||
* diesem Bereich umgestellten Bereiche bereits vormachen) ist die
|
||||
* Konvention; der Guard erzeugt ueberhaupt keinen Client mehr, die
|
||||
* gleichlautende, nie verdrahtete Middleware ist geloescht. Diese Liste
|
||||
* startet deshalb leer und bleibt es, bis ein begruendeter neuer
|
||||
* Ausnahmefall auftritt — dieselbe Form wie
|
||||
* `INTERACTIVE_TRANSACTION_EXCEPTIONS` unten. Der Test
|
||||
* "keine veraltete Ausnahmeliste" unter dieser Datei stellt sicher, dass ein
|
||||
* kuenftiger Eintrag nicht unbemerkt veraltet.
|
||||
*/
|
||||
const FORTENANT_ASSIGNMENT_EXCEPTIONS = new Set([
|
||||
'apps/api/src/tenant/tenant.middleware.ts',
|
||||
'apps/api/src/tenant/tenant.guard.ts',
|
||||
]);
|
||||
const FORTENANT_ASSIGNMENT_EXCEPTIONS = new Set<string>([]);
|
||||
|
||||
/**
|
||||
* Dateien, in denen eine interaktive Transaktion (`empfaenger.$transaction(
|
||||
@@ -347,6 +357,28 @@ describe('mandantentrennung-zugriffsklassifikation.md deckt den Quelltext vollst
|
||||
expect(violations, violations.join('\n')).toEqual([]);
|
||||
});
|
||||
|
||||
it('keine veraltete Ausnahmeliste: jede Datei in [...FORTENANT_ASSIGNMENT_EXCEPTIONS] existiert und traegt tatsaechlich mindestens einen forTenant(-Aufruf ausserhalb der Zuweisungsform (260911-e2s, Aufgabe 2)', () => {
|
||||
const staleEntries: string[] = [];
|
||||
const analysesByFile = new Map(analyses.map((a) => [a.file, a]));
|
||||
for (const file of [...FORTENANT_ASSIGNMENT_EXCEPTIONS]) {
|
||||
if (!existsSync(join(REPO_ROOT, file))) {
|
||||
staleEntries.push(`${file}: Datei existiert nicht mehr`);
|
||||
continue;
|
||||
}
|
||||
const analysis = analysesByFile.get(file);
|
||||
const unmatched = analysis ? analysis.totalForTenantCalls - analysis.assignmentFormCalls : 0;
|
||||
if (unmatched <= 0) {
|
||||
staleEntries.push(
|
||||
`${file}: enthaelt keinen forTenant(-Aufruf ausserhalb der erkannten Zuweisungsform mehr — die Ausnahme ist ueberholt und gehoert entfernt`,
|
||||
);
|
||||
}
|
||||
}
|
||||
expect(
|
||||
staleEntries,
|
||||
`Eine Ausnahmeliste, die Dateien nennt, die es nicht gibt oder die keinen Ausnahmefall mehr enthalten, ist dieselbe tote Verdrahtung, die 260911-e2s im Guard entfernt hat:\n${staleEntries.join('\n')}`,
|
||||
).toEqual([]);
|
||||
});
|
||||
|
||||
it('jede interaktive Transaktion (empfaenger.$transaction(async ...)) entspricht einer der erkannten Empfaengerformen oder steht in der begruendeten Ausnahmeliste (260909-jts, Befund B)', () => {
|
||||
const violations: string[] = [];
|
||||
for (const a of analyses) {
|
||||
|
||||
Reference in New Issue
Block a user