Files
SlipItIn/README.md
Tim Krampitz af6528ee68
Some checks failed
Build / build (pull_request) Has been cancelled
Tech-Debt-Cleanup: Doku, Security-Hardening, Server-Validierung, Client-Stabilitaet
Doku/Repo:
- README.md mit Setup, Run-Anleitung, Konfiguration und Sprachpolicy neu geschrieben
- appsettings.json: committed JWT-Key und irreführende LocalDB-Connection-String entfernt
- appsettings.Development.json: expliziter Dev-Only JWT-Key hinterlegt
- build.yml: Build-CI für master/PRs hinzugefügt
- slnx/aspire.config.json: Pfad-Casing korrigiert (Linux-kompatibel)
- .gitignore: Kommentar zu den Legacy-SQLite-Einträgen

Server:
- Jwt:Key ist in Production Pflicht (Fail-fast statt Fallback-Secret)
- Passwort-Mindestlänge 8 Zeichen bei Registrierung
- StartGame: nur aus Lobby, mindestens 2 Spieler
- SetPlayerReady: gameId/Status geprüft
- SubmitSlip: Game-/Round-Status, Round-Membership, IsUsed validiert
- CreateChallenge: Round-Bindung, kein Self-Challenge, nur gespielte Karten, keine Doppel-Challenges
- ResolveChallenge: Pending-Guard, Scoring (Score/SuccessfulSlips/FailedSlips), Approved-Transfer gefixt
- GetPlayerHand: nur Karten der aktiven Runde
- RoundTimeRemaining: StartedAt wird bei Round-Aktivierung gesetzt
- Lobby-Code: crypto-random mit Kollisions-Retry
- EF: explizite NpgsqlDataSource-Auflösung aus DI
- Hub: Reconnect-Gruppenbeitritt, ConnectionId-Cleanup beim Disconnect, ChallengingPlayerName gesetzt, SlipChallenged/ChallengeResolved konsistent

Client:
- Offline-Start löscht Session nicht mehr (NetworkError vs. Invalid unterschieden)
- ResolveChallenge geht durch die Offline-Queue (kein Crash mehr bei Disconnect)
- Queue: Poison-Entries werden nach 3 Retries verworfen statt die Queue ewig zu blockieren
- SignalR: Verbindung wird sauber disposed/rebuildet, Token immer zur Laufzeit gelesen, Connect-Lock gegen parallele Starts
- ViewModels: Thread-Marshaling in allen Receive-Handlern, kein async void mehr
- LobbyViewModel: Logout deaktiviert den Singleton (kein stale-Navigation mehr), Reaktivierung via Activate()
- GameBoard: lokaler 1s-Timer für RoundTimeRemaining
- Overlay: x:DataType für kompilierte Bindings, Frame→Border
- csproj: Preview-Logging-Package auf 10.0.10, Template-Cruft entfernt
2026-08-22 19:37:54 +02:00

2.4 KiB

SlipItIn

Ein Echtzeit-Multiplayer-Partyspiel: Jeder Spieler erhält Phrasen-Karten und versucht, sie unbemerkt in die laufende Runde zu "slippen". Wer einen fremden Slip erkennt, kann ihn anfechten — bei einer falschen Beschuldigung wandert die Phrase allerdings zum Beschuldiger.

Tech-Stack

  • Client: .NET MAUI (.NET 10) mit CommunityToolkit.Mvvm und SignalR-Client
  • Server: ASP.NET Core 10 Web API + SignalR, EF Core mit PostgreSQL
  • Orchestrierung: .NET Aspire (SlipItIn.AppHost) startet Server inklusive PostgreSQL-Container
  • Shared: Gemeinsame Modelle und DTOs in SlipItIn.Shared

Voraussetzungen

  • .NET 10 SDK
  • Docker oder Podman (für den PostgreSQL-Container, den Aspire bereitstellt)
  • MAUI-Workload: dotnet workload install maui
  • Für den Server allein genügt die Aspire-Workload-Unterstützung des SDKs

Ausführen

dotnet run --project SlipItIn.AppHost/SlipItIn.AppHost.csproj

Der AppHost startet PostgreSQL (Container), wendet EF-Migrationen automatisch an und seedet Testdaten. Die MAUI-App verbindet sich standardmäßig mit https://localhost:7274 (Android-Emulator: http://10.0.2.2:5234).

Konfiguration

Key Zweck
Jwt:Key Signaturschlüssel für JWT (mindestens 32 Zeichen). Nicht committen — via User-Secrets oder Umgebungsvariable setzen. In Development ist ein Fallback-Key hinterlegt; in Production bricht der Server ohne konfigurierten Key den Start ab.
Jwt:Issuer / Jwt:Audience Token-Aussteller bzw. -Empfänger (Defaults: SlipItInServer / SlipItInClient)
ConnectionStrings:postgresdb Wird lokal von Aspire injiziert; muss nicht manuell gesetzt werden

Projektstruktur

  • SlipItIn/ — MAUI-Client (Views, ViewModels, Services, Offline-Queue)
  • SlipItIn.Server/ — Web API, SignalR-Hub, EF Core, Migrations
  • SlipItIn.Shared/ — Datenbank-Entitäten und SignalR-DTOs
  • SlipItIn.AppHost/ — Aspire-Orchestrierung
  • SlipItIn.ServiceDefaults/ — Geteilte Aspire-Service-Defaults
  • openwiki/ — Generierte Dokumentation (wird automatisch aktualisiert, bitte nicht von Hand editieren)

Build

dotnet build SlipItIn.slnx

Hinweise

  • Dokumentationssprache: Handgepflegte Dateien (diese README) sind Deutsch, die generierte OpenWiki-Dokumentation ist Englisch.
  • .gitignore enthält noch Einträge für slipitIn.db — ein Überbleibsel aus der ursprünglichen SQLite-Planung. Die Anwendung nutzt PostgreSQL.