diff --git a/Controllers/SpawnableController.cs b/Controllers/SpawnableController.cs index ca5229b..c339ae9 100644 --- a/Controllers/SpawnableController.cs +++ b/Controllers/SpawnableController.cs @@ -40,4 +40,16 @@ public class SpawnableController : ControllerBase var all = await _spawnableService.GetAllAsync(); return Ok(all); } + + [HttpDelete("{id}")] + [Authorize(Roles = "SUPER")] + public async Task Delete(string id) + { + var spawnable = await _spawnableService.GetByIdAsync(id); + if (spawnable == null) + return NotFound("Spawnable not found."); + + await _spawnableService.DeleteAsync(id); + return Ok($"Spawnable '{spawnable.Name}' deleted."); + } } diff --git a/GameAuthApi.Tests/SpawnableControllerTests.cs b/GameAuthApi.Tests/SpawnableControllerTests.cs index 9d383c5..a774a81 100644 --- a/GameAuthApi.Tests/SpawnableControllerTests.cs +++ b/GameAuthApi.Tests/SpawnableControllerTests.cs @@ -54,4 +54,16 @@ public class SpawnableControllerTests var ok = Assert.IsType(result); Assert.Equal(list, ok.Value); } + + [Fact] + public async Task Delete_NotFound() + { + var svc = new Mock(config); + svc.Setup(s => s.GetByIdAsync("id")).ReturnsAsync((Spawnable)null); + var controller = new SpawnableController(svc.Object); + + var result = await controller.Delete("id"); + + Assert.IsType(result); + } } diff --git a/Services/SpawnableService.cs b/Services/SpawnableService.cs index 4993935..8cc4d6f 100644 --- a/Services/SpawnableService.cs +++ b/Services/SpawnableService.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using GameAuthApi.Models; using Microsoft.Extensions.Configuration; using MongoDB.Driver; +using MongoDB.Bson; namespace GameAuthApi.Services; @@ -26,4 +27,17 @@ public class SpawnableService { return await _spawnables.Find(_ => true).ToListAsync(); } + + public virtual async Task GetByIdAsync(string id) + { + if (!ObjectId.TryParse(id, out _)) + return null; + + return await _spawnables.Find(s => s.Id == id).FirstOrDefaultAsync(); + } + + public virtual async Task DeleteAsync(string id) + { + await _spawnables.DeleteOneAsync(s => s.Id == id); + } }