dev Trigger / Expense Masterdata, Seeder for triggers
This commit is contained in:
parent
954c2589e6
commit
44b04ec2de
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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)",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue