Added page and endpoints for managing Tags
This commit is contained in:
@ -60,7 +60,7 @@ namespace YABA.Service
|
||||
{
|
||||
foreach (var bookmarkTag in bookmarkTags)
|
||||
{
|
||||
var tagDTO = _mapper.Map<TagSummaryDTO>(bookmarkTag.Tag);
|
||||
var tagDTO = _mapper.Map<TagDTO>(bookmarkTag.Tag);
|
||||
bookmarkDTO.Tags.Add(tagDTO);
|
||||
}
|
||||
}
|
||||
@ -101,7 +101,7 @@ namespace YABA.Service
|
||||
var currentUserId = GetCurrentUserId();
|
||||
|
||||
var bookmark = _context.Bookmarks.FirstOrDefault(x => x.UserId == currentUserId && x.Id == id);
|
||||
var tags = new List<TagSummaryDTO>();
|
||||
var tags = new List<TagDTO>();
|
||||
|
||||
if (request.Tags != null && request.Tags.Any())
|
||||
tags = (await UpdateBookmarkTags(id, request.Tags)).ToList();
|
||||
@ -126,7 +126,7 @@ namespace YABA.Service
|
||||
return null;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<TagSummaryDTO>?> UpdateBookmarkTags(int id, IEnumerable<string> tags)
|
||||
public async Task<IEnumerable<TagDTO>?> UpdateBookmarkTags(int id, IEnumerable<string> tags)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
|
||||
@ -163,7 +163,7 @@ namespace YABA.Service
|
||||
.Where(x => x.BookmarkId == id)
|
||||
.Select(x => x.Tag);
|
||||
|
||||
return _mapper.Map<IEnumerable<TagSummaryDTO>>(updatedBookmarkTags);
|
||||
return _mapper.Map<IEnumerable<TagDTO>>(updatedBookmarkTags);
|
||||
}
|
||||
|
||||
return null;
|
||||
@ -183,12 +183,12 @@ namespace YABA.Service
|
||||
.ToList();
|
||||
|
||||
var bookmarkDTO = _mapper.Map<BookmarkDTO>(bookmark);
|
||||
bookmarkDTO.Tags = _mapper.Map<List<TagSummaryDTO>>(bookmarkTags);
|
||||
bookmarkDTO.Tags = _mapper.Map<List<TagDTO>>(bookmarkTags);
|
||||
|
||||
return bookmarkDTO;
|
||||
}
|
||||
|
||||
public IEnumerable<TagSummaryDTO>? GetBookmarkTags(int id)
|
||||
public IEnumerable<TagDTO>? GetBookmarkTags(int id)
|
||||
{
|
||||
int.TryParse(_httpContextAccessor.HttpContext.User.Identity.GetUserId(), out int userId);
|
||||
if (!_roContext.Bookmarks.Any(x => x.Id == id && x.UserId == userId)) return null;
|
||||
@ -199,7 +199,7 @@ namespace YABA.Service
|
||||
.Select(x => x.Tag)
|
||||
.ToList();
|
||||
|
||||
return _mapper.Map<IEnumerable<TagSummaryDTO>>(bookmarkTags);
|
||||
return _mapper.Map<IEnumerable<TagDTO>>(bookmarkTags);
|
||||
}
|
||||
|
||||
public async Task<int?> DeleteBookmark(int id)
|
||||
@ -236,6 +236,20 @@ namespace YABA.Service
|
||||
return entriesToHide.Select(x => x.Id);
|
||||
}
|
||||
|
||||
public IEnumerable<TagDTO> GetAllBookmarkTags(bool showHidden = false)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
|
||||
var activeUserTags = _roContext.BookmarkTags
|
||||
.Include(x => x.Tag)
|
||||
.Where(x => x.Tag.UserId == currentUserId && x.Tag.IsHidden == showHidden)
|
||||
.ToList()
|
||||
.GroupBy(x => x.Tag.Id)
|
||||
.Select(g => g.First()?.Tag);
|
||||
|
||||
return _mapper.Map<IEnumerable<TagDTO>>(activeUserTags);
|
||||
}
|
||||
|
||||
private int GetCurrentUserId()
|
||||
{
|
||||
int.TryParse(_httpContextAccessor.HttpContext.User.Identity.GetUserId(), out int userId);
|
||||
|
||||
@ -15,7 +15,8 @@ namespace YABA.Service.Configuration
|
||||
CreateMap<Bookmark, BookmarkDTO>();
|
||||
CreateMap<CreateBookmarkRequestDTO, Bookmark>();
|
||||
CreateMap<Tag, TagDTO>();
|
||||
CreateMap<Tag, TagSummaryDTO>();
|
||||
CreateMap<CreateTagDTO, Tag>()
|
||||
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name.ToLowerInvariant()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using YABA.Common.DTOs;
|
||||
using YABA.Common.DTOs.Bookmarks;
|
||||
using YABA.Common.DTOs.Tags;
|
||||
|
||||
@ -10,13 +9,14 @@ namespace YABA.Service.Interfaces
|
||||
{
|
||||
Task<BookmarkDTO?> CreateBookmark(CreateBookmarkRequestDTO request);
|
||||
Task<BookmarkDTO?> UpdateBookmark(int id, UpdateBookmarkRequestDTO request);
|
||||
Task<IEnumerable<TagSummaryDTO>?> UpdateBookmarkTags(int id, IEnumerable<string> tags);
|
||||
Task<IEnumerable<TagDTO>?> UpdateBookmarkTags(int id, IEnumerable<string> tags);
|
||||
IEnumerable<BookmarkDTO> GetAll(bool isHidden = false);
|
||||
Task<BookmarkDTO?> Get(int id);
|
||||
IEnumerable<TagSummaryDTO>? GetBookmarkTags(int id);
|
||||
IEnumerable<TagDTO>? GetBookmarkTags(int id);
|
||||
Task<int?> DeleteBookmark(int id);
|
||||
Task<IEnumerable<int>?> DeleteBookmarks(IEnumerable<int> ids);
|
||||
Task<IEnumerable<int>?> HideBookmarks(IEnumerable<int> ids);
|
||||
IEnumerable<TagDTO> GetAllBookmarkTags(bool showHidden = false);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,10 +1,18 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using YABA.Common.DTOs.Tags;
|
||||
|
||||
namespace YABA.Service.Interfaces
|
||||
{
|
||||
public interface ITagsService
|
||||
{
|
||||
public IEnumerable<TagSummaryDTO> GetAll();
|
||||
Task<IEnumerable<TagDTO>?> GetAll();
|
||||
Task<TagDTO?> Get(int id);
|
||||
Task<IEnumerable<TagDTO>?> UpsertTags(IEnumerable<TagDTO> tags);
|
||||
Task<TagDTO?> UpsertTag(TagDTO tag);
|
||||
Task<IEnumerable<int>?> DeleteTags(IEnumerable<int> ids);
|
||||
Task<IEnumerable<int>?> HideTags(IEnumerable<int> ids);
|
||||
Task<TagDTO?> CreateTag(CreateTagDTO request);
|
||||
Task<TagDTO?> UpdateTag(int id, UpdateTagDTO request);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,15 @@
|
||||
using AutoMapper;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using YABA.Common.DTOs.Tags;
|
||||
using YABA.Common.Extensions;
|
||||
using YABA.Data.Context;
|
||||
using YABA.Data.Extensions;
|
||||
using YABA.Models;
|
||||
using YABA.Service.Interfaces;
|
||||
|
||||
namespace YABA.Service
|
||||
@ -13,29 +17,111 @@ namespace YABA.Service
|
||||
public class TagsService : ITagsService
|
||||
{
|
||||
private readonly YABAReadOnlyContext _roContext;
|
||||
private readonly YABAReadWriteContext _rwContext;
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly IMapper _mapper;
|
||||
|
||||
public TagsService(YABAReadOnlyContext roContext, IHttpContextAccessor httpContextAccessor, IMapper mapper)
|
||||
public TagsService(
|
||||
YABAReadOnlyContext roContext,
|
||||
YABAReadWriteContext rwContext,
|
||||
IHttpContextAccessor httpContextAccessor,
|
||||
IMapper mapper)
|
||||
{
|
||||
_roContext = roContext;
|
||||
_rwContext = rwContext;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_mapper = mapper;
|
||||
}
|
||||
|
||||
public IEnumerable<TagSummaryDTO> GetAll()
|
||||
public async Task<IEnumerable<TagDTO>?> GetAll()
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
if (!await _roContext.Users.UserExistsAsync(currentUserId)) return null;
|
||||
|
||||
var activeUserTags = _roContext.Tags
|
||||
.Where(x => x.UserId == currentUserId)
|
||||
.ToList();
|
||||
|
||||
return _mapper.Map<IEnumerable<TagDTO>>(activeUserTags);
|
||||
}
|
||||
|
||||
public async Task<TagDTO?> Get(int id)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
if (!await _roContext.Users.UserExistsAsync(currentUserId)) return null;
|
||||
|
||||
var bookmark = await _roContext.Tags.FirstOrDefaultAsync(x => x.Id == id && x.UserId == currentUserId);
|
||||
return _mapper.Map<TagDTO>(bookmark);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<TagDTO>?> UpsertTags(IEnumerable<TagDTO> tags)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
if (!await _roContext.Users.UserExistsAsync(currentUserId)) return null;
|
||||
|
||||
var tagsToUpsert = tags.Select(x => new Tag { Id = x.Id, Name = x.Name.ToLower(), IsHidden = x.IsHidden, UserId = currentUserId});
|
||||
_rwContext.Tags.UpsertRange(tagsToUpsert);
|
||||
await _rwContext.SaveChangesAsync();
|
||||
|
||||
var newlyUpsertedTags = _roContext.Tags.Where(x => tagsToUpsert.Select(x => x.Name).Contains(x.Name)).ToList();
|
||||
return _mapper.Map<IEnumerable<TagDTO>>(newlyUpsertedTags);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<int>?> DeleteTags(IEnumerable<int> ids)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
if (!await _roContext.Users.UserExistsAsync(currentUserId)) return null;
|
||||
|
||||
var entriesToDelete = _rwContext.Tags.Where(x => x.UserId == currentUserId && ids.Contains(x.Id)).ToList();
|
||||
_rwContext.Tags.RemoveRange(entriesToDelete);
|
||||
|
||||
if (await _rwContext.SaveChangesAsync() <= 0) return null;
|
||||
|
||||
return entriesToDelete.Select(x => x.Id);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<int>?> HideTags(IEnumerable<int> ids)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
if (!await _roContext.Users.UserExistsAsync(currentUserId)) return null;
|
||||
|
||||
var entriesToHide = _rwContext.Tags.Where(x => x.UserId == currentUserId && ids.Contains(x.Id)).ToList();
|
||||
entriesToHide.ForEach((x) => { x.IsHidden = !x.IsHidden; });
|
||||
|
||||
if (await _rwContext.SaveChangesAsync() <= 0) return null;
|
||||
|
||||
return entriesToHide.Select(x => x.Id);
|
||||
}
|
||||
|
||||
public async Task<TagDTO?> UpsertTag(TagDTO tag) => (await UpsertTags(new List<TagDTO>() { tag }))?.FirstOrDefault();
|
||||
|
||||
public async Task<TagDTO?> CreateTag(CreateTagDTO request)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
|
||||
var activeUserTags = _roContext.BookmarkTags
|
||||
.Include(x => x.Tag)
|
||||
.Where(x => x.Tag.UserId == currentUserId)
|
||||
.ToList()
|
||||
.GroupBy(x => x.Tag.Id)
|
||||
.Select(g => g.First()?.Tag);
|
||||
if(!(await _roContext.Users.UserExistsAsync(currentUserId))
|
||||
|| await _roContext.Tags.AnyAsync(x => x.UserId == currentUserId && x.Name.ToLower() == request.Name.ToLower()))
|
||||
return null;
|
||||
|
||||
return _mapper.Map<IEnumerable<TagSummaryDTO>>(activeUserTags);
|
||||
var tag = _mapper.Map<Tag>(request);
|
||||
tag.UserId = currentUserId;
|
||||
|
||||
var newEntity = await _rwContext.Tags.AddAsync(tag);
|
||||
|
||||
return await _rwContext.SaveChangesAsync() > 0 ? _mapper.Map<TagDTO>(newEntity.Entity) : null;
|
||||
}
|
||||
|
||||
public async Task<TagDTO?> UpdateTag(int id, UpdateTagDTO request)
|
||||
{
|
||||
var currentUserId = GetCurrentUserId();
|
||||
var tag = await _rwContext.Tags.FirstOrDefaultAsync(x => x.UserId == currentUserId && x.Id == id);
|
||||
|
||||
if (tag == null) return null;
|
||||
|
||||
tag.Name = !string.IsNullOrEmpty(request.Name) ? request.Name.ToLower() : tag.Name;
|
||||
tag.IsHidden = request.IsHidden.HasValue ? request.IsHidden.Value : tag.IsHidden;
|
||||
|
||||
return await _rwContext.SaveChangesAsync() > 0 ? _mapper.Map<TagDTO>(tag) : null;
|
||||
}
|
||||
|
||||
private int GetCurrentUserId()
|
||||
|
||||
Reference in New Issue
Block a user