ChampionChecker ist eine digitale Lösung zur Organisation und Auswertung des jährlichen Sportfests der BBSOVG Magdeburg. Die bisherige papierbasierte Verwaltung wird durch eine moderne Webanwendung ersetzt, die eine effizientere Organisation, Echtzeit-Auswertung und bessere Zusammenarbeit zwischen Lehrkräften und Wettkampfleitern ermöglicht. Diese Dokumentation beschreibt die mit .NET 9 entwickelte Backend-API, die als zentrale Schnittstelle zur Speicherung, Verarbeitung und Bereitstellung von Sportfest-Daten dient.
- Framework: .NET 9 mit C#
- Hosting: Azure
- Datenbank: Azure SQL mit Entity Framework Core
- In
Program.cswerden alle wichtigen Anwendungskonfigurationen vorgenommen. - ConnectionString:
- Entwicklungsumgebung: Gespeichert in
appsettings.json(nicht im Repository enthalten). - Produktionsumgebung: Wird von Azure bereitgestellt, um Anwendungsgeheimnisse zu schützen.
- Entwicklungsumgebung: Gespeichert in
- In
Program.cswerden alle Klassen und Repositories dem DI-Container hinzugefügt. - Ermöglicht die flexible Nutzung von Abhängigkeiten wie
DbContextoder Logger in verschiedenen Klassen.
-
DbContext:
ChampionCheckerDbContextrepräsentiert die Datenbank. -
Identity-DbContext:
ChampionCheckerIdentityDbContextverwaltet die Authentifizierung und Autorisierung. -
Model-Validierung: Die Validität der einzelnen Models wird durch das Setzen von Data-Annotation-Attributen definiert (z. B.
[Required],[MinLength]). Vor der Ausführung der Controller-Endpunkte wird durch das[ValidateModelAttribute]das Model auf diese Kriterien geprüft. -
Beziehungen: Konfigurationen (1:1, 1:n, n:m) im
Configuration-Ordner. -
Migrations:
- Entity Framework Core ermöglicht es, Änderungen am Datenbankschema nachzuvollziehen und gezielt anzuwenden.
- Eine Migration speichert Änderungen wie neue Tabellen, Spalten oder Beziehungen in einer Versionshistorie.
- Die
Up-Methode enthält neue Änderungen (z. B. Hinzufügen einer Spalte), während dieDown-Methode den vorherigen Zustand wiederherstellen kann. - Durch
dotnet ef migrations add <MigrationName>wird eine neue Migration erstellt, und mitdotnet ef database updatewird sie in die Datenbank übertragen. - Dieses Konzept erlaubt eine kontrollierte Weiterentwicklung der Datenbankstruktur, ohne bestehende Daten zu verlieren.
-
Visualisierung des Datenbankschemas (ChampionCheckerDbContext)

-
Visualisierung des Schemas für Nutzer, Autorisierung und Authentifizierung (ChampionCheckerIdentityDbContext)

- Kapselt den Datenbankzugriff, um Trennung von Logik und Persistenz zu gewährleisten.
- Beispiel:
var classes = _dbContext.Classes.ToList();
- SaveChanges() speichert Änderungen in der Datenbank.
- Endpunkte für Klassen:
- Alle Klassen abrufen:
GET api/class - Datenformat: JSON
- Alle Klassen abrufen:
- JSON Patch-Dokumente werden für Teil-Updates genutzt (JSON Patch).
- Wird durch
AuthRepositoryundAuthControllerverwaltet. - Basierend auf ASP.NET Core Identity (
UserManager,SignInManager).
- Erfolgreiches Login setzt ein Authentifizierungs-Cookie "ChampionCheckerCookie", das die Sitzung verwaltet.
- Beim Logout wird das Cookie gelöscht.
- Rollen werden bei der Registrierung zugewiesen.
- Über
GetUserRoleimAuthControllerabrufbar.
- Nur notwendige Daten werden an Clients gesendet.
- Mapping zwischen Model und DTO erfolgt in
AutoMapper.cs.
- Globale Fehlerbehandlung in
ErrorHandler.cs. - Nicht behandelte Exceptions werden zentral abgefangen.
- Benchmarks für Repositories im separaten Benchmark-Projekt.
- Continuous Integration/Continuous Deployment (CI/CD) automatisiert den Entwicklungsprozess.
- Code-Änderungen durchlaufen automatisierte Tests und Deployment-Schritte.
- Die Pipeline
main_championchecker.ymlwird bei jedem Commit ausgeführt. - Enthält Schritte für Build, Test und Deployment in Azure.
- xUnit wird für Unit Tests verwendet.
- Tests nutzen eine In-Memory-Datenbank zur Simulation von CRUD-Operationen.
- Namensschema:
Methode_Szenario_Ergebnis. - Arrange – Act – Assert-Muster:
- Arrange: Testumgebung vorbereiten.
- Act: Methode aufrufen.
- Assert: Erwartetes Ergebnis prüfen.
[Fact]
public void CreateStudent_ValidData_ReturnsSuccess()
{
// Arrange
var dbContext = GetInMemoryDbContext();
var repository = new StudentRepository(dbContext);
// Act
var result = repository.Create(new Student { Name = "Noah", Age = 23 });
// Assert
Assert.NotNull(result);
Assert.Equal("Noah", result.Name);
}