using System.Threading.Tasks; using Kavita.API.Database; using Kavita.API.Repositories; using Kavita.API.Services; using Kavita.Models.Constants; using Kavita.Models.DTOs; using Kavita.Models.DTOs.Search; using Kavita.Server.Attributes; using Kavita.Services.Scanner; using Microsoft.AspNetCore.Mvc; namespace Kavita.Server.Controllers; /// /// Responsible for the Search interface from the UI /// public class SearchController(IUnitOfWork unitOfWork, ILocalizationService localizationService) : BaseApiController { /// /// 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 series = await unitOfWork.SeriesRepository.GetSeriesForMangaFile(mangaFileId, UserId); if (series == null) return NotFound(); if (!await unitOfWork.UserRepository.HasAccessToSeries(UserId, series.Id)) return NotFound(); return Ok(series); } /// /// Returns the series for the Chapter id. If the user does not have access (shouldn't happen by the UI), /// then null is returned /// /// /// [ChapterAccess] [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 = 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); } }