using AppContext.Entities; using Converters; using Microsoft.EntityFrameworkCore; using Model; using Services; namespace DbServices; public class DbTacticService(AppContext.AppContext context) : ITacticService { public Task> ListTacticsOf(int userId) { return Task.FromResult( context.Tactics .Where(t => t.OwnerId == userId) .AsEnumerable() .Select(e => e.ToModel()) ); } public async Task HasAnyRights(int userId, int tacticId) { var tacticEntity = await context.Tactics.FirstOrDefaultAsync(u => u.Id == tacticId); if (tacticEntity == null) return false; return tacticEntity.OwnerId == userId; } public async Task AddTactic(int userId, string name, CourtType courtType) { var tacticEntity = new TacticEntity { Name = name, CreationDate = DateTime.Now, OwnerId = userId, Type = courtType }; var stepEntity = new TacticStepEntity { ParentId = null, JsonContent = "{\"components\": []}", Tactic = tacticEntity }; await context.Tactics.AddAsync(tacticEntity); await context.TacticSteps.AddAsync(stepEntity); await context.SaveChangesAsync(); return tacticEntity.Id; } public async Task UpdateName(int tacticId, string name) { var entity = await context.Tactics.FirstOrDefaultAsync(t => t.Id == tacticId); if (entity == null) return false; entity.Name = name; await context.SaveChangesAsync(); return true; } public async Task SetTacticStepContent(int tacticId, int stepId, string json) { var entity = await context.TacticSteps .FirstOrDefaultAsync(t => t.TacticId == tacticId && t.Id == stepId); if (entity == null) return false; entity.JsonContent = json; await context.SaveChangesAsync(); return true; } public async Task GetTacticStepContent(int tacticId, int stepId) { return (await context .TacticSteps .FirstOrDefaultAsync(t => t.TacticId == tacticId && t.Id == stepId) )?.JsonContent; } public async Task GetRootStep(int tacticId) { return (await context.TacticSteps .FirstAsync(e => e.TacticId == tacticId && e.ParentId == null)) .ToModel(context.TacticSteps); } public async Task GetTactic(int tacticId) { return (await context.Tactics .FirstOrDefaultAsync(s => s.Id == tacticId)) ?.ToModel(); } public Task> ListUserTactics(int userId) { return Task.FromResult(context .Tactics .Where(t => t.OwnerId == userId) .AsEnumerable() .Select(e => e.ToModel()) ); } public async Task AddTacticStep(int tacticId, int parentStepId, string initialJson) { var parentExists = context.TacticSteps.Any(t => t.TacticId == tacticId && t.Id == parentStepId); if (!parentExists) return null; var tactic = await context.Tactics.FirstOrDefaultAsync(t => t.Id == tacticId); if (tactic == null) { return null; } var entity = new TacticStepEntity { JsonContent = initialJson, ParentId = parentStepId, TacticId = tacticId, }; await context.AddAsync(entity); await context.SaveChangesAsync(); return entity.Id; } public async Task RemoveTacticStep(int tacticId, int stepId) { var toRemove = new Stack(); var beginStep = await context .TacticSteps .FirstOrDefaultAsync(t => t.TacticId == tacticId && t.Id == stepId); if (beginStep == null) return false; toRemove.Push(beginStep); while (toRemove.TryPop(out var step)) { await context.TacticSteps .Where(s => s.TacticId == tacticId && s.ParentId == step.Id) .ForEachAsync(toRemove.Push); context.Remove(step); } return await context.SaveChangesAsync() > 0; } }