Files
Stein Helge Riise ede31fbb7e Initial import
2025-11-17 08:32:46 +01:00

4.2 KiB
Raw Permalink Blame History

MinAttest Backend

Backend for MinAttest som .NET 9 Web API, EF Core (SQL Server) og .NET Aspire for lokal orkestrering (API + databaser i Docker).

Hovedpunkter

  • API under /api/v1 (uten autentisering POC).
  • EF Core med SQL Server og migrasjoner. Status på attester normaliseres automatisk ved lagring.
  • .NET Aspire AppHost starter SQL Servercontainer og injiserer connection string til API.

Struktur

  • MinAttest.sln løsning for backend
  • src/MinAttest.Api/ Web API (.http testkall, CORS, routing)
  • src/MinAttest.Domain/ domenemodeller (POCOs, enums)
  • src/MinAttest.Infrastructure/ EF Core (DbContext, migrasjoner, designtime factory)
  • MinAttest.AppHost/ .NET Aspire AppHost (Docker orkestrering: SQL Server + API)
  • MinAttest.ServiceDefaults/ felles konfig (telemetri, health, m.m.)

Forutsetninger

  • .NET SDK 9.x (dotnet --info)
  • Docker Desktop i gang (for AppHost/SQL Server)

Kjøre lokalt (anbefalt: Aspire)

  • Start alt (API + SQL Server i Docker):
    • dotnet run --project backend/MinAttest.AppHost
  • AppHost eksponerer API og oppretter databasen. API kjører Migrate() ved oppstart.

Kjøre kun API (uten Aspire)

  • Sørg for en kjørende SQL Server lokalt/ekstern.
  • Sett connection string i src/MinAttest.Api/appsettings.Development.json (felt ConnectionStrings:Default).
  • Start API: dotnet run --project backend/src/MinAttest.Api/MinAttest.Api.csproj

EF Core (migrasjoner)

  • Verktøy er installert lokalt via toolmanifest i backend/.config.
  • Kjør fra backend/ mappen:
    • Legg til migrasjon (prosjekt: Infrastructure, startup: Api):
      • dotnet tool run dotnet-ef migrations add <Navn> --project src/MinAttest.Infrastructure/MinAttest.Infrastructure.csproj --startup-project src/MinAttest.Api/MinAttest.Api.csproj --output-dir Data/Migrations
    • Oppdater database:
      • dotnet tool run dotnet-ef database update --project src/MinAttest.Infrastructure/MinAttest.Infrastructure.csproj --startup-project src/MinAttest.Api/MinAttest.Api.csproj

Viktige endepunkter (POC)

  • Health: GET /api/v1/health svarer 200 OK når API og database er tilgjengelig, ellers 503 Service Unavailable.
  • Persons: POST /api/v1/persons, GET /api/v1/persons/{id}
  • Employers: POST /api/v1/employers, GET /api/v1/employers, GET /api/v1/employers/{id}
  • Attests (lagring/lesing):
    • GET /api/v1/attests?personId=&employerId=&take=
    • GET /api/v1/attests/{id}
    • GET /api/v1/attests/{id}/download
    • POST /api/v1/attests/uploads (POC)
    • POST /api/v1/attests/uploads/{uploadId}/complete (skaper attest i DB)
  • Shares: POST/GET/DELETE /api/v1/attests/{id}/shares...
  • Verify: GET /api/v1/verify/{code}

Se også src/MinAttest.Api/MinAttest.Api.http for eksempelkall.

Health checks

  • I tillegg til APIendepunktet over, eksponeres også standard healthendepunkter via ServiceDefaults i utviklingsmiljø:
    • Readiness: GET /health inkluderer DBsjekk (EF Core AddDbContextCheck).
    • Liveness: GET /alive enkel "self"sjekk.

Navngiving av endpoints (refaktorering)

  • Extensionmetodene for routing bruker ikke lenger postfixen "Endpoints".
    • MapHealthEndpointsMapHealth
    • MapPersonsEndpointsMapPersons
    • MapEmployerEndpointsMapEmployer
    • MapShareLinksEndpointsMapShareLinks

Domenemodell (kjerne)

  • Person (Persons) ↔ Attest (Attests): 1:n (obligatorisk FK PersonId)
  • Employer (Employers) ↔ Attest: 1:n (valgfri FK EmployerId)
  • Uverifisert attest: EmployerId = null og Status = Unverified
  • Verifisert: EmployerId != null og Status = Issued (eller Revoked ved tilbaketrekking)
  • DBconstraint sikrer konsistente kombinasjoner av EmployerId/Status.

CORS (dev)

  • Devorigins er konfigurert i src/MinAttest.Api/appsettings.Development.json under Cors:AllowedOrigins.
  • Hvis ingen origins er satt, er CORS av (ingen crossorigin tillatt).

Videre

  • Auth (BankID/Entra via B2C) legges på senere.
  • Blob Storage (SAS) for reelle nedlastingslenker.
  • ProdCORS settes eksplisitt når frontenddomene er klart.