diff --git a/API/Controllers/UsersController.cs b/API/Controllers/UsersController.cs index e5e7f37..ea73e3a 100644 --- a/API/Controllers/UsersController.cs +++ b/API/Controllers/UsersController.cs @@ -63,6 +63,25 @@ public class UsersController(IUserService users, ITeamService teams, ITacticServ return result ? Ok() : NotFound(); } + [HttpDelete("/tactics/shared/{tacticId:int}/user/{userId:int}")] + [Authorize] + public async Task UnshareTactic(int tacticId, int userId) + { + var currentUserId = accessor.CurrentUserId(HttpContext); + var tactic = await tactics.GetTactic(tacticId); + + if (tactic == null) + { + return NotFound(); + } + if (currentUserId != tactic.OwnerId) + { + return Unauthorized(); + } + + var success = await tactics.UnshareTactic(tacticId, userId, null); + return success ? Ok() : NotFound(); + } [HttpGet("/tactics/shared/user/{userId:int}")] [Authorize] diff --git a/DbServices/DbTacticService.cs b/DbServices/DbTacticService.cs index 3312cd1..78fa157 100644 --- a/DbServices/DbTacticService.cs +++ b/DbServices/DbTacticService.cs @@ -168,9 +168,18 @@ public class DbTacticService(AppContext.AppContext context) : ITacticService public async Task UnshareTactic(int tacticId, int? userId, int? teamId) { - var sharedTactic = await context.SharedTactics - .FirstOrDefaultAsync(st => st.TacticId == tacticId && st.SharedWithUserId == userId && st.SharedWithTeamId == teamId); - + SharedTacticEntity? sharedTactic = null; + if (userId.HasValue) + { + sharedTactic = await context.SharedTactics + .FirstOrDefaultAsync(st => st.TacticId == tacticId && st.SharedWithUserId == userId); + } + else if (teamId.HasValue) + { + sharedTactic = await context.SharedTactics + .FirstOrDefaultAsync(st => st.TacticId == tacticId && st.SharedWithTeamId == teamId); + } + if (sharedTactic == null) { return false; diff --git a/StubContext/StubAppContext.cs b/StubContext/StubAppContext.cs index f740de9..6027f4a 100644 --- a/StubContext/StubAppContext.cs +++ b/StubContext/StubAppContext.cs @@ -56,5 +56,13 @@ public class StubAppContext(DbContextOptions options) : AppContext(o TacticId = 1, ParentId = null }); + + builder.Entity() + .HasData(new SharedTacticEntity + { + Id = 1, + TacticId = 1, + SharedWithUserId = 2 + }); } } \ No newline at end of file diff --git a/UnitTests/UserControllerTest.cs b/UnitTests/UserControllerTest.cs index a57b0f6..fb28078 100644 --- a/UnitTests/UserControllerTest.cs +++ b/UnitTests/UserControllerTest.cs @@ -7,6 +7,7 @@ using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Model; using StubContext; +using Xunit.Abstractions; namespace UnitTests; @@ -56,4 +57,29 @@ public class UsersControllerTest var result = await controller.ShareTactic(new UsersController.ShareTacticToUserRequest(1, 2)); result.Should().BeOfType(); } + + [Fact] + public async Task GetSharedTacticsToUserTest() + { + var controller = GetUserController(2); + var result = await controller.GetSharedTacticsToUser(2); + + var okResult = result as OkObjectResult; + var sharedTactics = okResult.Value as IEnumerable; + + sharedTactics.Should().NotBeNull(); + sharedTactics.Should().ContainSingle(); + + var tactic = sharedTactics.First(); + tactic.Id.Should().Be(1); + } + + [Fact] + public async Task UnshareTacticTest() + { + var controller = GetUserController(1); + var result = await controller.UnshareTactic(1, 2); + result.Should().BeOfType(); + } + } \ No newline at end of file