mirror of
https://github.com/C9Glax/tranga.git
synced 2025-09-10 03:48:19 +02:00
MangaConnector DTO
This commit is contained in:
28
API/Controllers/DTOs/MangaConnector.cs
Normal file
28
API/Controllers/DTOs/MangaConnector.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace API.Controllers.DTOs;
|
||||||
|
|
||||||
|
public sealed record MangaConnector(string Name, bool Enabled, string IconUrl, string[] SupportedLanguages) : Identifiable(Name)
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Whether Connector is used for Searches and Downloads
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
[Description("Whether Connector is used for Searches and Downloads")]
|
||||||
|
public bool Enabled { get; init; } = Enabled;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Languages supported by the Connector
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
[Description("Languages supported by the Connector")]
|
||||||
|
public string[] SupportedLanguages { get; init; } = SupportedLanguages;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Url of the Website Icon
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
[Description("Url of the Website Icon")]
|
||||||
|
public string IconUrl { get; init; } = IconUrl;
|
||||||
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
using API.MangaConnectors;
|
using API.Controllers.DTOs;
|
||||||
using API.Schema.MangaContext;
|
using API.Schema.MangaContext;
|
||||||
using Asp.Versioning;
|
using Asp.Versioning;
|
||||||
using Microsoft.AspNetCore.Http.HttpResults;
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
@@ -14,20 +14,22 @@ namespace API.Controllers;
|
|||||||
public class MangaConnectorController(MangaContext context) : Controller
|
public class MangaConnectorController(MangaContext context) : Controller
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get all <see cref="MangaConnector"/> (Scanlation-Sites)
|
/// Get all <see cref="API.MangaConnectors.MangaConnector"/> (Scanlation-Sites)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <response code="200">Names of <see cref="MangaConnector"/> (Scanlation-Sites)</response>
|
/// <response code="200">Names of <see cref="API.MangaConnectors.MangaConnector"/> (Scanlation-Sites)</response>
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[ProducesResponseType<List<MangaConnector>>(Status200OK, "application/json")]
|
[ProducesResponseType<List<MangaConnector>>(Status200OK, "application/json")]
|
||||||
public Ok<List<MangaConnector>> GetConnectors()
|
public Ok<List<MangaConnector>> GetConnectors()
|
||||||
{
|
{
|
||||||
return TypedResults.Ok(Tranga.MangaConnectors.ToList());
|
return TypedResults.Ok(Tranga.MangaConnectors
|
||||||
|
.Select(c => new MangaConnector(c.Name, c.Enabled, c.IconUrl, c.SupportedLanguages))
|
||||||
|
.ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the <see cref="MangaConnector"/> (Scanlation-Sites) with the requested Name
|
/// Returns the <see cref="API.MangaConnectors.MangaConnector"/> (Scanlation-Sites) with the requested Name
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="MangaConnectorName"><see cref="MangaConnector"/>.Name</param>
|
/// <param name="MangaConnectorName"><see cref="API.MangaConnectors.MangaConnector"/>.Name</param>
|
||||||
/// <response code="200"></response>
|
/// <response code="200"></response>
|
||||||
/// <response code="404"><see cref="MangaConnector"/> (Scanlation-Sites) with Name not found.</response>
|
/// <response code="404"><see cref="MangaConnector"/> (Scanlation-Sites) with Name not found.</response>
|
||||||
[HttpGet("{MangaConnectorName}")]
|
[HttpGet("{MangaConnectorName}")]
|
||||||
@@ -38,22 +40,25 @@ public class MangaConnectorController(MangaContext context) : Controller
|
|||||||
if(Tranga.MangaConnectors.FirstOrDefault(c => c.Name.Equals(MangaConnectorName, StringComparison.InvariantCultureIgnoreCase)) is not { } connector)
|
if(Tranga.MangaConnectors.FirstOrDefault(c => c.Name.Equals(MangaConnectorName, StringComparison.InvariantCultureIgnoreCase)) is not { } connector)
|
||||||
return TypedResults.NotFound(nameof(MangaConnectorName));
|
return TypedResults.NotFound(nameof(MangaConnectorName));
|
||||||
|
|
||||||
return TypedResults.Ok(connector);
|
return TypedResults.Ok(new MangaConnector(connector.Name, connector.Enabled, connector.IconUrl, connector.SupportedLanguages));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get all enabled <see cref="MangaConnector"/> (Scanlation-Sites)
|
/// Get all enabled <see cref="API.MangaConnectors.MangaConnector"/> (Scanlation-Sites)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <response code="200"></response>
|
/// <response code="200"></response>
|
||||||
[HttpGet("Enabled")]
|
[HttpGet("Enabled")]
|
||||||
[ProducesResponseType<List<MangaConnector>>(Status200OK, "application/json")]
|
[ProducesResponseType<List<MangaConnector>>(Status200OK, "application/json")]
|
||||||
public Ok<List<MangaConnector>> GetEnabledConnectors()
|
public Ok<List<MangaConnector>> GetEnabledConnectors()
|
||||||
{
|
{
|
||||||
return TypedResults.Ok(Tranga.MangaConnectors.Where(c => c.Enabled).ToList());
|
return TypedResults.Ok(Tranga.MangaConnectors
|
||||||
|
.Where(c => c.Enabled)
|
||||||
|
.Select(c => new MangaConnector(c.Name, c.Enabled, c.IconUrl, c.SupportedLanguages))
|
||||||
|
.ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get all disabled <see cref="MangaConnector"/> (Scanlation-Sites)
|
/// Get all disabled <see cref="API.MangaConnectors.MangaConnector"/> (Scanlation-Sites)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <response code="200"></response>
|
/// <response code="200"></response>
|
||||||
[HttpGet("Disabled")]
|
[HttpGet("Disabled")]
|
||||||
@@ -61,16 +66,19 @@ public class MangaConnectorController(MangaContext context) : Controller
|
|||||||
public Ok<List<MangaConnector>> GetDisabledConnectors()
|
public Ok<List<MangaConnector>> GetDisabledConnectors()
|
||||||
{
|
{
|
||||||
|
|
||||||
return TypedResults.Ok(Tranga.MangaConnectors.Where(c => c.Enabled == false).ToList());
|
return TypedResults.Ok(Tranga.MangaConnectors
|
||||||
|
.Where(c => c.Enabled == false)
|
||||||
|
.Select(c => new MangaConnector(c.Name, c.Enabled, c.IconUrl, c.SupportedLanguages))
|
||||||
|
.ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enabled or disables <see cref="MangaConnector"/> (Scanlation-Sites) with Name
|
/// Enabled or disables <see cref="API.MangaConnectors.MangaConnector"/> (Scanlation-Sites) with Name
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="MangaConnectorName"><see cref="MangaConnector"/>.Name</param>
|
/// <param name="MangaConnectorName"><see cref="API.MangaConnectors.MangaConnector"/>.Name</param>
|
||||||
/// <param name="Enabled">Set true to enable, false to disable</param>
|
/// <param name="Enabled">Set true to enable, false to disable</param>
|
||||||
/// <response code="200"></response>
|
/// <response code="200"></response>
|
||||||
/// <response code="404"><see cref="MangaConnector"/> (Scanlation-Sites) with Name not found.</response>
|
/// <response code="404"><see cref="API.MangaConnectors.MangaConnector"/> (Scanlation-Sites) with Name not found.</response>
|
||||||
/// <response code="500">Error during Database Operation</response>
|
/// <response code="500">Error during Database Operation</response>
|
||||||
[HttpPatch("{MangaConnectorName}/SetEnabled/{Enabled}")]
|
[HttpPatch("{MangaConnectorName}/SetEnabled/{Enabled}")]
|
||||||
[ProducesResponseType(Status200OK)]
|
[ProducesResponseType(Status200OK)]
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using API.Controllers.DTOs;
|
using API.Controllers.DTOs;
|
||||||
using API.MangaConnectors;
|
|
||||||
using API.Schema.MangaContext;
|
using API.Schema.MangaContext;
|
||||||
using API.Workers;
|
using API.Workers;
|
||||||
using Asp.Versioning;
|
using Asp.Versioning;
|
||||||
@@ -67,7 +66,7 @@ public class MangaController(MangaContext context) : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns all <see cref="Schema.MangaContext.Manga"/> that are being downloaded from at least one <see cref="MangaConnector"/>
|
/// Returns all <see cref="Schema.MangaContext.Manga"/> that are being downloaded from at least one <see cref="API.MangaConnectors.MangaConnector"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <response code="200"><see cref="MinimalManga"/> exert of <see cref="Schema.MangaContext.Manga"/>. Use <see cref="GetManga"/> for more information</response>
|
/// <response code="200"><see cref="MinimalManga"/> exert of <see cref="Schema.MangaContext.Manga"/>. Use <see cref="GetManga"/> for more information</response>
|
||||||
/// <response code="500">Error during Database Operation</response>
|
/// <response code="500">Error during Database Operation</response>
|
||||||
@@ -320,7 +319,7 @@ public class MangaController(MangaContext context) : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the latest <see cref="Chapter"/> of requested <see cref="Manga"/> available on <see cref="MangaConnector"/>
|
/// Returns the latest <see cref="Chapter"/> of requested <see cref="Manga"/> available on <see cref="API.MangaConnectors.MangaConnector"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="MangaId"><see cref="Manga"/>.Key</param>
|
/// <param name="MangaId"><see cref="Manga"/>.Key</param>
|
||||||
/// <response code="200"></response>
|
/// <response code="200"></response>
|
||||||
@@ -457,15 +456,15 @@ public class MangaController(MangaContext context) : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// (Un-)Marks <see cref="Manga"/> as requested for Download from <see cref="MangaConnector"/>
|
/// (Un-)Marks <see cref="Manga"/> as requested for Download from <see cref="API.MangaConnectors.MangaConnector"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="MangaId"><see cref="Manga"/> with <paramref name="MangaId"/></param>
|
/// <param name="MangaId"><see cref="Manga"/> with <paramref name="MangaId"/></param>
|
||||||
/// <param name="MangaConnectorName"><see cref="MangaConnector"/> with <paramref name="MangaConnectorName"/></param>
|
/// <param name="MangaConnectorName"><see cref="API.MangaConnectors.MangaConnector"/> with <paramref name="MangaConnectorName"/></param>
|
||||||
/// <param name="IsRequested">true to mark as requested, false to mark as not-requested</param>
|
/// <param name="IsRequested">true to mark as requested, false to mark as not-requested</param>
|
||||||
/// <response code="200"></response>
|
/// <response code="200"></response>
|
||||||
/// <response code="404"><paramref name="MangaId"/> or <paramref name="MangaConnectorName"/> not found</response>
|
/// <response code="404"><paramref name="MangaId"/> or <paramref name="MangaConnectorName"/> not found</response>
|
||||||
/// <response code="412"><see cref="Manga"/> was not linked to <see cref="MangaConnector"/>, so nothing changed</response>
|
/// <response code="412"><see cref="Manga"/> was not linked to <see cref="API.MangaConnectors.MangaConnector"/>, so nothing changed</response>
|
||||||
/// <response code="428"><see cref="Manga"/> is not linked to <see cref="MangaConnector"/> yet. Search for <see cref="Manga"/> on <see cref="MangaConnector"/> first (to create a <see cref="MangaConnectorId{T}"/>).</response>
|
/// <response code="428"><see cref="Manga"/> is not linked to <see cref="API.MangaConnectors.MangaConnector"/> yet. Search for <see cref="Manga"/> on <see cref="API.MangaConnectors.MangaConnector"/> first (to create a <see cref="MangaConnectorId{T}"/>).</response>
|
||||||
/// <response code="500">Error during Database Operation</response>
|
/// <response code="500">Error during Database Operation</response>
|
||||||
[HttpPost("{MangaId}/SetAsDownloadFrom/{MangaConnectorName}/{IsRequested}")]
|
[HttpPost("{MangaId}/SetAsDownloadFrom/{MangaConnectorName}/{IsRequested}")]
|
||||||
[ProducesResponseType(Status200OK)]
|
[ProducesResponseType(Status200OK)]
|
||||||
@@ -477,7 +476,7 @@ public class MangaController(MangaContext context) : Controller
|
|||||||
{
|
{
|
||||||
if (await context.Mangas.FirstOrDefaultAsync(m => m.Key == MangaId, HttpContext.RequestAborted) is not { } _)
|
if (await context.Mangas.FirstOrDefaultAsync(m => m.Key == MangaId, HttpContext.RequestAborted) is not { } _)
|
||||||
return TypedResults.NotFound(nameof(MangaId));
|
return TypedResults.NotFound(nameof(MangaId));
|
||||||
if(!Tranga.TryGetMangaConnector(MangaConnectorName, out MangaConnector? _))
|
if(!Tranga.TryGetMangaConnector(MangaConnectorName, out API.MangaConnectors.MangaConnector? _))
|
||||||
return TypedResults.NotFound(nameof(MangaConnectorName));
|
return TypedResults.NotFound(nameof(MangaConnectorName));
|
||||||
|
|
||||||
if (context.MangaConnectorToManga
|
if (context.MangaConnectorToManga
|
||||||
@@ -502,13 +501,13 @@ public class MangaController(MangaContext context) : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initiate a search for <see cref="API.Schema.MangaContext.Manga"/> on a different <see cref="MangaConnector"/>
|
/// Initiate a search for <see cref="API.Schema.MangaContext.Manga"/> on a different <see cref="API.MangaConnectors.MangaConnector"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="MangaId"><see cref="API.Schema.MangaContext.Manga"/> with <paramref name="MangaId"/></param>
|
/// <param name="MangaId"><see cref="API.Schema.MangaContext.Manga"/> with <paramref name="MangaId"/></param>
|
||||||
/// <param name="MangaConnectorName"><see cref="MangaConnector"/>.Name</param>
|
/// <param name="MangaConnectorName"><see cref="API.MangaConnectors.MangaConnector"/>.Name</param>
|
||||||
/// <response code="200"><see cref="MinimalManga"/> exert of <see cref="Schema.MangaContext.Manga"/></response>
|
/// <response code="200"><see cref="MinimalManga"/> exert of <see cref="Schema.MangaContext.Manga"/></response>
|
||||||
/// <response code="404"><see cref="MangaConnector"/> with Name not found</response>
|
/// <response code="404"><see cref="API.MangaConnectors.MangaConnector"/> with Name not found</response>
|
||||||
/// <response code="412"><see cref="MangaConnector"/> with Name is disabled</response>
|
/// <response code="412"><see cref="API.MangaConnectors.MangaConnector"/> with Name is disabled</response>
|
||||||
[HttpPost("{MangaId}/SearchOn/{MangaConnectorName}")]
|
[HttpPost("{MangaId}/SearchOn/{MangaConnectorName}")]
|
||||||
[ProducesResponseType<List<MinimalManga>>(Status200OK, "application/json")]
|
[ProducesResponseType<List<MinimalManga>>(Status200OK, "application/json")]
|
||||||
[ProducesResponseType<string>(Status404NotFound, "text/plain")]
|
[ProducesResponseType<string>(Status404NotFound, "text/plain")]
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using API.Controllers.DTOs;
|
using API.Controllers.DTOs;
|
||||||
using API.MangaConnectors;
|
|
||||||
using API.Schema.MangaContext;
|
using API.Schema.MangaContext;
|
||||||
using Asp.Versioning;
|
using Asp.Versioning;
|
||||||
using Microsoft.AspNetCore.Http.HttpResults;
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
|
@@ -12,27 +12,14 @@ namespace API.MangaConnectors;
|
|||||||
[PrimaryKey("Name")]
|
[PrimaryKey("Name")]
|
||||||
public abstract class MangaConnector(string name, string[] supportedLanguages, string[] baseUris, string iconUrl)
|
public abstract class MangaConnector(string name, string[] supportedLanguages, string[] baseUris, string iconUrl)
|
||||||
{
|
{
|
||||||
[JsonIgnore]
|
[NotMapped] internal DownloadClient downloadClient { get; init; } = null!;
|
||||||
[NotMapped]
|
|
||||||
internal DownloadClient downloadClient { get; init; } = null!;
|
|
||||||
|
|
||||||
[JsonIgnore]
|
[NotMapped] protected ILog Log { get; init; } = LogManager.GetLogger(name);
|
||||||
[NotMapped]
|
|
||||||
protected ILog Log { get; init; } = LogManager.GetLogger(name);
|
|
||||||
|
|
||||||
[StringLength(32)]
|
[StringLength(32)] public string Name { get; init; } = name;
|
||||||
[Required]
|
[StringLength(8)] public string[] SupportedLanguages { get; init; } = supportedLanguages;
|
||||||
public string Name { get; init; } = name;
|
[StringLength(2048)] public string IconUrl { get; init; } = iconUrl;
|
||||||
[StringLength(8)]
|
[StringLength(256)] public string[] BaseUris { get; init; } = baseUris;
|
||||||
[Required]
|
|
||||||
public string[] SupportedLanguages { get; init; } = supportedLanguages;
|
|
||||||
[StringLength(2048)]
|
|
||||||
[Required]
|
|
||||||
public string IconUrl { get; init; } = iconUrl;
|
|
||||||
[StringLength(256)]
|
|
||||||
[Required]
|
|
||||||
public string[] BaseUris { get; init; } = baseUris;
|
|
||||||
[Required]
|
|
||||||
public bool Enabled { get; internal set; } = true;
|
public bool Enabled { get; internal set; } = true;
|
||||||
|
|
||||||
public abstract (Manga, MangaConnectorId<Manga>)[] SearchManga(string mangaSearchName);
|
public abstract (Manga, MangaConnectorId<Manga>)[] SearchManga(string mangaSearchName);
|
||||||
|
Reference in New Issue
Block a user