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();