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")]
|
[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();
|
||||||
|
|
||||||
|
|||||||
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 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>();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 };
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user