using System.Linq; using System.Threading.Tasks; using API.Constants; using API.Data; using API.Data.Repositories; using API.DTOs; using API.DTOs.Search; using API.Services; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; #nullable enable /// /// Responsible for the Search interface from the UI /// public class SearchController : BaseApiController { private readonly IUnitOfWork _unitOfWork; private readonly ILocalizationService _localizationService; public SearchController(IUnitOfWork unitOfWork, ILocalizationService localizationService) { _unitOfWork = unitOfWork; _localizationService = localizationService; } /// /// 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) { 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) { return Ok(await _unitOfWork.SeriesRepository.GetSeriesForChapter(chapterId, UserId)); } /// /// Searches against different entities in the system against a query string /// /// /// Include Chapter and Filenames in the entities. This can slow down the search on larger systems /// [HttpGet("search")] public async Task> Search(string queryString, [FromQuery] bool includeChapterAndFiles = true) { queryString = Services.Tasks.Scanner.Parser.Parser.CleanQuery(queryString); var libraries = await _unitOfWork.LibraryRepository.GetLibraryIdsForUserIdAsync(UserId, QueryContext.Search); if (libraries.Count == 0) return BadRequest(await _localizationService.Translate(UserId, "libraries-restricted")); var isAdmin = UserContext.HasRole(PolicyConstants.AdminRole); var series = await _unitOfWork.SeriesRepository.SearchSeries(UserId, isAdmin, libraries, queryString, includeChapterAndFiles); return Ok(series); } }