diff --git a/src/Koogle.Application/Interfaces/ITriggerService.cs b/src/Koogle.Application/Interfaces/ITriggerService.cs index ae96d74..2e5869f 100644 --- a/src/Koogle.Application/Interfaces/ITriggerService.cs +++ b/src/Koogle.Application/Interfaces/ITriggerService.cs @@ -34,7 +34,7 @@ public interface ITriggerService /// /// Fires a trigger, creating PersonExpenses for all linked expenses. /// - /// The trigger type (e.g., ExpensePoint, Circle, NinePins). + /// The trigger type (e.g., ExpensePoint, Circle, Strike). /// The person receiving the expense(s). /// The day context for the expense. /// Optional game context for the expense. diff --git a/src/Koogle.Domain/Enums/ExpenseTriggerType.cs b/src/Koogle.Domain/Enums/ExpenseTriggerType.cs index a6d901f..ef4ef36 100644 --- a/src/Koogle.Domain/Enums/ExpenseTriggerType.cs +++ b/src/Koogle.Domain/Enums/ExpenseTriggerType.cs @@ -34,11 +34,11 @@ public enum ExpenseTriggerType /// /// triggered when a player bowls "alle Neune" (all nine pins). /// - NinePins, // alle Neune + Strike, // alle Neune /// /// triggered when a player bowls a "Gosse beim Anwurf" (a gutter ball on the first throw). /// - FullSink, // Gosse beim Anwurf + FullGutter, // Gosse beim Anwurf /// /// triggered when a player is eliminated from the game. /// diff --git a/src/Koogle.Domain/Interfaces/ITriggerRepository.cs b/src/Koogle.Domain/Interfaces/ITriggerRepository.cs index b36d467..4613802 100644 --- a/src/Koogle.Domain/Interfaces/ITriggerRepository.cs +++ b/src/Koogle.Domain/Interfaces/ITriggerRepository.cs @@ -88,4 +88,12 @@ public interface ITriggerRepository /// Cancellation token. /// True if deleted successfully; otherwise, false. Task DeleteAsync(Guid id, CancellationToken ct = default); + + /// + /// Retrieves first trigger of a specific trigger type + /// + /// The expense trigger type. + /// Cancellation token. + /// A Trigger or Null + Task GetByTriggerTypeAsync(ExpenseTriggerType triggerType, CancellationToken ct = default); } diff --git a/src/Koogle.Infrastructure/Security/BootstrapSeeder.cs b/src/Koogle.Infrastructure/Data/BootstrapSeeder.cs similarity index 65% rename from src/Koogle.Infrastructure/Security/BootstrapSeeder.cs rename to src/Koogle.Infrastructure/Data/BootstrapSeeder.cs index af81cc5..eb88f11 100644 --- a/src/Koogle.Infrastructure/Security/BootstrapSeeder.cs +++ b/src/Koogle.Infrastructure/Data/BootstrapSeeder.cs @@ -10,13 +10,50 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Koogle.Domain.Enums; +using Koogle.Domain.Interfaces; using Microsoft.EntityFrameworkCore; -namespace Koogle.Infrastructure.Security; +namespace Koogle.Infrastructure.Data; public static class BootstrapSeeder { + public static async Task SeedTriggersAsync(IServiceProvider services) + { + using var scope = services.CreateScope(); + + var triggerRepository = scope.ServiceProvider.GetRequiredService(); + + var data = new Dictionary>(); + data[ExpenseTriggerType.Gutter] = new Tuple("Gosse / Rinne", "Ereignis wird ausgelöst, wenn der Wurf mit Rechter- oder Linker-Rinne abgeschlossen wird."); + data[ExpenseTriggerType.Absent] = new Tuple("Abwesenheit", "Ereignis wird für Club-Mitglieder ausgelöst, wenn ein Spieltag beendet wird und am Spieltag nicht teilgenommen wurde."); + data[ExpenseTriggerType.Bell] = new Tuple("Klingel / Glocke", "Eregenis wird ausgelöst, wenn beim Wurf zusätzlich die Klingel oder Glocke aktiviert wird."); + data[ExpenseTriggerType.NoWood] = new Tuple("Kein Holz / Pudel", "Ergenis wird ausgelöst, wenn ein Wurf erfasst wird, bei dem nicht mindestens ein Kegel umgeworfen wurde."); + data[ExpenseTriggerType.Circle] = new Tuple("Kranz", "Ergenis wird ausgelöst, wenn in einem Wurf alle Kegel bis auf den Mittelpin umgeworfen werden."); + data[ExpenseTriggerType.FullGutter] = new Tuple("Gosse / Rinne Anwurf", "Ergenis wird ausgelöst, wenn der Wurf mit Rechter- oder Linker-Rinne abgeschlossen wird und zusätzlich der erste Wurf in der Runde ausgeführt wird."); + data[ExpenseTriggerType.Eliminated] = new Tuple("Ausgeschieden", "Ergenis wird ausgelöst, wenn ein Spieler aus einem Spiel ausscheidet."); + data[ExpenseTriggerType.Strike] = new Tuple("alle 9e", "Ergenis wird ausgelöst, wenn in einem Wurf alle 9 Kegel getroffen werden."); + data[ExpenseTriggerType.ExpensePoint] = new Tuple("Strafpunkte", "Ergenis wird ausgelöst, in einem Spiel Strafpunkte ausgelöst werden."); + data[ExpenseTriggerType.FirstThrowFail] = new Tuple("Anwurffehler", "Ergenis wird ausgelöst, abhängig vom Spiel der erste Wurf in einer Runde nicht erfolgreich ist. Ein Beispiel ist die Anzahl von 3 Kegeln, die bei der Totenkiste am Anfang mindestens getroffen werden müssen."); + + foreach (var item in data) + { + var trigger = await triggerRepository.GetByTriggerTypeAsync(item.Key); + if (trigger == null) + { + trigger = new Trigger + { + Name = item.Value.Item1, + Description = item.Value.Item2, + ExpenseTriggerType = item.Key + }; + await triggerRepository.AddAsync(trigger); + } + } + + } + public static async Task SeedAsync(IServiceProvider services, IConfiguration config, IHostEnvironment env) { // Nur in Dev automatisch – Prod nur mit explizitem Flag @@ -84,7 +121,7 @@ public static class BootstrapSeeder // Optional: Default-Club erstellen + Membership + RoleAssignments (nur wenn gewünscht) if (config.GetValue("Bootstrap:CreateDefaultClub")) { - var clubName = config["Bootstrap:DefaultClub:Name"] ?? "Default Club"; + var clubName = config["Bootstrap:DefaultClub:Name"] ?? "Demo Club"; var club = await appDb.Clubs.FirstOrDefaultAsync(c => c.Name == clubName); if (club == null) diff --git a/src/Koogle.Infrastructure/Repositories/TriggerRepository.cs b/src/Koogle.Infrastructure/Repositories/TriggerRepository.cs index 3dfea02..76b48ed 100644 --- a/src/Koogle.Infrastructure/Repositories/TriggerRepository.cs +++ b/src/Koogle.Infrastructure/Repositories/TriggerRepository.cs @@ -117,4 +117,11 @@ public class TriggerRepository(IDbContextFactory contextFactory) : await context.SaveChangesAsync(ct); return true; } + + public async Task GetByTriggerTypeAsync(ExpenseTriggerType triggerType, CancellationToken ct = default) + { + await using var context = await contextFactory.CreateDbContextAsync(ct); + var trigger = await context.Triggers.FirstOrDefaultAsync(t => t.ExpenseTriggerType == triggerType && !t.IsDeleted, ct); + return trigger; + } } diff --git a/src/Koogle.Web/Components/Pages/Admin/TriggerFormDialog.razor b/src/Koogle.Web/Components/Pages/Admin/TriggerFormDialog.razor index c38e7d9..846baa2 100644 --- a/src/Koogle.Web/Components/Pages/Admin/TriggerFormDialog.razor +++ b/src/Koogle.Web/Components/Pages/Admin/TriggerFormDialog.razor @@ -99,8 +99,8 @@ ExpenseTriggerType.NoWood => "Kein Holz", ExpenseTriggerType.FirstThrowFail => "Anwurffehler", ExpenseTriggerType.Circle => "Kranz", - ExpenseTriggerType.NinePins => "Alle Neune", - ExpenseTriggerType.FullSink => "Gosse beim Anwurf", + ExpenseTriggerType.Strike => "Alle Neune", + ExpenseTriggerType.FullGutter => "Gosse beim Anwurf", ExpenseTriggerType.Eliminated => "Ausgeschieden", ExpenseTriggerType.Absent => "Abwesend", ExpenseTriggerType.ExpensePoint => "Strafpunkt", diff --git a/src/Koogle.Web/Components/Pages/Admin/Triggers.razor b/src/Koogle.Web/Components/Pages/Admin/Triggers.razor index 7f625ff..20f830b 100644 --- a/src/Koogle.Web/Components/Pages/Admin/Triggers.razor +++ b/src/Koogle.Web/Components/Pages/Admin/Triggers.razor @@ -150,8 +150,8 @@ ExpenseTriggerType.NoWood => "Kein Holz", ExpenseTriggerType.FirstThrowFail => "Anwurf", ExpenseTriggerType.Circle => "Kranz", - ExpenseTriggerType.NinePins => "Alle 9", - ExpenseTriggerType.FullSink => "Anwurf-Gosse", + ExpenseTriggerType.Strike => "Alle 9", + ExpenseTriggerType.FullGutter => "Anwurf-Gosse", ExpenseTriggerType.Eliminated => "Ausgeschieden", ExpenseTriggerType.Absent => "Abwesend", ExpenseTriggerType.ExpensePoint => "Strafpunkt", diff --git a/src/Koogle.Web/Components/Pages/Expenses/ExpenseTriggerConfig.razor b/src/Koogle.Web/Components/Pages/Expenses/ExpenseTriggerConfig.razor index 6fc5988..1011aa6 100644 --- a/src/Koogle.Web/Components/Pages/Expenses/ExpenseTriggerConfig.razor +++ b/src/Koogle.Web/Components/Pages/Expenses/ExpenseTriggerConfig.razor @@ -180,8 +180,8 @@ ExpenseTriggerType.NoWood => "Kein Holz", ExpenseTriggerType.FirstThrowFail => "Anwurf", ExpenseTriggerType.Circle => "Kranz", - ExpenseTriggerType.NinePins => "Alle 9", - ExpenseTriggerType.FullSink => "Anwurf-Gosse", + ExpenseTriggerType.Strike => "Alle 9", + ExpenseTriggerType.FullGutter => "Anwurf-Gosse", ExpenseTriggerType.Eliminated => "Ausgeschieden", ExpenseTriggerType.Absent => "Abwesend", ExpenseTriggerType.ExpensePoint => "Strafpunkt", @@ -195,8 +195,8 @@ ExpenseTriggerType.NoWood => "Kein Kegel getroffen", ExpenseTriggerType.FirstThrowFail => "Fehler beim ersten Wurf", ExpenseTriggerType.Circle => "Kranz geworfen (8 Kegel)", - ExpenseTriggerType.NinePins => "Alle 9 Kegel abgeraeumt", - ExpenseTriggerType.FullSink => "Gosse beim Anwurf", + ExpenseTriggerType.Strike => "Alle 9 Kegel abgeraeumt", + ExpenseTriggerType.FullGutter => "Gosse beim Anwurf", ExpenseTriggerType.Eliminated => "Aus dem Spiel ausgeschieden", ExpenseTriggerType.Absent => "Am Spieltag nicht teilgenommen", ExpenseTriggerType.ExpensePoint => "Strafpunkt (z.B. Scheiss-Spiel)", diff --git a/src/Koogle.Web/Components/Pages/Expenses/TriggerEditDialog.razor b/src/Koogle.Web/Components/Pages/Expenses/TriggerEditDialog.razor index da0c528..73f828a 100644 --- a/src/Koogle.Web/Components/Pages/Expenses/TriggerEditDialog.razor +++ b/src/Koogle.Web/Components/Pages/Expenses/TriggerEditDialog.razor @@ -84,8 +84,8 @@ ExpenseTriggerType.NoWood => "Kein Holz", ExpenseTriggerType.FirstThrowFail => "Anwurffehler", ExpenseTriggerType.Circle => "Kranz", - ExpenseTriggerType.NinePins => "Alle Neune", - ExpenseTriggerType.FullSink => "Gosse beim Anwurf", + ExpenseTriggerType.Strike => "Alle Neune", + ExpenseTriggerType.FullGutter => "Gosse beim Anwurf", ExpenseTriggerType.Eliminated => "Ausgeschieden", ExpenseTriggerType.Absent => "Abwesend", ExpenseTriggerType.ExpensePoint => "Strafpunkt", diff --git a/src/Koogle.Web/Program.cs b/src/Koogle.Web/Program.cs index cfd4bcb..cbb6ae2 100644 --- a/src/Koogle.Web/Program.cs +++ b/src/Koogle.Web/Program.cs @@ -14,6 +14,7 @@ using Koogle.Web.Store.AuthState; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Server; using MudBlazor.Services; +using Koogle.Infrastructure.Data; var builder = WebApplication.CreateBuilder(args); @@ -105,7 +106,7 @@ using (var scope = app.Services.CreateScope()) } } await BootstrapSeeder.SeedAsync(app.Services, app.Configuration, app.Environment); - +await BootstrapSeeder.SeedTriggersAsync(app.Services); app.Run();