New: Reporting System

This commit is contained in:
2026-03-13 21:23:30 +00:00
committed by KoCoder
parent 4df7cc1cf7
commit a535e73c3f

View File

@@ -347,5 +347,51 @@ Es gibt 2 Möglichkeiten, wie man dieses Problem Lösen kann:
### Reporting System
Eine weitere Anforderung der Diplomarbeit war es Einträge in Modulen wie der `Hall of Fame`, dem `Schwarzen Brett` und dem Premium Bereich (`Engineer Applications`) melden zu können. Am Anfang war es wichtig, dass jeder Schnell vorrankommt, allerdings haben wir die Kommunikation Teamintern ein wenig verschlafen und dadurch ein paar Funktionen doppelt geschrieben. Dadurch kam es zu inkonsistenzen in der Verwendung der Reporting Systeme.
Angestrebt wurde folgender Ablauf für das Melden eines Eintrags:
```mermaid
sequenceDiagram
participant Module
actor User
participant ReportingComponent
participant ReportingHandler
User->>+Module: View: Entity
User->>+ReportingComponent: Report current Entity
rect rgba(0, 0, 0, 0)
ReportingComponent->>+User: Ask for reason
User->>-ReportingComponent: Enters Reason
end
ReportingComponent->>+ReportingHandler: New Report (includes entity and reason)
ReportingComponent->>-User: Done
```
Im oben dargestellten Ablaufdiagram werden das ReportingComponent und der ReportingHandler vom Reporting System über Dependency Injection bereitgestellt, nicht vom Modul selbst. Dadurch erreichen wir eine bessere Trnnung und halten das S in SOLID ein: `Single responsibility`. Die Module sind jetzt nicht mehr für das Reporting selber verantwortlich, sondern müssen nur das Reportings System einbinden.
Damit DI funktioniert muss der DI Consumer (`also das Modul, welches das Reporting System einbinden möchte`) das Interface zur Kompilierzeit sehen. Um das zu erreichen haben wir eine neue Klassenbibliothek erstellt: Sie heißt Interfaces wird per Gitea Actions automatisch in ein Nuget Paket gebaut und in der `Gitea Actions Nuget Registry` veröffentlicht. Dieses Nuget Paket wird dann in jedem Modul installiert und damit kann man Modulübergreifend auf die Services und das IReporting Component zugreifen.
Die Implementierung des IReportingComponents stellt nur eine Property (`ReportType`, welche den TypeName der Razor Komponente zurückliefert, damit Dynamic Component sie laden kann) und eine Methode (`ConstructParameterList`, welche das Parameter Dictionary erstellt. Nur zwecks Typensicherheit eingefügt) bereit. Mit dem Dynamic Component von Razor ist es möglich, per C# Code unterschiedliche Komponenten zu rendern.
```razor
@inject IReportUI ReportingComponent
<DynamicComponent Type="@ReportingComponent.ReportType" Parameters="@ReportingComponent.ConstructParameterList(_item, RenderModeBoundary)"/>
@code {
private IReportable _item;
}
```
IReportUI muss auch bereitgestellt werden, dass passiert im Startup.cs des Reporting Moduls (Admin Modul)
```c#
if (!services.Any(s => s.ServiceType == typeof(IReportUI)))
{
services.AddScoped<IReportUI, ReportComponent>();
}
```
## Event Registration
## Schwarzes Brett