using Backend.Common; using Backend.Contracts; using Backend.Data; using Backend.Services; using Microsoft.EntityFrameworkCore; namespace Backend.Endpoints; public static partial class AdminSeasonManagementEndpoints { private static async Task GetWorkflowRules(AwardsDbContext db) { var settings = await db.SiteSettings .AsNoTracking() .FirstOrDefaultAsync(item => item.Id == 1); if (settings is null) { return Results.NotFound(); } return Results.Ok(new AdminWorkflowRulesResponse(WorkflowRuleSettings.Read(settings).Select(ToWorkflowRuleDto).ToArray())); } private static async Task UpdateWorkflowRules( HttpContext context, UpdateWorkflowRulesRequest request, AwardsDbContext db, IAdminAuditService adminAuditService) { var session = AdminEndpointConventions.CurrentSession(context); var settings = await db.SiteSettings.FirstOrDefaultAsync(item => item.Id == 1); if (settings is null) { return Results.NotFound(); } var before = WorkflowRuleSettings.Read(settings); var mergedRules = WorkflowRuleSettings.Defaults .Select(defaultRule => { var requestRule = request.Rules.FirstOrDefault(item => item.Key == defaultRule.Key); return requestRule is null ? defaultRule : new WorkflowRuleSetting( defaultRule.Key, defaultRule.Label, requestRule.Enabled, requestRule.Limit, requestRule.Mode, defaultRule.Description); }) .ToArray(); settings.WorkflowRulesJson = WorkflowRuleSettings.Serialize(mergedRules); var after = WorkflowRuleSettings.Read(settings); var changes = after .Select(rule => { var previous = before.First(item => item.Key == rule.Key); return new { field = rule.Key, label = rule.Label, from = $"{previous.Enabled}/{previous.Limit}/{previous.Mode}", to = $"{rule.Enabled}/{rule.Limit}/{rule.Mode}", sensitive = false, }; }) .Where(change => change.from != change.to) .ToArray(); adminAuditService.AddEntry( session.TwitchUserId, "workflow-rules.update", "site-settings", settings.Id.ToString(), "Workflow-Regeln wurden aktualisiert.", new { changes }, RequestMetadataReader.Read(context)); await db.SaveChangesAsync(context.RequestAborted); return Results.Ok(new AdminWorkflowRulesResponse(after.Select(ToWorkflowRuleDto).ToArray())); } private static AdminWorkflowRuleDto ToWorkflowRuleDto(WorkflowRuleSetting rule) => new(rule.Key, rule.Label, rule.Enabled, rule.Limit, rule.Mode, rule.Description); }