Updated issues with querying getting all bookmarks and updating bookmark tags
This commit is contained in:
@ -35,9 +35,11 @@ namespace YABA.API.Controllers
|
||||
[HttpPost("{id}/Tags")]
|
||||
[ProducesResponseType(typeof(IEnumerable<GenericResponse<string>>),(int)HttpStatusCode.OK)]
|
||||
[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();
|
||||
|
||||
|
||||
7
YABA.API/ViewModels/UpdateBookmarkTagRequest.cs
Normal file
7
YABA.API/ViewModels/UpdateBookmarkTagRequest.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace YABA.API.ViewModels
|
||||
{
|
||||
public class UpdateBookmarkTagRequest
|
||||
{
|
||||
public List<string> Tags { get; set; }
|
||||
}
|
||||
}
|
||||
@ -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<TagDTO> Tags { get; set; } = new List<TagDTO>();
|
||||
public IList<TagSummaryDTO> Tags { get; set; } = new List<TagSummaryDTO>();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
.Include(x => x.Tag)
|
||||
.Where(x => userBookmarks.Keys.Contains(x.BookmarkId))
|
||||
.ToList()
|
||||
.GroupBy(x => x.BookmarkId)
|
||||
.ToDictionary(key => key.Key, value => value.Select(x => x.TagId));
|
||||
.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<BookmarkDTO>();
|
||||
|
||||
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<BookmarkDTO>();
|
||||
|
||||
foreach(var bookmarkTagLookup in bookmarkTagsLookup)
|
||||
foreach(var bookmark in userBookmarks)
|
||||
{
|
||||
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;
|
||||
|
||||
var bookmarkDTO = _mapper.Map<BookmarkDTO>(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<TagDTO>(tag);
|
||||
foreach (var bookmarkTag in bookmarkTags)
|
||||
{
|
||||
var tagDTO = _mapper.Map<TagSummaryDTO>(bookmarkTag.Tag);
|
||||
bookmarkDTO.Tags.Add(tagDTO);
|
||||
}
|
||||
|
||||
bookmarks.Add(bookmarkDTO);
|
||||
}
|
||||
|
||||
return new CrudResultDTO<IEnumerable<BookmarkDTO>> { Entry = bookmarks, CrudResult = CrudResultLookup.RetrieveSuccessful };
|
||||
userBookmarkDTOs.Add(bookmarkDTO);
|
||||
}
|
||||
|
||||
return new CrudResultDTO<IEnumerable<BookmarkDTO>> { Entry = userBookmarkDTOs, CrudResult = CrudResultLookup.RetrieveSuccessful };
|
||||
}
|
||||
|
||||
public async Task<CrudResultDTO<CreateBookmarkRequestDTO>?> 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<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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user