mirror of
https://github.com/C9Glax/tranga.git
synced 2025-09-10 11:58:19 +02:00
124 lines
6.4 KiB
C#
124 lines
6.4 KiB
C#
using API.Controllers.DTOs;
|
|
using API.Schema.MangaContext;
|
|
using Asp.Versioning;
|
|
using Microsoft.AspNetCore.Http.HttpResults;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Soenneker.Utils.String.NeedlemanWunsch;
|
|
using static Microsoft.AspNetCore.Http.StatusCodes;
|
|
using Author = API.Controllers.DTOs.Author;
|
|
using Chapter = API.Controllers.DTOs.Chapter;
|
|
|
|
// ReSharper disable InconsistentNaming
|
|
|
|
namespace API.Controllers;
|
|
|
|
[ApiVersion(2)]
|
|
[ApiController]
|
|
[Route("v{v:apiVersion}/[controller]")]
|
|
public class QueryController(MangaContext context) : Controller
|
|
{
|
|
/// <summary>
|
|
/// Returns the <see cref="Author"/> with <paramref name="AuthorId"/>
|
|
/// </summary>
|
|
/// <param name="AuthorId"><see cref="Author"/>.Key</param>
|
|
/// <response code="200"></response>
|
|
/// <response code="404"><see cref="Author"/> with <paramref name="AuthorId"/> not found</response>
|
|
[HttpGet("Author/{AuthorId}")]
|
|
[ProducesResponseType<Author>(Status200OK, "application/json")]
|
|
[ProducesResponseType<string>(Status404NotFound, "text/plain")]
|
|
public async Task<Results<Ok<Author>, NotFound<string>>> GetAuthor (string AuthorId)
|
|
{
|
|
if (await context.Authors.FirstOrDefaultAsync(a => a.Key == AuthorId, HttpContext.RequestAborted) is not { } author)
|
|
return TypedResults.NotFound(nameof(AuthorId));
|
|
|
|
return TypedResults.Ok(new Author(author.Key, author.AuthorName));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns <see cref="Chapter"/> with <paramref name="ChapterId"/>
|
|
/// </summary>
|
|
/// <param name="ChapterId"><see cref="Chapter"/>.Key</param>
|
|
/// <response code="200"></response>
|
|
/// <response code="404"><see cref="Chapter"/> with <paramref name="ChapterId"/> not found</response>
|
|
[HttpGet("Chapter/{ChapterId}")]
|
|
[ProducesResponseType<Chapter>(Status200OK, "application/json")]
|
|
[ProducesResponseType<string>(Status404NotFound, "text/plain")]
|
|
public async Task<Results<Ok<Chapter>, NotFound<string>>> GetChapter (string ChapterId)
|
|
{
|
|
if (await context.Chapters.FirstOrDefaultAsync(c => c.Key == ChapterId, HttpContext.RequestAborted) is not { } chapter)
|
|
return TypedResults.NotFound(nameof(ChapterId));
|
|
|
|
IEnumerable<MangaConnectorId> ids = chapter.MangaConnectorIds.Select(id =>
|
|
new MangaConnectorId(id.Key, id.MangaConnectorName, id.ObjId, id.WebsiteUrl, id.UseForDownload));
|
|
return TypedResults.Ok(new Chapter(chapter.Key, chapter.ParentMangaId, chapter.VolumeNumber, chapter.ChapterNumber, chapter.Title,ids, chapter.Downloaded));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the <see cref="MangaConnectorId{Manga}"/> with <see cref="MangaConnectorId{Manga}"/>.Key
|
|
/// </summary>
|
|
/// <param name="MangaConnectorIdId">Key of <see cref="MangaConnectorId{Manga}"/></param>
|
|
/// <response code="200"></response>
|
|
/// <response code="404"><see cref="MangaConnectorId{Manga}"/> with <paramref name="MangaConnectorIdId"/> not found</response>
|
|
[HttpGet("Manga/MangaConnectorId/{MangaConnectorIdId}")]
|
|
[ProducesResponseType<MangaConnectorId>(Status200OK, "application/json")]
|
|
[ProducesResponseType<string>(Status404NotFound, "text/plain")]
|
|
public async Task<Results<Ok<MangaConnectorId>, NotFound<string>>> GetMangaMangaConnectorId (string MangaConnectorIdId)
|
|
{
|
|
if (await context.MangaConnectorToManga.FirstOrDefaultAsync(c => c.Key == MangaConnectorIdId, HttpContext.RequestAborted) is not { } mcIdManga)
|
|
return TypedResults.NotFound(nameof(MangaConnectorIdId));
|
|
|
|
MangaConnectorId result = new (mcIdManga.Key, mcIdManga.MangaConnectorName, mcIdManga.ObjId, mcIdManga.WebsiteUrl, mcIdManga.UseForDownload);
|
|
|
|
return TypedResults.Ok(result);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns <see cref="Schema.MangaContext.Manga"/> with names similar to <see cref="Schema.MangaContext.Manga"/> (identified by <paramref name="MangaId"/>)
|
|
/// </summary>
|
|
/// <param name="MangaId">Key of <see cref="Schema.MangaContext.Manga"/></param>
|
|
/// <response code="200"></response>
|
|
/// <response code="404"><see cref="Schema.MangaContext.Manga"/> with <paramref name="MangaId"/> not found</response>
|
|
/// <response code="500">Error during Database Operation</response>
|
|
[HttpGet("Manga/{MangaId}/SimilarName")]
|
|
[ProducesResponseType<List<string>>(Status200OK, "application/json")]
|
|
[ProducesResponseType<string>(Status404NotFound, "text/plain")]
|
|
[ProducesResponseType(Status500InternalServerError)]
|
|
public async Task<Results<Ok<List<string>>, NotFound<string>, InternalServerError>> GetSimilarManga (string MangaId)
|
|
{
|
|
if (await context.Mangas.FirstOrDefaultAsync(m => m.Key == MangaId, HttpContext.RequestAborted) is not { } manga)
|
|
return TypedResults.NotFound(nameof(MangaId));
|
|
|
|
string name = manga.Name;
|
|
|
|
if (await context.Mangas.Where(m => m.Key != MangaId)
|
|
.ToDictionaryAsync(m => m.Key, m => m.Name, HttpContext.RequestAborted) is not { } mangaNames)
|
|
return TypedResults.InternalServerError();
|
|
|
|
List<string> similarIds = mangaNames
|
|
.Where(kv => NeedlemanWunschStringUtil.CalculateSimilarityPercentage(name, kv.Value) > 0.8)
|
|
.Select(kv => kv.Key)
|
|
.ToList();
|
|
|
|
return TypedResults.Ok(similarIds);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the <see cref="MangaConnectorId{Chapter}"/> with <see cref="MangaConnectorId{Chapter}"/>.Key
|
|
/// </summary>
|
|
/// <param name="MangaConnectorIdId">Key of <see cref="MangaConnectorId{Manga}"/></param>
|
|
/// <response code="200"></response>
|
|
/// <response code="404"><see cref="MangaConnectorId{Chapter}"/> with <paramref name="MangaConnectorIdId"/> not found</response>
|
|
[HttpGet("Chapter/MangaConnectorId/{MangaConnectorIdId}")]
|
|
[ProducesResponseType<MangaConnectorId>(Status200OK, "application/json")]
|
|
[ProducesResponseType<string>(Status404NotFound, "text/plain")]
|
|
public async Task<Results<Ok<MangaConnectorId>, NotFound<string>>> GetChapterMangaConnectorId (string MangaConnectorIdId)
|
|
{
|
|
if (await context.MangaConnectorToManga.FirstOrDefaultAsync(c => c.Key == MangaConnectorIdId, HttpContext.RequestAborted) is not { } mcIdChapter)
|
|
return TypedResults.NotFound(nameof(MangaConnectorIdId));
|
|
|
|
MangaConnectorId result = new(mcIdChapter.Key, mcIdChapter.MangaConnectorName, mcIdChapter.ObjId, mcIdChapter.WebsiteUrl, mcIdChapter.UseForDownload);
|
|
|
|
return TypedResults.Ok(result);
|
|
}
|
|
} |