Commit Graph

49 Commits

Author SHA1 Message Date
beo3000 3b12a82982 submit gifs by URL:
UI (Submit.razor)
  - Toggle zwischen "Datei" und "URL" Modus
  - URL-Eingabefeld mit Validierung (nur HTTP/HTTPS)
  - Beide Modi teilen Submit-Button und Erfolgsanzeige

  Service (IClubGifService, ClubGifService)
  - Neue Methode SubmitAnonymousFromUrlAsync(token, url, name)
  - Nutzt bestehende SaveGifFromUrlAsync von MediaStorageService

  Serverseitige Validierung (bereits in MediaStorageService vorhanden):
  - Content-Type Prüfung: nur image/gif, video/mp4, video/webm
  - Dateigröße max. 20MB
  - Datei wird nach Download nochmals auf Größe geprüft
  - Ungültige Content-Types werden mit Exception abgelehnt
2026-01-01 10:58:02 +01:00
beo3000 49a03a8fbb fix Bell-Handling 2025-12-30 20:37:21 +01:00
beo3000 9aee6b50c0 add gif-Seeder and gif-Templates:
Zusammenfassung der Änderungen

  Template-GIF Seeding implementiert:

  1. DemoSeeder.cs aktualisiert:
  - SeedTemplateGifsAsync() - Öffentliche Methode für externes Seeding
  - SeedTemplateGifsInternalAsync() - Kopiert GIFs vom Template-Ordner und erstellt DB-Einträge
  - DeleteClubGifsAsync() - Löscht GIF-Dateien und DB-Einträge beim Reset
  - ResetDemoClubAsync() - Löscht nun auch GIFs und seedet sie neu
  - SeedAsync() - Seedet Template-GIFs beim Demo-Club-Setup

  2. IClubGifService.cs erweitert:
  - SeedTemplateGifsAsync(Guid clubId) - Neue Interface-Methode

  3. ClubGifService.cs erweitert:
  - SeedTemplateGifsAsync() implementiert - Liest giftemplates.json, kopiert Dateien und erstellt ClubGif-Einträge

  4. ClubService.cs aktualisiert:
  - Injiziert IClubGifService
  - CreateAsync() seedet automatisch Template-GIFs für neue Clubs

  Ablauf:

  1. Neuer Club: Template-GIFs werden automatisch kopiert nach wwwroot/club-media/{LoginName}/gifs/
  2. Demo-Reset: Alte GIFs werden gelöscht, Templates neu kopiert
  3. Demo-Seed: Template-GIFs werden geseedet falls noch keine vorhanden

  Template-Struktur:

  wwwroot/club-template/gifs/
  ├── giftemplates.json        # Definition der GIFs
  ├── 44f5bc11-...-d1215.gif   # Strike GIF
  └── 297970f3-...-a2a93.gif   # NoWood GIF
2025-12-30 18:00:11 +01:00
beo3000 752523fe78 added gif-Feature:
Summary of Changes:

  Phase 1-3 (Domain/Infrastructure/Application):
  - ThrowEventType enum with Strike, Circle, Bell, Gutter flags
  - ClubGif, ClubGifRating, GifSubmissionToken entities
  - EF configurations with proper indexes
  - ClubGifRepository with weighted random selection
  - MediaStorageService for file storage (wwwroot/club-media/{LoginName}/gifs/)
  - ClubGifService with rating system and auto-disable at -5 threshold

  Phase 4-5 (Admin UI & Playback):
  - Admin page at /club/{ClubId}/admin/gifs with Upload, Import, Edit, Token management
  - QR code generation for submission tokens
  - GifPlayer component with overlay, rating buttons, and dismiss
  - Fluxor state management (GifState, actions, reducers, effects)

  Phase 6 (Anonymous Submission):
  - Public page at /gif/submit/{Token} with EmptyLayout
  - Token validation and file upload

  Phase 7 (Game Integration + Migration):
  - Database migration AddClubGifFeature applied
  - GameEffects.TriggerGifForEventsAsync triggers GIFs on special throws
  - SignalR broadcast via BroadcastGifTriggeredAsync to all clients
  - DayDetails.razor includes GifPlayer and handles SignalR GIF events

  Key Features:

  - GIFs play on Strike (alle 9), Circle (Kranz), Bell (Glocke), Gutter (Rinne)
  - Weighted random selection based on ratings
  - Real-time sync across all connected clients via SignalR
  - Thumbs up/down rating with auto-disable at -5
  - Max file size: 20MB, Video duration: 15s
  - Supports GIF, MP4, WebM formats
2025-12-30 14:57:06 +01:00
beo3000 0e4e1530ed added LoginName for Clubs 2025-12-30 11:57:01 +01:00
beo3000 1fbf4763d9 add dayStatisticChart 2025-12-29 16:11:22 +01:00
beo3000 21130895d4 add statistics:
Erfasste Metriken:
  - ThrowCount, PinCount, ClearedCount, GutterCount, CircleCount, StrikeCount, BellCount

  Widget zeigt:
  - Jahres-Übersicht (Spiele, Würfe, Kegel, Durchschnitt)
  - Top 5 Kegler Rangliste
  - Monatstrend-Tabelle
2025-12-29 15:27:25 +01:00
beo3000 f5d2ceb628 fix unit tests 2025-12-29 14:33:53 +01:00
beo3000 e2d1792cec fix deathbox, first player starts with a X 2025-12-29 09:59:20 +01:00
beo3000 7795c3064f fix deathbox handling 2025-12-28 22:43:21 +01:00
beo3000 cafd38519f add deathbox 2025-12-28 21:25:04 +01:00
beo3000 b8bd1b0939 fix ShitGameLogic 2025-12-28 17:23:10 +01:00
beo3000 fc97a266d4 create and assign expenses:
Datenfluss bei Gutter:
  Spieler wirft Gosse
    → RecordThrowAction (IsGutter=true)
    → HandleRecordThrow
    → FireThrowTriggersAsync
      → GameEventService.RegisterGutterAsync
        → TriggerService.FireTriggerAsync
          → PersonExpense in DB gespeichert ✓
          → PersonExpenseDto zurückgegeben
      → dispatcher.Dispatch(TriggerExpensesCreatedAction)
        → DayReducer fügt Expenses zu SelectedDayExpenses hinzu
          → UI aktualisiert sich automatisch ✓
2025-12-28 15:41:57 +01:00
beo3000 fcfbbae94e fix CurrentClub Id
Änderungen:

  1. UserProfile.cs:47-52 - Neues Feld CurrentClubId (nullable FK zu Club)
  2. CustomClaimsPrincipalFactory.cs:38-50 - Lädt jetzt CurrentClub und setzt current_club_id/current_club_name Claims bei jeder Cookie-Erneuerung
  3. UserService.cs:113-118 - Speichert CurrentClubId bei Login, nutzt jetzt einfaches SignInAsync (Claims kommen via Factory)
  4. Migration AddCurrentClubIdToUserProfile erstellt + angewandt

  Ablauf jetzt:
  - Login → CurrentClubId wird in DB gespeichert
  - Cookie-Erneuerung → CustomClaimsPrincipalFactory liest CurrentClubId aus DB → Claims bleiben erhalten
2025-12-28 11:25:30 +01:00
beo3000 44b04ec2de dev Trigger / Expense Masterdata, Seeder for triggers 2025-12-28 11:16:51 +01:00
beo3000 954c2589e6 added Trigger and Trigger/Expense Releations 2025-12-28 10:18:39 +01:00
beo3000 22fbb79801 added GameAction Framework 2025-12-28 08:34:23 +01:00
beo3000 37b8fc0e8d add: IsCleared 2025-12-27 22:46:54 +01:00
beo3000 03364291aa fix undo/redo handling 2025-12-27 21:46:20 +01:00
beo3000 e50b13f092 add undo/redo 2025-12-27 18:23:24 +01:00
beo3000 48b96cec0c fix gutter 2025-12-27 16:59:07 +01:00
beo3000 f297317b71 call gamelogic 2025-12-27 14:39:15 +01:00
beo3000 92dfb47a08 refactoring GameSetup 2025-12-27 13:15:18 +01:00
beo3000 f1880f08a8 save setup model 2025-12-27 11:45:19 +01:00
beo3000 9f53aa0b04 fix set club guid 2025-12-27 10:54:21 +01:00
beo3000 a84b192055 Complete phase H9: DB Persistence & Recovery
- Extend Game entity with GameType, Status, StartedAt, CompletedAt, RowVersion
- Add GameConfiguration with RowVersion for optimistic concurrency
- Create IGamePersistenceService interface
- Implement GamePersistenceService with CRUD operations
- Create GameStateSerializationDto for JSON serialization
- Extend GameEffects with full persistence lifecycle:
  - HandleStartGame: Creates game in DB
  - HandleEndGame: Updates status to Completed/Aborted
  - HandleLoadActiveGame: Recovery from page reload
  - HandleRecordThrow: Debounced save (500ms)
  - HandleSaveGameState: Explicit save with concurrency check
- Add migration ExtendGameEntity

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 09:23:58 +01:00
beo3000 aefa676d62 Fix: Register GameLogicServices as transient
Scoped services can't be resolved from singleton (GameDefinitionRegistry).
Logic services are stateless, so transient is appropriate.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 09:03:50 +01:00
beo3000 264f91d543 Complete phase H5: Scheiss-Spiel + Trigger-Integration
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 08:16:22 +01:00
beo3000 8824162cd9 Add Training Game (Phase H4)
- TrainingGameDefinition with game type metadata
- TrainingGameModel + TrainingPlayerStats for stats tracking
- TrainingGameLogicService implementing game logic
- TrainingSetup.razor for config (ThrowMode, ThrowsPerRound, ParticipantsMode)
- TrainingBoard.razor showing player stats table with totals/averages
- Game type registration in Program.cs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 14:49:26 +01:00
beo3000 0207c5fe80 Add Game Definition Framework (Phase H3)
- IGameDefinition interface in Domain
- GameProgress.cs with throw state records
- IGameLogicService interface
- GameDefinitionRegistry for polymorphic game types
- GameModelFactory for JSON serialization
- DI registration extensions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 14:38:21 +01:00
beo3000 e8df51d67f Add Trigger-Engine (Phase H0)
- ITriggerRepository interface + TriggerRepository implementation
- ITriggerService interface + TriggerService implementation
- TriggerDto, ExpenseTriggerLinkDto, FireTriggerDto
- FireTriggerAsync creates PersonExpenses with multiplier
- DI registration for both services
- Fix test mock for IClubRepository

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 14:10:28 +01:00
beo3000 29cebcbb81 ensure unique names for club,person,expense 2025-12-26 13:39:23 +01:00
beo3000 0911236a0d feat(G8): add invite link handling for club membership 2025-12-25 21:17:00 +01:00
beo3000 8e2342fd74 avoid duplicate person names 2025-12-25 19:00:42 +01:00
beo3000 0a9205a2f3 Complete phase G4: Membership Services
- UserService: RequestClubMembership (by ID, name, invite token),
  ApproveMembership, RejectMembership, GetPendingMemberships
- ClubService: CreateInvitation, GetInvitationByToken, ValidateInvitation,
  IncrementInvitationUsage, GetInvitationsByClub, GetByName
- Add PendingMembershipDto, ClubInvitationDto, CreateClubInvitationDto
- Update tests to pass AppDbContext to ClubService

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 18:27:40 +01:00
beo3000 32c48d2bc3 fix namespaces
add AccessDenied Page
2025-12-25 18:15:21 +01:00
beo3000 7c9f3c36d9 Add Dashboard page (F1)
- DashboardDto, IDashboardService, DashboardService
- Summary cards: members, guests, days, open expenses
- Recent days list with navigation
- Top penalty recipients list
- Home redirects to /dashboard
- Updated HomePageTests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 15:26:35 +01:00
beo3000 c3839d2363 fix permissions;
Summary of all fixes

  3 files changed:

  1. src/Koogle.Application/Services/UserService.cs:140-171
    - GetByIdentityUserIdAsync now includes .Include(p => p.Clubs) and maps ClubMemberships
  2. src/Koogle.Web/Store/AuthState/AuthEffects.cs:53-73
    - Merges club-specific roles from ClubMemberships into AuthState roles
  3. src/Koogle.Infrastructure/Security/ClubRoleRequirement.cs:17-114
    - Changed ClubRoleHandler to extend AuthorizationHandler<ClubRoleRequirement> (no resource)
    - Reads current_club_id from claims to determine club context
    - Added ClubRoleResourceHandler for resource-based auth (explicit clubId)
  4. src/Koogle.Infrastructure/DependencyInjection.cs:72
    - Registered ClubRoleResourceHandler

  The [Authorize(Policy = "ClubViewer")] attribute now uses current_club_id claim set during login to check club roles.
2025-12-24 15:44:52 +01:00
beo3000 ad3ac3185c add password reset 2025-12-23 17:09:24 +01:00
beo3000 b4818efc1a added club relations to datamodel
mod UserService
2025-12-23 15:05:22 +01:00
beo3000 5c6860a4ad mod DI Containers 2025-12-23 11:20:18 +01:00
beo3000 be0fa19371 add Mapping-Profiles 2025-12-23 11:13:48 +01:00
beo3000 76c5d302ac added app Services 2025-12-23 11:04:16 +01:00
beo3000 f05ee0a662 add Application.Interfaces 2025-12-22 22:00:49 +01:00
beo3000 57146a382a add comments 2025-12-22 21:42:25 +01:00
beo3000 7cab8642d5 add DTOs 2025-12-22 21:36:28 +01:00
beo3000 d8c41ad712 add fluxor AuthState 2025-12-21 22:14:00 +01:00
beo3000 8a92555ce9 add authorizazion und authentication 2025-12-21 19:31:54 +01:00
beo3000 6c43c85cb4 mod project structure
ef migrations
2025-12-21 09:59:40 +01:00