feat: implement alias-scope management for admin, enhance category chip handling, and upgrade dependencies
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
# Session Checkpoint (2026-05-12)
|
||||
|
||||
> Föregående checkpoint: [SESSION_CHECKPOINT_2026-05-11.md](SESSION_CHECKPOINT_2026-05-11.md)
|
||||
|
||||
## Status
|
||||
|
||||
- Alla ändringar är lokalt implementerade och verifierade (tester gröna, inga type-fel, 0 npm-sårbarheter).
|
||||
- Ej committat/pushat.
|
||||
|
||||
## Klart i denna session
|
||||
|
||||
### 1. Alias-scopehantering (admin kan höja privat → globalt)
|
||||
|
||||
**Backend (`receipt-alias`):**
|
||||
- `UpdateReceiptAliasDto` utökat med `isGlobal?: boolean` (`@IsBoolean()`).
|
||||
- `receipt-alias.service.ts`: `update()` hanterar scope-byte med:
|
||||
- Admin-only-regel: vanlig användare → `ForbiddenException`.
|
||||
- Global → privat utan owner → `BadRequestException`.
|
||||
- Beräknar `nextIsGlobal` + `nextOwnerId` korrekt och sparar.
|
||||
- Konfliktcheck baseras på nästa scope, inte gammalt.
|
||||
|
||||
**Admin-UI (`flutter/lib/features/admin/presentation/admin_aliases_panel.dart`):**
|
||||
- Edit-dialog har scope-switch.
|
||||
- Switch är **låst (disabled)** om aliaset redan är globalt — endast privat → global är möjligt.
|
||||
- Subtitel förklarar läget dynamiskt.
|
||||
- Bekräftelse-chip visas i listan i 6 sekunder efter genomförd scope-ändring.
|
||||
- `_scopeChangedAliasId` / `_scopeChangedToGlobal` state-fält med Timer + dispose-cleanup.
|
||||
|
||||
**Admin repository (`flutter/lib/features/admin/data/admin_repository.dart`):**
|
||||
- `updateReceiptAlias` tar emot `bool? isGlobal` och inkluderar det i PATCH-body.
|
||||
|
||||
**Tester (16/16 passerar):**
|
||||
- `receipt-alias.service.spec.ts`: admin kan höja privat → global; användare blockeras; global → privat utan owner ger `BadRequestException`.
|
||||
- `receipt-alias.security.spec.ts`: controller delegerar DTO med `isGlobal` korrekt.
|
||||
|
||||
### 2. Kategori-chip fallback
|
||||
|
||||
- Den gemensamma chip-buildern returnerar nu `SizedBox.shrink()` vid tom kategoriväg — "okänd"-chip visas inte längre i admin- eller importpaneler.
|
||||
|
||||
### 3. Beroendehärdning
|
||||
|
||||
**recipe-app backend:**
|
||||
- Uppgraderat till **NestJS 11** (`@nestjs/common/core/platform-express/testing` 11.1.19, `@nestjs/jwt` 11.0.2, `@nestjs/passport` 11.0.5).
|
||||
- `multer` uppgraderat till **2.1.1** (åtgärdar high-severity CVE i transitivt beroende).
|
||||
- `@types/express` → **5.0.5**, `@nestjs/cli` → **11.0.21**, `@nestjs/schematics` → **11.1.0**.
|
||||
- `jwt.strategy.ts`: fail-fast check för `JWT_SECRET` + typed `secretOrKey`.
|
||||
- `JWT_SECRET: ci-test-secret` satt i CI-env i `.gitea/workflows/test.yml`.
|
||||
- `npm audit --audit-level=high` = **0 sårbarheter**.
|
||||
|
||||
**microservice-importer backend:**
|
||||
- Samma uppgradering till Nest 11 + multer 2.1.1 + `@types/express` 5.
|
||||
- `npm audit --audit-level=high` = **0 sårbarheter**.
|
||||
|
||||
### 4. Quality-gate scripts
|
||||
|
||||
**recipe-app/backend/package.json** – nya scripts:
|
||||
|
||||
| Script | Syfte |
|
||||
|---|---|
|
||||
| `prisma:validate` | `prisma validate --schema prisma/schema.prisma` |
|
||||
| `typecheck` | `tsc --noEmit` |
|
||||
| `audit:high` | `npm audit --audit-level=high` |
|
||||
| `quality:ci` | Kedja: validate → generate → typecheck → test → build → audit |
|
||||
|
||||
**recipe-app/.gitea/workflows/test.yml** – uppdateringar:
|
||||
- Prisma-steg kör `npm run prisma:validate`.
|
||||
- Audit-steg kör `npm run audit:high`.
|
||||
- Nytt **Typecheck backend**-steg i PR-snabbjobb och push-fulljobb.
|
||||
|
||||
**microservice-importer/backend/package.json** – nya scripts:
|
||||
|
||||
| Script | Syfte |
|
||||
|---|---|
|
||||
| `typecheck` | `tsc --noEmit` |
|
||||
| `audit:high` | `npm audit --audit-level=high` |
|
||||
| `quality:ci` | Kedja: typecheck → build → audit |
|
||||
|
||||
**microservice-importer/.github/workflows/test.yml** – uppdateringar:
|
||||
- `npm install` → `npm ci`.
|
||||
- Prisma/test-steg ersatta med: typecheck → build → audit.
|
||||
- `continue-on-error` borttagen från build.
|
||||
|
||||
## Ändrade filer (recipe-app)
|
||||
|
||||
- `backend/src/receipt-alias/dto/update-receipt-alias.dto.ts`
|
||||
- `backend/src/receipt-alias/receipt-alias.service.ts`
|
||||
- `backend/src/receipt-alias/receipt-alias.service.spec.ts`
|
||||
- `backend/src/receipt-alias/receipt-alias.security.spec.ts`
|
||||
- `backend/src/auth/jwt.strategy.ts`
|
||||
- `backend/package.json`
|
||||
- `backend/package-lock.json`
|
||||
- `.gitea/workflows/test.yml`
|
||||
- `flutter/lib/features/admin/data/admin_repository.dart`
|
||||
- `flutter/lib/features/admin/presentation/admin_aliases_panel.dart`
|
||||
- `TEKNISK_BESKRIVNING.md`
|
||||
- `NEXT_STEPS.md`
|
||||
- `_archive/docs/SESSION_CHECKPOINT_2026-05-12.md` (denna fil)
|
||||
|
||||
## Ändrade filer (microservice-importer)
|
||||
|
||||
- `backend/package.json`
|
||||
- `.github/workflows/test.yml`
|
||||
- `TEKNISK_BESKRIVNING.md`
|
||||
- `next_steps_MSImporter.md`
|
||||
|
||||
## Snabb återstart nästa gång
|
||||
|
||||
```bash
|
||||
# Verifiera status
|
||||
cd recipe-app/backend
|
||||
npm run quality:ci
|
||||
|
||||
cd ../../microservice-importer/backend
|
||||
npm run quality:ci
|
||||
```
|
||||
|
||||
Flutter-analys:
|
||||
```bash
|
||||
cd recipe-app/flutter
|
||||
flutter analyze lib/features/admin/presentation/admin_aliases_panel.dart
|
||||
```
|
||||
|
||||
Alias-tester:
|
||||
```bash
|
||||
cd recipe-app/backend
|
||||
npm test -- src/receipt-alias/receipt-alias.service.spec.ts src/receipt-alias/receipt-alias.security.spec.ts --runInBand
|
||||
```
|
||||
|
||||
## Nästa rekommenderade steg
|
||||
|
||||
1. Commit och push av samtliga lokala ändringar.
|
||||
2. Deploy till produktionsmiljö och verifiera alias-flöde med riktiga kvitton.
|
||||
3. Manuell verifiering: admin kan höja privat → globalt via UI; vanlig användare kan inte.
|
||||
4. Widgettester för alias-panelens switch (privat → global, disabled-state om globalt).
|
||||
Reference in New Issue
Block a user