Files
recipe-app/NEXT_STEPS.md
T
Nils-Johan Gynther 537a4f8ab6 feat: Implement admin user management features
- Added adminCreateUser endpoint and corresponding DTO for creating users.
- Implemented deleteUser and resetPassword functionalities for admin users.
- Introduced updateEmail functionality for admin users.
- Updated UsersService to handle user creation, deletion, password reset, and email updates.
- Modified UsersController to include new admin routes with appropriate role checks.
- Refactored frontend navigation to link to user management under profile.
- Created new profile tabs for user management and database management.
- Developed AnvandareClient component for user management, including user creation, deletion, role changes, and password resets.
- Added DatabsTab for managing product listings and merging duplicates.
- Enhanced MinProfilTab for user profile management with form handling.
2026-04-18 14:49:02 +02:00

7.1 KiB

Nästa steg

Förslag på vad vi kan ta tag i nästa gång vi öppnar projektet.
Se README.md för funktionsöversikt och TEKNISK_BESKRIVNING.md för teknisk detaljerinformation.


Status — senast genomgånget: 2026-04-18

Funktion Status
Inventorie (CRUD, konsumtion, historik) Klart
Recept (skapa, visa, importera, matchning) Klart
Snabbimport (URL/PDF/bild/ICA) Klart
Kvittoimport (Mistral AI, OCR, alias) Klart
Matplanering (veckovy, inköpslista) Klart
Matplan — portionsjustering per dag Klart
Matplan — inventariejämförelse (backend) Klart
Matplan — inventariejämförelse (frontend-vy) Klart (/⚠️/ integrerat i inköpslistan)
Baslager (lista, lägg till, ta bort) Klart
Admin: Produkter (edit, merge, duplicate, restore, reset) Klart
Admin: Bulk-kategorisering Klart
Receptredigering (frontend UX) Klart
Receptbilder (upload URL) Klart
Autentisering (JWT, Auth.js v5, User-modell) Klart
Användarprofil (firstName, lastName, email) Klart
Produktkategorier — hierarkisk struktur (3 nivåer) Klart
Kategori-seed (supplement, idempotent) Klart
Kategoritilldelning i admin-UI Klart
Taggning av produkter Klart
Näringsvärden på produkter Klart (schema + API)
Seed produktdata med kategoritilldelning ⚠️ Script klart, ej aktiverat i init
Användarspecifika produkter (UserProduct) ⚠️ Schema klart, UI basic
Användarroller (user / admin) Klart
Användarhantering i admin-UI Klart
Profilsida med flikar (Min profil / Användare / Databas) Klart
Teknisk skuld — oanvända InventoryItem-fält Klart (migration 20260418)
Teknisk skuld — redirect-routes städade Klart
Avancerad AI-integration (veckoplanering, kampanjdata) Planerad

Prioriterade förbättringar

1. Seed-data (002-seed-products.sql)

Mål: Möjliggöra demo och ny server utan manuell datainmatning.

db/init/002-seed-products.sql är inaktiverad (.disabled) tills produkterna har rätt categoryId. Skript för kategorimappning finns i db/seeds/:

  • Kör db/seeds/categories_supplement.sql → lägger till saknade kategorier
  • Kör db/seeds/seed_product_categories.sql → kopplar ~190 produkter till rätt kategori
  • Verifiera att mappningarna ser rätt ut i admin-UI (filtrera på okategoriserade)
  • Generera en ny 002-seed-products.sql med korrekt categoryId per rad (via SELECT mot live-db)
  • Ta bort .disabled-suffixet och testa fresh install

2. Användarroller och full användarhantering

Klart.

Systemet har nu fullständig rollbaserad åtkomstkontroll och ett komplett användarhanteringsgränssnitt inbyggt i profilsidan.

Rollsystemet:

  • Prisma-migration (20260418100000_add_user_role) — fältet role String @default("user") lades till på User-modellen
  • @Roles('admin')-dekoratorn (auth/decorators/roles.decorator.ts) — använder SetMetadata för att markera endpoints
  • RolesGuard (auth/roles.guard.ts) — registrerad globalt som APP_GUARD; läser rollmetadata, kastar 403 om rätt roll saknas
  • JWT inkluderar nu rolejwt.strategy.ts returnerar {userId, username, role}, auth.service.ts signerar med role i payload
  • Bootstrap-användare (users/admin-bootstrap.service.ts) — OnApplicationBootstrap skapar/uppdaterar Nadmin, Padmin, user1 och user2 vid varje uppstart via miljövariabler
  • Skyddade produkt-endpoints@Roles('admin')merge, delete, restore, reset-all, bulk-update, backfill-canonical i products.controller.ts

Backend-endpoints för användarhantering (alla kräver admin-roll):

  • GET /api/users — lista alla användare
  • PATCH /api/users/:id/role — ändra roll
  • POST /api/users — skapa ny användare (validering: unikt användarnamn och e-post)
  • DELETE /api/users/:id — ta bort användare (skyddad: kan inte ta bort sig själv)
  • POST /api/users/:id/reset-password — genererar tillfälligt lösenord, returnerar meddelandetext + lösenord
  • PATCH /api/users/:id/email — uppdatera e-postadress

Profilsidan med flikar (/profil):

  • ?tab=profil — Min profil (alla användare)
  • ?tab=anvandare — Användare (enbart admin): skapa, ta bort, rollbyte, e-postbyte, lösenordsåterställning med kopierings-modal
  • ?tab=databas — Databas (enbart admin): produktadmin (samma innehåll som /admin/products)
  • /admin/users omdirigerar till /profil?tab=anvandare
  • Navigeringslänken "👥 Användare" går direkt till /profil?tab=anvandare

3. Matplan-vy (frontend-polish)

Klart.

Inköpslistan och inventariejämförelsen är sammanslagna till en enhetlig vy med tre statusnivåer:

  • Saknas helt — visar hur mycket som behövs köpas
  • ⚠️ Delvis hemma — visar hur mycket mer som behövs + vad som finns
  • Finns hemma — markeras nedtonat, ingen köpindikering

Listan sorteras automatiskt: saknade ingredienser överst, hemma-ingredienser underst. En sammanfattningsrad visar totalt antal per statuskategori.

4. Teknisk skuld (underhåll)

Mål: Minska komplexitet och risk för buggar.

A. CanonicalNameForm och NameForm

Filerna var redan borttagna — inga aktiva imports hittades. Inget att göra.

B. Oanvända fält på InventoryItem

Följande 6 fält togs bort via Prisma-migration (20260418000000_remove_unused_inventory_fields): priority, shelfNote, isOnSale, priceLevel, proteinType, isLeftover

  • Schema, DTOs (create + update), service och frontend-typen är städade.
  • opened och suitableFor behölls — de används i UI.

C. Validering av DTO:er i admin-actions

Redan implementerat — trim() + max 100 tecken på alla fält i actions.ts. Inget att göra.

D. Routing-städning för kvitto och import

frontend/app/kvitto/page.tsx och frontend/app/recipes/import/page.tsx är borttagna. /import täcker båda use-cases via flikar.

E. Seed-data i versionshantering

data/matvaror_sverige.csv och data/seed_products.sql behålls i git för reproducerbarhet. Inga ändringar i .gitignore.

5. Avancerad AI-integration

Mål: Smarta receptförslag och veckoplanering baserat på inventarie och kampanjdata.

Nuvarande AI-funktionalitet (Mistral för kvittotolkning) är ett bra fundament. Nästa steg:

  • Receptförslag utifrån vad som finns hemma ("Vad ska jag laga idag?")
  • Veckoplanering med hänsyn till kampanjpriser (kräver extern datakälla)
  • Kräver: tydlig API-design, kostnadskontroll och eventuellt modellval per use-case

Enhetstester

Jest + ts-jest är uppsatt. Tester finns för:

  • normalize-name.ts — 10 tester
  • base.parser.ts (parseIngredientLine) — 12 tester
  • recipes.service.ts (normalizeUnit, convertUnit) — 17 tester

Kör med npm test i backend/.