feat: add user-scope design rules for new functionality in documentation
This commit is contained in:
@@ -1032,6 +1032,19 @@ Kvitto-alias lagrar mappningar från kvittots råtext till produkt-ID. Nä
|
||||
|
||||
## Arkitektur: User-scope för baslager och matplan (2026-04-22)
|
||||
|
||||
> **Designregel: User-scope vid ny funktionalitet**
|
||||
>
|
||||
> All data som tillhör en specifik användare **måste** ha ett `userId`-fält med FK till `User` och user-filtrering i service-lagret. Följ detta mönster vid all ny funktionsutveckling:
|
||||
>
|
||||
> 1. **Databasschema:** `userId Int` med `@relation` till `User`, icke-null. Sammansatt `@@unique([userId, ...])` om raden ska vara unik per användare.
|
||||
> 2. **Migration:** Backfill till första användaren för befintliga rader innan kolumnen sätts NOT NULL.
|
||||
> 3. **Backend service:** Alla `findAll`/`findOne`/`create`/`delete` filtrerar eller sätter `where: { userId }`. Returnera aldrig andra användares data.
|
||||
> 4. **Controller:** Extrahera `userId` via `@CurrentUser()` eller `@Request() req` — aldrig från body (säkerhetsrisk).
|
||||
> 5. **Globala vs. privata resurser:** Produkter och kategorier är globala. Inventarie, baslager, matplan och användarspecifika produkter (`isPrivate: true`) är user-scopade.
|
||||
> 6. **Privata produkter** (`isPrivate: true`): skapas via `POST /products/private`, visas via `GET /products/mine`. Normaliserat namn prefixas med `private:{userId}:` för att undvika kollision med globala produkter.
|
||||
>
|
||||
> **Kontrollera alltid:** Kan två användare se varandras data? Om ja — lägg till `userId`-scope.
|
||||
|
||||
### Bakgrund och beslut
|
||||
|
||||
Baslager (`PantryItem`) och matplan (`MealPlanEntry`) var ursprungligen globala — delade av alla användare. Det skapade problem när flera användare loggade in eftersom de såg och påverkade varandras data.
|
||||
|
||||
Reference in New Issue
Block a user