From fcdbfcb601fbc3741cf16e66c0064af1029d7472 Mon Sep 17 00:00:00 2001 From: Hinton Date: Fri, 14 Nov 2025 14:45:02 +0100 Subject: [PATCH] Move delete many complexity to service --- util/SeederApi/Controllers/SeedController.cs | 63 +++++--------------- util/SeederApi/Services/ISceneService.cs | 7 +++ util/SeederApi/Services/SceneService.cs | 28 +++++++++ 3 files changed, 50 insertions(+), 48 deletions(-) diff --git a/util/SeederApi/Controllers/SeedController.cs b/util/SeederApi/Controllers/SeedController.cs index 58854fbda7..c2588e9b3f 100644 --- a/util/SeederApi/Controllers/SeedController.cs +++ b/util/SeederApi/Controllers/SeedController.cs @@ -6,16 +6,12 @@ using Microsoft.AspNetCore.Mvc; namespace Bit.SeederApi.Controllers; [Route("seed")] -public class SeedController( - ILogger logger, - ISceneService sceneService, - IServiceProvider serviceProvider) : Controller +public class SeedController(ILogger logger, ISceneService sceneService) : Controller { [HttpPost] public async Task SeedAsync([FromBody] SeedRequestModel request) { - logger.LogInformation("Received seed request {Provider}", serviceProvider.GetType().FullName); - logger.LogInformation("Seeding with template: {Template}", request.Template); + logger.LogInformation("Received seed request with template: {Template}", request.Template); try { @@ -39,34 +35,19 @@ public class SeedController( { logger.LogInformation("Deleting batch of seeded data with IDs: {PlayIds}", string.Join(", ", playIds)); - var aggregateException = new AggregateException(); - - await Task.Run(async () => + try { - foreach (var playId in playIds) - { - try - { - await sceneService.DestroyScene(playId); - } - catch (Exception ex) - { - aggregateException = new AggregateException(aggregateException, ex); - logger.LogError(ex, "Error deleting seeded data: {SeedId}", playId); - } - } - }); - - if (aggregateException.InnerExceptions.Count > 0) + await sceneService.DestroyScenes(playIds); + return Ok(new { Message = "Batch delete completed successfully" }); + } + catch (AggregateException ex) { return BadRequest(new { - Error = "One or more errors occurred while deleting seeded data", - Details = aggregateException.InnerExceptions.Select(e => e.Message).ToList() + Error = ex.Message, + Details = ex.InnerExceptions.Select(e => e.Message).ToList() }); } - - return Ok(new { Message = "Batch delete completed successfully" }); } [HttpDelete("{playId}")] @@ -93,34 +74,20 @@ public class SeedController( { logger.LogInformation("Deleting all seeded data"); - // Pull all Seeded Data ids - var playIds = sceneService.GetAllPlayIds(); - var aggregateException = new AggregateException(); - - foreach (var playId in playIds) + try { - try - { - await sceneService.DestroyScene(playId); - } - catch (Exception ex) - { - aggregateException = new AggregateException(aggregateException, ex); - logger.LogError(ex, "Error deleting seeded data: {PlayId}", playId); - } + await sceneService.DestroyScenes(playIds); + return NoContent(); } - - if (aggregateException.InnerExceptions.Count > 0) + catch (AggregateException ex) { return BadRequest(new { - Error = "One or more errors occurred while deleting seeded data", - Details = aggregateException.InnerExceptions.Select(e => e.Message).ToList() + Error = ex.Message, + Details = ex.InnerExceptions.Select(e => e.Message).ToList() }); } - - return NoContent(); } } diff --git a/util/SeederApi/Services/ISceneService.cs b/util/SeederApi/Services/ISceneService.cs index 128316692f..e494bc492e 100644 --- a/util/SeederApi/Services/ISceneService.cs +++ b/util/SeederApi/Services/ISceneService.cs @@ -36,4 +36,11 @@ public interface ISceneService /// /// A list of play IDs representing active seeded data that can be destroyed. List GetAllPlayIds(); + + /// + /// Destroys multiple scenes by their play IDs. + /// + /// The list of play IDs to destroy + /// Thrown when one or more scenes fail to destroy + Task DestroyScenes(IEnumerable playIds); } diff --git a/util/SeederApi/Services/SceneService.cs b/util/SeederApi/Services/SceneService.cs index 4f012102c5..24d3feb3d9 100644 --- a/util/SeederApi/Services/SceneService.cs +++ b/util/SeederApi/Services/SceneService.cs @@ -79,6 +79,34 @@ public class SceneService( return new { PlayId = playId }; } + public async Task DestroyScenes(IEnumerable playIds) + { + var exceptions = new List(); + + var deleteTasks = playIds.Select(async playId => + { + try + { + await DestroyScene(playId); + } + catch (Exception ex) + { + lock (exceptions) + { + exceptions.Add(ex); + } + logger.LogError(ex, "Error deleting seeded data: {PlayId}", playId); + } + }); + + await Task.WhenAll(deleteTasks); + + if (exceptions.Count > 0) + { + throw new AggregateException("One or more errors occurred while deleting seeded data", exceptions); + } + } + private async Task> ExecuteSceneMethod(string templateName, JsonElement? arguments, string methodName) { try