Updated issues with querying getting all bookmarks and updating bookmark tags

This commit is contained in:
Carl Tibule
2023-01-28 13:23:46 -06:00
parent 1ca6b63af3
commit 22f5764589
4 changed files with 34 additions and 35 deletions

View File

@ -35,9 +35,11 @@ namespace YABA.API.Controllers
[HttpPost("{id}/Tags")] [HttpPost("{id}/Tags")]
[ProducesResponseType(typeof(IEnumerable<GenericResponse<string>>),(int)HttpStatusCode.OK)] [ProducesResponseType(typeof(IEnumerable<GenericResponse<string>>),(int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.NotFound)] [ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> UpdateBookmarkTags(int id, [FromBody] IEnumerable<string> tags) public async Task<IActionResult> 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(); if (result.All(x => !x.IsSuccessful)) return NotFound();

View File

@ -0,0 +1,7 @@
namespace YABA.API.ViewModels
{
public class UpdateBookmarkTagRequest
{
public List<string> Tags { get; set; }
}
}

View File

@ -15,7 +15,7 @@ namespace YABA.Common.DTOs.Bookmarks
public string Note { get; set; } public string Note { get; set; }
public bool IsHidden { get; set; } public bool IsHidden { get; set; }
public string Url { get; set; } public string Url { get; set; }
public IList<TagDTO> Tags { get; set; } = new List<TagDTO>(); public IList<TagSummaryDTO> Tags { get; set; } = new List<TagSummaryDTO>();
} }
} }

View File

@ -40,43 +40,34 @@ namespace YABA.Service
{ {
var currentUserId = GetCurrentUserId(); var currentUserId = GetCurrentUserId();
var userBookmarks = _roContext.Bookmarks.Where(x => x.UserId == currentUserId).ToDictionary(k => k.Id, v => v);
var bookmarkTagsLookup = _roContext.BookmarkTags var bookmarkTagsLookup = _roContext.BookmarkTags
.Where(x => x.Bookmark.UserId == currentUserId) .Include(x => x.Tag)
.GroupBy(x => x.BookmarkId) .Where(x => userBookmarks.Keys.Contains(x.BookmarkId))
.ToDictionary(key => key.Key, value => value.Select(x => x.TagId)); .ToList()
.GroupBy(x => x.BookmarkId)
.ToDictionary(k => k.Key, v => v.ToList());
var bookmarksLookup = _roContext.Bookmarks var userBookmarkDTOs = new List<BookmarkDTO>();
.Where(x => bookmarkTagsLookup.Keys.Contains(x.Id))
.ToDictionary(key => key.Id, value => value);
var tagsLookup = _roContext.Tags foreach(var bookmark in userBookmarks)
.Where(x => bookmarkTagsLookup.Values.SelectMany(y => y.ToList()).Contains(x.Id))
.ToDictionary(key => key.Id, value => value);
var bookmarks = new List<BookmarkDTO>();
foreach(var bookmarkTagLookup in bookmarkTagsLookup)
{ {
var bookmarkExists = bookmarksLookup.TryGetValue(bookmarkTagLookup.Key, out Bookmark bookmark); var bookmarkDTO = _mapper.Map<BookmarkDTO>(bookmark.Value);
bookmarkTagsLookup.TryGetValue(bookmark.Key, out var bookmarkTags);
if (!bookmarkExists) continue; if(bookmarkTags != null)
var bookmarkDTO = _mapper.Map<BookmarkDTO>(bookmark);
foreach(var tagId in bookmarkTagLookup.Value)
{ {
var tagExists = tagsLookup.TryGetValue(tagId, out Tag tag); foreach (var bookmarkTag in bookmarkTags)
{
if (!tagExists) continue; var tagDTO = _mapper.Map<TagSummaryDTO>(bookmarkTag.Tag);
bookmarkDTO.Tags.Add(tagDTO);
var tagDTO = _mapper.Map<TagDTO>(tag); }
bookmarkDTO.Tags.Add(tagDTO);
} }
bookmarks.Add(bookmarkDTO); userBookmarkDTOs.Add(bookmarkDTO);
} }
return new CrudResultDTO<IEnumerable<BookmarkDTO>> { Entry = bookmarks, CrudResult = CrudResultLookup.RetrieveSuccessful }; return new CrudResultDTO<IEnumerable<BookmarkDTO>> { Entry = userBookmarkDTOs, CrudResult = CrudResultLookup.RetrieveSuccessful };
} }
public async Task<CrudResultDTO<CreateBookmarkRequestDTO>?> CreateBookmark(CreateBookmarkRequestDTO request) public async Task<CrudResultDTO<CreateBookmarkRequestDTO>?> CreateBookmark(CreateBookmarkRequestDTO request)
@ -130,15 +121,14 @@ namespace YABA.Service
// Add tags that are not yet in the database // Add tags that are not yet in the database
var savedUserTags = _context.Tags.Where(x => x.UserId == currentUserId).ToList(); 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); await _context.Tags.AddRangeAsync(tagsToSave);
await _context.SaveChangesAsync();
if (await _context.SaveChangesAsync() <= 0) return crudResults;
// Add newly added tags to the lookup // Add newly added tags to the lookup
savedUserTags.AddRange(tagsToSave); 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 existingBookmarkTagsLookup = existingBookmarkTags.ToDictionary(k => k.TagId, v => v.Tag.Name);
var bookmarkTagsToRemove = existingBookmarkTagsLookup var bookmarkTagsToRemove = existingBookmarkTagsLookup
@ -171,7 +161,7 @@ namespace YABA.Service
.ToList(); .ToList();
var bookmarkDTO = _mapper.Map<BookmarkDTO>(bookmark); var bookmarkDTO = _mapper.Map<BookmarkDTO>(bookmark);
bookmarkDTO.Tags = _mapper.Map<IList<TagDTO>>(bookmarkTags); bookmarkDTO.Tags = _mapper.Map<IList<TagSummaryDTO>>(bookmarkTags);
return new CrudResultDTO<BookmarkDTO> { CrudResult = CrudResultLookup.RetrieveSuccessful, Entry = bookmarkDTO }; return new CrudResultDTO<BookmarkDTO> { CrudResult = CrudResultLookup.RetrieveSuccessful, Entry = bookmarkDTO };
} }