# Architektur Die Anwendung trennt Hosts, UI, API, Verträge und Datenbankzugriff strikt. ```text Bsevita.Library.Maui -> Bsevita.Library.Ui -> Bsevita.Library.Models Bsevita.Library.Web -> Bsevita.Library.Ui -> Bsevita.Library.Models Bsevita.Library.Api -> Bsevita.Library.Models Bsevita.Library.Api -> EF Core -> SQL Server LocalDB ``` ## Projekte - `Bsevita.Library.Models`: gemeinsame Request-/Response-Modelle, keine Datenbankabhängigkeit. - `Bsevita.Library.Ui`: Razor Class Library mit Seiten, Layouts, Komponenten und API-Clients. - `Bsevita.Library.Web`: Browser-Host für die UI; registriert `HttpClient` zur lokalen API. - `Bsevita.Library.Maui`: nativer Host für dieselbe UI; löst die API-Adresse je Plattform auf. - `Bsevita.Library.Api`: Controller, Services, EF Core und zentrale Fehlerbehandlung. - `Bsevita.Library.Api.Tests`: API-Workflowtests mit Testdatenbank. ## Datenfluss 1. UI-Seiten rufen typed API-Clients aus `Bsevita.Library.Ui.Services` auf. 2. API-Clients senden HTTP-Requests an `/api/...` und lesen JSON oder ProblemDetails. 3. Controller delegieren an Services; Fachlogik liegt nicht im Controller. 4. Services verwenden `LibraryDbContext` und mappen Entities auf Models. 5. SQL Server speichert das Database-First-Schema aus `database/create_database.sql`. ## Datenbank `database/create_database.sql` ist die Schema-Quelle. Der generierte EF-Code liegt unter `src/Bsevita.Library.Api/Data/Generated` und wird nicht für Fachlogik erweitert. Wichtige Regeln liegen zusätzlich in der Datenbank: - `UX_Students_CardNumber`: eindeutige Ausweisnummern. - `UX_Books_BookNumber`: eindeutige Buchnummern. - `UX_Loans_ActiveBook`: höchstens eine aktive Ausleihe pro Buch. ## Transaktionen und Fehler Ausleihe, Rückgabe und Löschoperationen laufen in serialisierbaren Transaktionen, wenn eine relationale Datenbank verwendet wird. Vor dem Schreiben wird der aktuelle Zustand erneut geprüft. Fachfehler werden zentral in `application/problem+json` übersetzt. Die UI zeigt diese Fehler über die gemeinsamen API-Clients an. ## Grenzen - Die UI referenziert weder `Bsevita.Library.Api` noch `LibraryDbContext`. - API-Verträge sind nicht die EF-Entities. - Löschen deaktiviert Schüler und Bücher, damit historische Ausleihen erhalten bleiben.