using System; using System.Linq; using System.Threading.Tasks; using API.Data; using API.Data.Repositories; 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)); } /// /// Search for different entities against the query string /// /// /// Defaults to 15, if 0 will not apply any limit to search results and may result in longer response times /// [HttpGet("search")] public async Task> Search(string queryString, int maxRecords = 15) { queryString = Uri.UnescapeDataString(queryString) .Trim() .Replace(@"%", string.Empty) .Replace(":", string.Empty); var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Library); if (!user.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, user.Libraries.Select(l => l.Id).ToArray(), queryString, maxRecords); return Ok(series); } }