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 API.Services; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; /// /// 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) { 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 = Services.Tasks.Scanner.Parser.Parser.CleanQuery(queryString); var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); if (user == null) return Unauthorized(); var libraries = _unitOfWork.LibraryRepository.GetLibraryIdsForUserIdAsync(user.Id, QueryContext.Search).ToList(); if (!libraries.Any()) return BadRequest(await _localizationService.Translate(User.GetUserId(), "libraries-restricted")); var isAdmin = await _unitOfWork.UserRepository.IsUserAdminAsync(user); var series = await _unitOfWork.SeriesRepository.SearchSeries(user.Id, isAdmin, libraries, queryString); return Ok(series); } }