Fixed grant-access api and new library to properly update the db. Somehow the old way of updating db no longer works.

This commit is contained in:
Joseph Milazzo 2021-01-18 17:18:42 -06:00
parent 80283bcd49
commit 295e62d773
7 changed files with 64 additions and 61 deletions

View File

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -60,14 +61,7 @@ namespace API.Controllers
Folders = createLibraryDto.Folders.Select(x => new FolderPath {Path = x}).ToList() Folders = createLibraryDto.Folders.Select(x => new FolderPath {Path = x}).ToList()
}; };
foreach (var admin in admins) _unitOfWork.LibraryRepository.Update(library);
{
// If user is null, then set it
admin.Libraries ??= new List<Library>();
admin.Libraries.Add(library);
}
if (!await _unitOfWork.Complete()) if (!await _unitOfWork.Complete())
{ {
return BadRequest("There was a critical issue. Please try again."); return BadRequest("There was a critical issue. Please try again.");
@ -87,7 +81,6 @@ namespace API.Controllers
[HttpGet("list")] [HttpGet("list")]
public ActionResult<IEnumerable<string>> GetDirectories(string path) public ActionResult<IEnumerable<string>> GetDirectories(string path)
{ {
// TODO: Move this to another controller.
if (string.IsNullOrEmpty(path)) if (string.IsNullOrEmpty(path))
{ {
return Ok(Directory.GetLogicalDrives()); return Ok(Directory.GetLogicalDrives());
@ -105,26 +98,46 @@ namespace API.Controllers
} }
[Authorize(Policy = "RequireAdminRole")] [Authorize(Policy = "RequireAdminRole")]
[HttpPut("grant-access")] [HttpPost("grant-access")]
public async Task<ActionResult<MemberDto>> AddLibraryToUser(UpdateLibraryForUserDto updateLibraryForUserDto) public async Task<ActionResult<MemberDto>> UpdateUserLibraries(UpdateLibraryForUserDto updateLibraryForUserDto)
{ {
var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(updateLibraryForUserDto.Username); var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(updateLibraryForUserDto.Username);
if (user == null) return BadRequest("Could not validate user"); if (user == null) return BadRequest("Could not validate user");
user.Libraries = new List<Library>(); var libraryString = String.Join(",", updateLibraryForUserDto.SelectedLibraries.Select(x => x.Name));
_logger.LogInformation($"Granting user {updateLibraryForUserDto.Username} access to: {libraryString}");
foreach (var selectedLibrary in updateLibraryForUserDto.SelectedLibraries)
var allLibraries = await _unitOfWork.LibraryRepository.GetLibrariesAsync();
foreach (var library in allLibraries)
{ {
user.Libraries.Add(_mapper.Map<Library>(selectedLibrary)); library.AppUsers ??= new List<AppUser>();
var libraryContainsUser = library.AppUsers.Any(u => u.UserName == user.UserName);
var libraryIsSelected = updateLibraryForUserDto.SelectedLibraries.Any(l => l.Id == library.Id);
if (libraryContainsUser && !libraryIsSelected)
{
// Remove
library.AppUsers.Remove(user);
}
else if (!libraryContainsUser && libraryIsSelected)
{
library.AppUsers.Add(user);
}
} }
if (!_unitOfWork.HasChanges())
{
_logger.LogInformation($"Added: {updateLibraryForUserDto.SelectedLibraries} to {updateLibraryForUserDto.Username}");
return Ok(_mapper.Map<MemberDto>(user));
}
if (await _unitOfWork.Complete()) if (await _unitOfWork.Complete())
{ {
_logger.LogInformation($"Added: {updateLibraryForUserDto.SelectedLibraries} to {updateLibraryForUserDto.Username}"); _logger.LogInformation($"Added: {updateLibraryForUserDto.SelectedLibraries} to {updateLibraryForUserDto.Username}");
return Ok(user); return Ok(_mapper.Map<MemberDto>(user));
} }
return BadRequest("There was a critical issue. Please try again."); return BadRequest("There was a critical issue. Please try again.");
} }
@ -132,15 +145,14 @@ namespace API.Controllers
[HttpPost("scan")] [HttpPost("scan")]
public ActionResult Scan(int libraryId) public ActionResult Scan(int libraryId)
{ {
//BackgroundJob.Enqueue(() => _directoryService.ScanLibrary(libraryId, true));
_taskScheduler.ScanLibrary(libraryId, true); _taskScheduler.ScanLibrary(libraryId, true);
return Ok(); return Ok();
} }
[HttpGet("libraries-for")] [HttpGet("libraries")]
public async Task<ActionResult<IEnumerable<LibraryDto>>> GetLibrariesForUser(string username) public async Task<ActionResult<IEnumerable<LibraryDto>>> GetLibrariesForUser()
{ {
return Ok(await _unitOfWork.LibraryRepository.GetLibraryDtosForUsernameAsync(username)); return Ok(await _unitOfWork.LibraryRepository.GetLibraryDtosForUsernameAsync(User.GetUsername()));
} }
[HttpGet("series")] [HttpGet("series")]

View File

@ -36,6 +36,13 @@ namespace API.Data
.AsNoTracking() .AsNoTracking()
.ToListAsync(); .ToListAsync();
} }
public async Task<IEnumerable<Library>> GetLibrariesAsync()
{
return await _context.Library
.Include(l => l.AppUsers)
.ToListAsync();
}
public async Task<Library> GetLibraryForNameAsync(string libraryName) public async Task<Library> GetLibraryForNameAsync(string libraryName)
{ {

View File

@ -32,27 +32,9 @@ namespace API.Data
public void Delete(AppUser user) public void Delete(AppUser user)
{ {
// TODO: Check how to implement for _userMangaer
_context.AppUser.Remove(user); _context.AppUser.Remove(user);
} }
public async Task<bool> SaveAllAsync()
{
return await _context.SaveChangesAsync() > 0;
}
public async Task<IEnumerable<AppUser>> GetUsersAsync()
{
return await _userManager.Users.ToListAsync();
//return await _context.Users.ToListAsync();
}
public async Task<AppUser> GetUserByIdAsync(int id)
{
// TODO: How to use userManager
return await _context.AppUser.FindAsync(id);
}
/// <summary> /// <summary>
/// Gets an AppUser by username. Returns back Progress information. /// Gets an AppUser by username. Returns back Progress information.
/// </summary> /// </summary>
@ -60,7 +42,7 @@ namespace API.Data
/// <returns></returns> /// <returns></returns>
public async Task<AppUser> GetUserByUsernameAsync(string username) public async Task<AppUser> GetUserByUsernameAsync(string username)
{ {
return await _userManager.Users return await _context.Users
.Include(u => u.Progresses) .Include(u => u.Progresses)
.SingleOrDefaultAsync(x => x.UserName == username); .SingleOrDefaultAsync(x => x.UserName == username);
} }
@ -72,7 +54,7 @@ namespace API.Data
public async Task<IEnumerable<MemberDto>> GetMembersAsync() public async Task<IEnumerable<MemberDto>> GetMembersAsync()
{ {
return await _userManager.Users return await _context.Users
.Include(x => x.Libraries) .Include(x => x.Libraries)
.Include(r => r.UserRoles) .Include(r => r.UserRoles)
.ThenInclude(r => r.Role) .ThenInclude(r => r.Role)
@ -92,21 +74,16 @@ namespace API.Data
Folders = l.Folders.Select(x => x.Path).ToList() Folders = l.Folders.Select(x => x.Path).ToList()
}).ToList() }).ToList()
}) })
.AsNoTracking()
.ToListAsync(); .ToListAsync();
} }
public async Task<MemberDto> GetMemberAsync(string username) // public async Task<MemberDto> GetMemberAsync(string username)
{ // {
return await _userManager.Users.Where(x => x.UserName == username) // return await _context.Users.Where(x => x.UserName == username)
.Include(x => x.Libraries) // .Include(x => x.Libraries)
.ProjectTo<MemberDto>(_mapper.ConfigurationProvider) // .ProjectTo<MemberDto>(_mapper.ConfigurationProvider)
.SingleOrDefaultAsync(); // .SingleOrDefaultAsync();
} // }
public void UpdateReadingProgressAsync(int volumeId, int pageNum)
{
}
} }
} }

View File

@ -10,6 +10,13 @@ namespace API.Helpers
public AutoMapperProfiles() public AutoMapperProfiles()
{ {
CreateMap<LibraryDto, Library>(); CreateMap<LibraryDto, Library>();
// .ForMember(dest => dest.Folders,
// opt =>
// opt.MapFrom(src => src.Folders.Select(x => new FolderPath()
// {
// Path = x,
// //LibraryId = src.Id
// }).ToList()));
CreateMap<Volume, VolumeDto>(); CreateMap<Volume, VolumeDto>();

View File

@ -12,6 +12,7 @@ namespace API.Interfaces
Task<bool> LibraryExists(string libraryName); Task<bool> LibraryExists(string libraryName);
Task<Library> GetLibraryForIdAsync(int libraryId); Task<Library> GetLibraryForIdAsync(int libraryId);
Task<IEnumerable<LibraryDto>> GetLibraryDtosForUsernameAsync(string userName); Task<IEnumerable<LibraryDto>> GetLibraryDtosForUsernameAsync(string userName);
Task<IEnumerable<Library>> GetLibrariesAsync();
Task<Library> GetLibraryForNameAsync(string libraryName); Task<Library> GetLibraryForNameAsync(string libraryName);
Task<bool> DeleteLibrary(int libraryId); Task<bool> DeleteLibrary(int libraryId);
} }

View File

@ -8,9 +8,9 @@ namespace API.Interfaces
public interface IUserRepository public interface IUserRepository
{ {
void Update(AppUser user); void Update(AppUser user);
public void Delete(AppUser user);
Task<AppUser> GetUserByUsernameAsync(string username); Task<AppUser> GetUserByUsernameAsync(string username);
Task<IEnumerable<MemberDto>> GetMembersAsync(); Task<IEnumerable<MemberDto>> GetMembersAsync();
public void Delete(AppUser user);
Task<IEnumerable<AppUser>> GetAdminUsersAsync(); Task<IEnumerable<AppUser>> GetAdminUsersAsync();
} }
} }

View File

@ -10,7 +10,7 @@ namespace API.Services
private readonly ILogger<TaskScheduler> _logger; private readonly ILogger<TaskScheduler> _logger;
private readonly IUnitOfWork _unitOfWork; private readonly IUnitOfWork _unitOfWork;
private readonly IDirectoryService _directoryService; private readonly IDirectoryService _directoryService;
private readonly BackgroundJobServer _client; public BackgroundJobServer Client => new BackgroundJobServer();
public TaskScheduler(ICacheService cacheService, ILogger<TaskScheduler> logger, public TaskScheduler(ICacheService cacheService, ILogger<TaskScheduler> logger,
IUnitOfWork unitOfWork, IDirectoryService directoryService) IUnitOfWork unitOfWork, IDirectoryService directoryService)
@ -19,8 +19,7 @@ namespace API.Services
_logger = logger; _logger = logger;
_unitOfWork = unitOfWork; _unitOfWork = unitOfWork;
_directoryService = directoryService; _directoryService = directoryService;
_client = new BackgroundJobServer();
_logger.LogInformation("Scheduling/Updating cache cleanup on a daily basis."); _logger.LogInformation("Scheduling/Updating cache cleanup on a daily basis.");
RecurringJob.AddOrUpdate(() => _cacheService.Cleanup(), Cron.Daily); RecurringJob.AddOrUpdate(() => _cacheService.Cleanup(), Cron.Daily);
//RecurringJob.AddOrUpdate(() => scanService.ScanLibraries(), Cron.Daily); //RecurringJob.AddOrUpdate(() => scanService.ScanLibraries(), Cron.Daily);