diff --git a/YABA.API/Controllers/BookmarksController.cs b/YABA.API/Controllers/BookmarksController.cs index 363bf9e..99b087e 100644 --- a/YABA.API/Controllers/BookmarksController.cs +++ b/YABA.API/Controllers/BookmarksController.cs @@ -35,9 +35,11 @@ namespace YABA.API.Controllers [HttpPost("{id}/Tags")] [ProducesResponseType(typeof(IEnumerable>),(int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] - public async Task UpdateBookmarkTags(int id, [FromBody] IEnumerable tags) + public async Task UpdateBookmarkTags(int id, [FromBody] UpdateBookmarkTagRequest request) { - var result = await _bookmarkService.UpdateBookmarkTags(id, tags); + if (request.Tags == null) return BadRequest(); + + var result = await _bookmarkService.UpdateBookmarkTags(id, request.Tags); if (result.All(x => !x.IsSuccessful)) return NotFound(); diff --git a/YABA.API/ViewModels/UpdateBookmarkTagRequest.cs b/YABA.API/ViewModels/UpdateBookmarkTagRequest.cs new file mode 100644 index 0000000..f8a3872 --- /dev/null +++ b/YABA.API/ViewModels/UpdateBookmarkTagRequest.cs @@ -0,0 +1,7 @@ +namespace YABA.API.ViewModels +{ + public class UpdateBookmarkTagRequest + { + public List Tags { get; set; } + } +} diff --git a/YABA.Common/DTOs/Bookmarks/BookmarkDTO.cs b/YABA.Common/DTOs/Bookmarks/BookmarkDTO.cs index ab55fc5..cc6171e 100644 --- a/YABA.Common/DTOs/Bookmarks/BookmarkDTO.cs +++ b/YABA.Common/DTOs/Bookmarks/BookmarkDTO.cs @@ -15,7 +15,7 @@ namespace YABA.Common.DTOs.Bookmarks public string Note { get; set; } public bool IsHidden { get; set; } public string Url { get; set; } - public IList Tags { get; set; } = new List(); + public IList Tags { get; set; } = new List(); } } diff --git a/YABA.Service/BookmarkService.cs b/YABA.Service/BookmarkService.cs index 121e45b..e156fa0 100644 --- a/YABA.Service/BookmarkService.cs +++ b/YABA.Service/BookmarkService.cs @@ -40,43 +40,34 @@ namespace YABA.Service { var currentUserId = GetCurrentUserId(); + var userBookmarks = _roContext.Bookmarks.Where(x => x.UserId == currentUserId).ToDictionary(k => k.Id, v => v); var bookmarkTagsLookup = _roContext.BookmarkTags - .Where(x => x.Bookmark.UserId == currentUserId) - .GroupBy(x => x.BookmarkId) - .ToDictionary(key => key.Key, value => value.Select(x => x.TagId)); + .Include(x => x.Tag) + .Where(x => userBookmarks.Keys.Contains(x.BookmarkId)) + .ToList() + .GroupBy(x => x.BookmarkId) + .ToDictionary(k => k.Key, v => v.ToList()); - var bookmarksLookup = _roContext.Bookmarks - .Where(x => bookmarkTagsLookup.Keys.Contains(x.Id)) - .ToDictionary(key => key.Id, value => value); + var userBookmarkDTOs = new List(); - var tagsLookup = _roContext.Tags - .Where(x => bookmarkTagsLookup.Values.SelectMany(y => y.ToList()).Contains(x.Id)) - .ToDictionary(key => key.Id, value => value); - - var bookmarks = new List(); - - foreach(var bookmarkTagLookup in bookmarkTagsLookup) + foreach(var bookmark in userBookmarks) { - var bookmarkExists = bookmarksLookup.TryGetValue(bookmarkTagLookup.Key, out Bookmark bookmark); + var bookmarkDTO = _mapper.Map(bookmark.Value); + bookmarkTagsLookup.TryGetValue(bookmark.Key, out var bookmarkTags); - if (!bookmarkExists) continue; - - var bookmarkDTO = _mapper.Map(bookmark); - - foreach(var tagId in bookmarkTagLookup.Value) + if(bookmarkTags != null) { - var tagExists = tagsLookup.TryGetValue(tagId, out Tag tag); - - if (!tagExists) continue; - - var tagDTO = _mapper.Map(tag); - bookmarkDTO.Tags.Add(tagDTO); + foreach (var bookmarkTag in bookmarkTags) + { + var tagDTO = _mapper.Map(bookmarkTag.Tag); + bookmarkDTO.Tags.Add(tagDTO); + } } - bookmarks.Add(bookmarkDTO); + userBookmarkDTOs.Add(bookmarkDTO); } - return new CrudResultDTO> { Entry = bookmarks, CrudResult = CrudResultLookup.RetrieveSuccessful }; + return new CrudResultDTO> { Entry = userBookmarkDTOs, CrudResult = CrudResultLookup.RetrieveSuccessful }; } public async Task?> CreateBookmark(CreateBookmarkRequestDTO request) @@ -130,15 +121,14 @@ namespace YABA.Service // Add tags that are not yet in the database var savedUserTags = _context.Tags.Where(x => x.UserId == currentUserId).ToList(); - var tagsToSave = tags.Except(savedUserTags.Select(x => x.Name).ToHashSet()).Select(x => new Tag { Name = x, UserId = currentUserId }); + var tagsToSave = tags.Except(savedUserTags.Select(x => x.Name).ToHashSet()).Select(x => new Tag { Name = x, UserId = currentUserId }).ToList(); await _context.Tags.AddRangeAsync(tagsToSave); - - if (await _context.SaveChangesAsync() <= 0) return crudResults; + await _context.SaveChangesAsync(); // Add newly added tags to the lookup savedUserTags.AddRange(tagsToSave); - var existingBookmarkTags = _context.BookmarkTags.Include(x => x.Tag).Where(x => x.BookmarkId == id).ToList(); + var existingBookmarkTags = _roContext.BookmarkTags.Include(x => x.Tag).Where(x => x.BookmarkId == id).ToList(); var existingBookmarkTagsLookup = existingBookmarkTags.ToDictionary(k => k.TagId, v => v.Tag.Name); var bookmarkTagsToRemove = existingBookmarkTagsLookup @@ -171,7 +161,7 @@ namespace YABA.Service .ToList(); var bookmarkDTO = _mapper.Map(bookmark); - bookmarkDTO.Tags = _mapper.Map>(bookmarkTags); + bookmarkDTO.Tags = _mapper.Map>(bookmarkTags); return new CrudResultDTO { CrudResult = CrudResultLookup.RetrieveSuccessful, Entry = bookmarkDTO }; }