using System; using System.Linq; using System.Threading.Tasks; using API.Data; using API.DTOs; using API.DTOs.Search; using API.Extensions; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; /// /// Responsible for the Search interface from the UI /// public class SearchController : BaseApiController { private readonly IUnitOfWork _unitOfWork; public SearchController(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } /// /// Returns the series for the MangaFile id. If the user does not have access (shouldn't happen by the UI), /// then null is returned /// /// /// [HttpGet("series-for-mangafile")] public async Task> GetSeriesForMangaFile(int mangaFileId) { var userId = await _unitOfWork.UserRepository.GetUserIdByUsernameAsync(User.GetUsername()); return Ok(await _unitOfWork.SeriesRepository.GetSeriesForMangaFile(mangaFileId, userId)); } /// /// Returns the series for the Chapter id. If the user does not have access (shouldn't happen by the UI), /// then null is returned /// /// /// [HttpGet("series-for-chapter")] public async Task> GetSeriesForChapter(int chapterId) { var userId = await _unitOfWork.UserRepository.GetUserIdByUsernameAsync(User.GetUsername()); return Ok(await _unitOfWork.SeriesRepository.GetSeriesForChapter(chapterId, userId)); } [HttpGet("search")] public async Task> Search(string queryString) { queryString = Uri.UnescapeDataString(queryString).Trim().Replace(@"%", string.Empty).Replace(":", string.Empty); var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); // Get libraries user has access to var libraries = (await _unitOfWork.LibraryRepository.GetLibrariesForUserIdAsync(user.Id)).ToList(); if (!libraries.Any()) return BadRequest("User does not have access to any libraries"); if (!libraries.Any()) return BadRequest("User does not have access to any libraries"); var isAdmin = await _unitOfWork.UserRepository.IsUserAdminAsync(user); var series = await _unitOfWork.SeriesRepository.SearchSeries(user.Id, isAdmin, libraries.Select(l => l.Id).ToArray(), queryString); return Ok(series); } }