dev Trigger / Expense Masterdata, Seeder for triggers

This commit is contained in:
beo3000 2025-12-28 11:16:51 +01:00
parent 954c2589e6
commit 44b04ec2de
10 changed files with 69 additions and 16 deletions

View File

@ -34,7 +34,7 @@ public interface ITriggerService
/// <summary>
/// Fires a trigger, creating PersonExpenses for all linked expenses.
/// </summary>
/// <param name="type">The trigger type (e.g., ExpensePoint, Circle, NinePins).</param>
/// <param name="type">The trigger type (e.g., ExpensePoint, Circle, Strike).</param>
/// <param name="personId">The person receiving the expense(s).</param>
/// <param name="dayId">The day context for the expense.</param>
/// <param name="gameId">Optional game context for the expense.</param>

View File

@ -34,11 +34,11 @@ public enum ExpenseTriggerType
/// <summary>
/// triggered when a player bowls "alle Neune" (all nine pins).
/// </summary>
NinePins, // alle Neune
Strike, // alle Neune
/// <summary>
/// triggered when a player bowls a "Gosse beim Anwurf" (a gutter ball on the first throw).
/// </summary>
FullSink, // Gosse beim Anwurf
FullGutter, // Gosse beim Anwurf
/// <summary>
/// triggered when a player is eliminated from the game.
/// </summary>

View File

@ -88,4 +88,12 @@ public interface ITriggerRepository
/// <param name="ct">Cancellation token.</param>
/// <returns>True if deleted successfully; otherwise, false.</returns>
Task<bool> DeleteAsync(Guid id, CancellationToken ct = default);
/// <summary>
/// Retrieves first trigger of a specific trigger type
/// </summary>
/// <param name="triggerType">The expense trigger type.</param>
/// <param name="ct">Cancellation token.</param>
/// <returns>A Trigger or Null</returns>
Task<Trigger?> GetByTriggerTypeAsync(ExpenseTriggerType triggerType, CancellationToken ct = default);
}

View File

@ -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<ITriggerRepository>();
var data = new Dictionary<ExpenseTriggerType, Tuple<string,string>>();
data[ExpenseTriggerType.Gutter] = new Tuple<string, string>("Gosse / Rinne", "Ereignis wird ausgelöst, wenn der Wurf mit Rechter- oder Linker-Rinne abgeschlossen wird.");
data[ExpenseTriggerType.Absent] = new Tuple<string, string>("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<string, string>("Klingel / Glocke", "Eregenis wird ausgelöst, wenn beim Wurf zusätzlich die Klingel oder Glocke aktiviert wird.");
data[ExpenseTriggerType.NoWood] = new Tuple<string, string>("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<string, string>("Kranz", "Ergenis wird ausgelöst, wenn in einem Wurf alle Kegel bis auf den Mittelpin umgeworfen werden.");
data[ExpenseTriggerType.FullGutter] = new Tuple<string, string>("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<string, string>("Ausgeschieden", "Ergenis wird ausgelöst, wenn ein Spieler aus einem Spiel ausscheidet.");
data[ExpenseTriggerType.Strike] = new Tuple<string, string>("alle 9e", "Ergenis wird ausgelöst, wenn in einem Wurf alle 9 Kegel getroffen werden.");
data[ExpenseTriggerType.ExpensePoint] = new Tuple<string, string>("Strafpunkte", "Ergenis wird ausgelöst, in einem Spiel Strafpunkte ausgelöst werden.");
data[ExpenseTriggerType.FirstThrowFail] = new Tuple<string, string>("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<bool>("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)

View File

@ -117,4 +117,11 @@ public class TriggerRepository(IDbContextFactory<AppDbContext> contextFactory) :
await context.SaveChangesAsync(ct);
return true;
}
public async Task<Trigger?> 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;
}
}

View File

@ -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",

View File

@ -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",

View File

@ -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)",

View File

@ -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",

View File

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