From e26177528b38c6386601ecba241672b4ead80677 Mon Sep 17 00:00:00 2001 From: cuqmbr Date: Sat, 14 Oct 2023 20:05:02 +0300 Subject: [PATCH] add ability to delete wishlist --- .../Mutations/WishlistsMutation.cs | 4 + .../IServices/IWishlistService.cs | 2 + .../Services/WishlistsService.cs | 49 ++++++++--- .../Tests/WishlistsTests.cs | 85 +++++++++++++++++-- 4 files changed, 118 insertions(+), 22 deletions(-) diff --git a/ShoppingAssistantApi.Api/Mutations/WishlistsMutation.cs b/ShoppingAssistantApi.Api/Mutations/WishlistsMutation.cs index 9c195fb..3bd1d7c 100644 --- a/ShoppingAssistantApi.Api/Mutations/WishlistsMutation.cs +++ b/ShoppingAssistantApi.Api/Mutations/WishlistsMutation.cs @@ -14,4 +14,8 @@ public class WishlistsMutation public Task AddMessageToPersonalWishlist(string wishlistId, MessageCreateDto dto, CancellationToken cancellationToken, [Service] IWishlistsService wishlistsService) => wishlistsService.AddMessageToPersonalWishlistAsync(wishlistId, dto, cancellationToken); + + public Task DeletePersonalWishlistAsync(string wishlistId, CancellationToken cancellationToken, + [Service] IWishlistsService wishlistsService) + => wishlistsService.DeletePersonalWishlistAsync(wishlistId, cancellationToken); } diff --git a/ShoppingAssistantApi.Application/IServices/IWishlistService.cs b/ShoppingAssistantApi.Application/IServices/IWishlistService.cs index 5bfae6a..41081c6 100644 --- a/ShoppingAssistantApi.Application/IServices/IWishlistService.cs +++ b/ShoppingAssistantApi.Application/IServices/IWishlistService.cs @@ -13,4 +13,6 @@ public interface IWishlistsService Task> GetPersonalWishlistsPageAsync(int pageNumber, int pageSize, CancellationToken cancellationToken); Task GetPersonalWishlistAsync(string wishlistId, CancellationToken cancellationToken); + + Task DeletePersonalWishlistAsync(string wishlistId, CancellationToken cancellationToken); } diff --git a/ShoppingAssistantApi.Infrastructure/Services/WishlistsService.cs b/ShoppingAssistantApi.Infrastructure/Services/WishlistsService.cs index 7e1fc40..a5166f2 100644 --- a/ShoppingAssistantApi.Infrastructure/Services/WishlistsService.cs +++ b/ShoppingAssistantApi.Infrastructure/Services/WishlistsService.cs @@ -67,12 +67,7 @@ public class WishlistsService : IWishlistsService newMessage.CreatedById = (ObjectId) GlobalUser.Id; newMessage.CreatedDateUtc = DateTime.UtcNow; - var relatedWishlist = await _wishlistsRepository.GetWishlistAsync(x => x.Id == wishlistObjectId && x.CreatedById == GlobalUser.Id, cancellationToken); - - if (relatedWishlist == null) - { - throw new UnAuthorizedException(); - } + await TryGetPersonalWishlist(wishlistObjectId, cancellationToken); var createdMessage = await _messagesRepository.AddAsync(newMessage, cancellationToken); @@ -93,15 +88,43 @@ public class WishlistsService : IWishlistsService { throw new InvalidDataException("Provided id is invalid."); } - var entity = await _wishlistsRepository.GetWishlistAsync(x => x.Id == wishlistObjectId && x.CreatedById == GlobalUser.Id, cancellationToken); - Console.WriteLine(" WISHLIST: " + entity.CreatedById + " " + GlobalUser.Id); - - if (entity == null) - { - throw new UnAuthorizedException(); - } + var entity = await TryGetPersonalWishlist(wishlistObjectId, cancellationToken); return _mapper.Map(entity); } + + public async Task DeletePersonalWishlistAsync(string wishlistId, CancellationToken cancellationToken) + { + if (!ObjectId.TryParse(wishlistId, out var wishlistObjectId)) + { + throw new InvalidDataException("Provided id is invalid."); + } + + var entity = await TryGetPersonalWishlist(wishlistObjectId, cancellationToken); + + entity.LastModifiedById = GlobalUser.Id; + entity.LastModifiedDateUtc = DateTime.UtcNow; + + await _wishlistsRepository.DeleteAsync(entity, cancellationToken); + + return _mapper.Map(entity); + } + + private async Task TryGetPersonalWishlist(ObjectId wishlistId, CancellationToken cancellationToken) + { + var entity = await _wishlistsRepository.GetWishlistAsync(x => x.Id == wishlistId, cancellationToken); + + if (entity.CreatedById != GlobalUser.Id) + { + throw new UnAuthorizedException(); + } + + if (entity == null) + { + throw new EntityNotFoundException(); + } + + return entity; + } } diff --git a/ShoppingAssistantApi.Tests/Tests/WishlistsTests.cs b/ShoppingAssistantApi.Tests/Tests/WishlistsTests.cs index d153a33..93f37f8 100644 --- a/ShoppingAssistantApi.Tests/Tests/WishlistsTests.cs +++ b/ShoppingAssistantApi.Tests/Tests/WishlistsTests.cs @@ -17,7 +17,15 @@ public class WishlistsTests : IClassFixture> private const string WISHLIST_TESTING_USER_PASSWORD = "Yuiop12345"; - private const string TESTING_WISHLIST_ID = "ab79cde6f69abcd3efab65cd"; + private const string WISHLIST_TESTING_VALID_WISHLIST_ID = "ab79cde6f69abcd3efab65cd"; + + private const string WISHLIST_TESTING_VALID_WISHLIST_NAME = "Gaming PC"; + + private const WishlistTypes WISHLIST_TESTING_VALID_WISHLIST_TYPE = WishlistTypes.Product; + + private const string WISHLIST_TESTING_INVALID_WISHLIST_ID = "1234567890abcdef12345678"; + + private const string WISHLIST_TESTING_OTHER_USER_WISHLIST_ID = "ab6c2c2d9edf39abcd1ef9ab"; public WishlistsTests(TestingFactory factory) { @@ -111,7 +119,7 @@ public class WishlistsTests : IClassFixture> query = "query personalWishlist($wishlistId: String!) { personalWishlist(wishlistId: $wishlistId) { createdById, id, name, type } }", variables = new { - wishlistId = TESTING_WISHLIST_ID + wishlistId = WISHLIST_TESTING_VALID_WISHLIST_ID } }; @@ -130,9 +138,9 @@ public class WishlistsTests : IClassFixture> var personalWishlistType = (string) document.data.personalWishlist.type; var personalWishlistCreatedById = (string) document.data.personalWishlist.createdById; - Assert.Equal(TESTING_WISHLIST_ID, personalWishlistId); - Assert.Equal("Gaming PC", personalWishlistName); - Assert.Equal(WishlistTypes.Product.ToString(), personalWishlistType); + Assert.Equal(WISHLIST_TESTING_VALID_WISHLIST_ID, personalWishlistId); + Assert.Equal(WISHLIST_TESTING_VALID_WISHLIST_NAME, personalWishlistName); + Assert.Equal(WISHLIST_TESTING_VALID_WISHLIST_TYPE.ToString(), personalWishlistType); Assert.Equal(user.Id, personalWishlistCreatedById); } @@ -150,7 +158,7 @@ public class WishlistsTests : IClassFixture> query = "mutation addMessageToPersonalWishlist($wishlistId: String!, $dto: MessageCreateDtoInput!) { addMessageToPersonalWishlist (wishlistId: $wishlistId, dto: $dto) { role, text, createdById } }", variables = new { - wishlistId = TESTING_WISHLIST_ID, + wishlistId = WISHLIST_TESTING_VALID_WISHLIST_ID, dto = new { text = MESSAGE_TEXT @@ -177,6 +185,42 @@ public class WishlistsTests : IClassFixture> Assert.Equal(user.Id, messageCreatedById); } + [Fact] + public async Task DeletePersonalWishlist_ValidWishlistIdOrAuthorizedAccess_ReturnsWishlistModel() + { + var tokensModel = await AccessExtention.Login(WISHLIST_TESTING_USER_EMAIL, WISHLIST_TESTING_USER_PASSWORD, _httpClient); + _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokensModel.AccessToken); + var user = await UserExtention.GetCurrentUser(_httpClient); + + var mutation = new + { + query = "mutation deletePersonalWishlist($wishlistId: String!) { deletePersonalWishlist (wishlistId: $wishlistId) { createdById, id, name, type } }", + variables = new + { + wishlistId = WISHLIST_TESTING_VALID_WISHLIST_ID + } + }; + + var jsonPayload = JsonConvert.SerializeObject(mutation); + var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); + + using var response = await _httpClient.PostAsync("graphql", content); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var responseString = await response.Content.ReadAsStringAsync(); + var document = JsonConvert.DeserializeObject(responseString); + + var personalWishlistId = (string) document.data.deletePersonalWishlist.id; + var personalWishlistName = (string) document.data.deletePersonalWishlist.name; + var personalWishlistType = (string) document.data.deletePersonalWishlist.type; + var personalWishlistCreatedById = (string) document.data.deletePersonalWishlist.createdById; + + Assert.Equal(WISHLIST_TESTING_VALID_WISHLIST_ID, personalWishlistId); + Assert.Equal(WISHLIST_TESTING_VALID_WISHLIST_NAME, personalWishlistName); + Assert.Equal(WISHLIST_TESTING_VALID_WISHLIST_TYPE.ToString(), personalWishlistType); + Assert.Equal(user.Id, personalWishlistCreatedById); + } + [Fact] public async Task StartPersonalWishlistAsync_InvalidWishlistModel_ReturnsInternalServerError() { @@ -216,7 +260,7 @@ public class WishlistsTests : IClassFixture> query = "query personalWishlist($wishlistId: String!) { personalWishlist(wishlistId: $wishlistId) { createdById, id, name, type } }", variables = new { - wishlistId = "1234567890abcdef12345678" // Invalid wishlistId + wishlistId = WISHLIST_TESTING_INVALID_WISHLIST_ID } }; @@ -239,7 +283,7 @@ public class WishlistsTests : IClassFixture> query = "query personalWishlist($wishlistId: String!) { personalWishlist(wishlistId: $wishlistId) { createdById, id, name, type } }", variables = new { - wishlistId = "ab6c2c2d9edf39abcd1ef9ab" // Other user's wishlist + wishlistId = WISHLIST_TESTING_OTHER_USER_WISHLIST_ID } }; @@ -264,7 +308,7 @@ public class WishlistsTests : IClassFixture> query = "mutation addMessageToPersonalWishlist($wishlistId: String!, $dto: MessageCreateDtoInput!) { addMessageToPersonalWishlist (wishlistId: $wishlistId, dto: $dto) { role, text, createdById } }", variables = new { - wishlistId = "8125jad7g12", // Invalid wishlistId + wishlistId = WISHLIST_TESTING_INVALID_WISHLIST_ID, dto = new { text = MESSAGE_TEXT, @@ -278,4 +322,27 @@ public class WishlistsTests : IClassFixture> using var response = await _httpClient.PostAsync("graphql", content); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); } + + [Fact] + public async Task DeletePersonalWishlist_InValidWishlistId_ReturnsInternalServerError() + { + var tokensModel = await AccessExtention.Login(WISHLIST_TESTING_USER_EMAIL, WISHLIST_TESTING_USER_PASSWORD, _httpClient); + _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokensModel.AccessToken); + var user = await UserExtention.GetCurrentUser(_httpClient); + + var mutation = new + { + query = "mutation deletePersonalWishlist($wishlistId: String!) { deletePersonalWishlist (wishlistId: $wishlistId) { createdById, id, name, type } }", + variables = new + { + wishlistId = WISHLIST_TESTING_INVALID_WISHLIST_ID + } + }; + + var jsonPayload = JsonConvert.SerializeObject(mutation); + var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); + + using var response = await _httpClient.PostAsync("graphql", content); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + } }