using System.Collections; 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 UpdateName(int tacticId, string name) { var entity = await context.Tactics.FirstOrDefaultAsync(t => t.Id == tacticId); if (entity == null) return false; entity.Name = name; return await context.SaveChangesAsync() > 0; } public async Task SetTacticStepContent(int tacticId, int stepId, string json) { var entity = await context.TacticSteps .FirstOrDefaultAsync(t => t.TacticId == tacticId && t.StepId == stepId); if (entity == null) return false; entity.JsonContent = json; return await context.SaveChangesAsync() > 0; } public async Task GetTacticStepContent(int tacticId, int stepId) { return (await context .TacticSteps .FirstOrDefaultAsync(t => t.TacticId == tacticId && t.StepId == stepId) )?.JsonContent; } 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 entity = new TacticStepEntity { JsonContent = "{components: []}", ParentId = parentStepId, TacticId = tacticId }; await context.AddAsync(entity); await context.SaveChangesAsync(); return entity.StepId; } public async Task RemoveTacticStep(int tacticId, int stepId) { var toRemove = new List { stepId }; while (toRemove.Count != 0) { var id = toRemove[0]; toRemove.RemoveAt(0); var step = await context.TacticSteps .Include(s => s.Children) .FirstOrDefaultAsync(t => t.TacticId == tacticId && t.StepId == id); if (step == null) { if (id == stepId) return false; throw new Exception( $"step contains a children that does not exists in the database ({tacticId} / {id})" ); } var stepChildren = step.Children.Select(s => s.StepId); toRemove.AddRange(stepChildren); context.Remove(step); } return await context.SaveChangesAsync() > 0; } }