using API.MangaDownloadClients;
using Asp.Versioning;
using Microsoft.AspNetCore.Mvc;
using static Microsoft.AspNetCore.Http.StatusCodes;
// ReSharper disable InconsistentNaming
namespace API.Controllers;
[ApiVersion(2)]
[ApiController]
[Route("v{v:apiVersion}/[controller]")]
public class SettingsController() : Controller
{
///
/// Get all
///
///
[HttpGet]
[ProducesResponseType(Status200OK, "application/json")]
public IActionResult GetSettings()
{
return Ok(Tranga.Settings);
}
///
/// Get the current UserAgent used by Tranga
///
///
[HttpGet("UserAgent")]
[ProducesResponseType(Status200OK, "text/plain")]
public IActionResult GetUserAgent()
{
return Ok(Tranga.Settings.UserAgent);
}
///
/// Set a new UserAgent
///
///
[HttpPatch("UserAgent")]
[ProducesResponseType(Status200OK)]
public IActionResult SetUserAgent([FromBody]string userAgent)
{
//TODO Validate
Tranga.Settings.SetUserAgent(userAgent);
return Ok();
}
///
/// Reset the UserAgent to default
///
///
[HttpDelete("UserAgent")]
[ProducesResponseType(Status200OK)]
public IActionResult ResetUserAgent()
{
Tranga.Settings.SetUserAgent(TrangaSettings.DefaultUserAgent);
return Ok();
}
///
/// Get all Request-Limits
///
///
[HttpGet("RequestLimits")]
[ProducesResponseType>(Status200OK, "application/json")]
public IActionResult GetRequestLimits()
{
return Ok(Tranga.Settings.RequestLimits);
}
///
/// Update all Request-Limits to new values
///
/// NOT IMPLEMENTED
[HttpPatch("RequestLimits")]
[ProducesResponseType(Status501NotImplemented)]
public IActionResult SetRequestLimits()
{
return StatusCode(501);
}
///
/// Updates a Request-Limit value
///
/// Type of Request
/// New limit in Requests/Minute
///
/// Limit needs to be greater than 0
[HttpPatch("RequestLimits/{RequestType}")]
[ProducesResponseType(Status200OK)]
[ProducesResponseType(Status400BadRequest)]
public IActionResult SetRequestLimit(RequestType RequestType, [FromBody]int requestLimit)
{
if (requestLimit <= 0)
return BadRequest();
Tranga.Settings.SetRequestLimit(RequestType, requestLimit);
return Ok();
}
///
/// Reset Request-Limit
///
///
[HttpDelete("RequestLimits/{RequestType}")]
[ProducesResponseType(Status200OK)]
public IActionResult ResetRequestLimits(RequestType RequestType)
{
Tranga.Settings.SetRequestLimit(RequestType, TrangaSettings.DefaultRequestLimits[RequestType]);
return Ok();
}
///
/// Reset Request-Limit
///
///
[HttpDelete("RequestLimits")]
[ProducesResponseType(Status200OK)]
public IActionResult ResetRequestLimits()
{
Tranga.Settings.ResetRequestLimits();
return Ok();
}
///
/// Returns Level of Image-Compression for Images
///
/// JPEG ImageCompression-level as Integer
[HttpGet("ImageCompressionLevel")]
[ProducesResponseType(Status200OK, "text/plain")]
public IActionResult GetImageCompression()
{
return Ok(Tranga.Settings.ImageCompression);
}
///
/// Set the Image-Compression-Level for Images
///
/// 100 to disable, 0-99 for JPEG ImageCompression-Level
///
/// Level outside permitted range
[HttpPatch("ImageCompressionLevel/{level}")]
[ProducesResponseType(Status200OK)]
[ProducesResponseType(Status400BadRequest)]
public IActionResult SetImageCompression(int level)
{
if (level < 1 || level > 100)
return BadRequest();
Tranga.Settings.UpdateImageCompression(level);
return Ok();
}
///
/// Get state of Black/White-Image setting
///
/// True if enabled
[HttpGet("BWImages")]
[ProducesResponseType(Status200OK, "text/plain")]
public IActionResult GetBwImagesToggle()
{
return Ok(Tranga.Settings.BlackWhiteImages);
}
///
/// Enable/Disable conversion of Images to Black and White
///
/// true to enable
///
[HttpPatch("BWImages/{enabled}")]
[ProducesResponseType(Status200OK)]
public IActionResult SetBwImagesToggle(bool enabled)
{
Tranga.Settings.SetBlackWhiteImageEnabled(enabled);
return Ok();
}
///
/// Gets the Chapter Naming Scheme
///
///
/// Placeholders:
/// %M Obj Name
/// %V Volume
/// %C Chapter
/// %T Title
/// %A Author (first in list)
/// %I Chapter Internal ID
/// %i Obj Internal ID
/// %Y Year (Obj)
///
/// ?_(...) replace _ with a value from above:
/// Everything inside the braces will only be added if the value of %_ is not null
///
///
[HttpGet("ChapterNamingScheme")]
[ProducesResponseType(Status200OK, "text/plain")]
public IActionResult GetCustomNamingScheme()
{
return Ok(Tranga.Settings.ChapterNamingScheme);
}
///
/// Sets the Chapter Naming Scheme
///
///
/// Placeholders:
/// %M Obj Name
/// %V Volume
/// %C Chapter
/// %T Title
/// %A Author (first in list)
/// %Y Year (Obj)
///
/// ?_(...) replace _ with a value from above:
/// Everything inside the braces will only be added if the value of %_ is not null
///
///
[HttpPatch("ChapterNamingScheme")]
[ProducesResponseType(Status200OK)]
public IActionResult SetCustomNamingScheme([FromBody]string namingScheme)
{
//TODO Move old Chapters
Tranga.Settings.SetChapterNamingScheme(namingScheme);
return Ok();
}
///
/// Sets the FlareSolverr-URL
///
/// URL of FlareSolverr-Instance
///
[HttpPost("FlareSolverr/Url")]
[ProducesResponseType(Status200OK)]
public IActionResult SetFlareSolverrUrl([FromBody]string flareSolverrUrl)
{
Tranga.Settings.SetFlareSolverrUrl(flareSolverrUrl);
return Ok();
}
///
/// Resets the FlareSolverr-URL (HttpClient does not use FlareSolverr anymore)
///
///
[HttpDelete("FlareSolverr/Url")]
[ProducesResponseType(Status200OK)]
public IActionResult ClearFlareSolverrUrl()
{
Tranga.Settings.SetFlareSolverrUrl(string.Empty);
return Ok();
}
///
/// Test FlareSolverr
///
/// FlareSolverr is working!
/// FlareSolverr is not working
[HttpPost("FlareSolverr/Test")]
[ProducesResponseType(Status200OK)]
[ProducesResponseType(Status500InternalServerError)]
public IActionResult TestFlareSolverrReachable()
{
const string knownProtectedUrl = "https://prowlarr.servarr.com/v1/ping";
FlareSolverrDownloadClient client = new();
RequestResult result = client.MakeRequestInternal(knownProtectedUrl);
return (int)result.statusCode >= 200 && (int)result.statusCode < 300 ? Ok() : StatusCode(500, result.statusCode);
}
///
/// Returns the language in which Manga are downloaded
///
///
[HttpGet("DownloadLanguage")]
[ProducesResponseType(Status200OK, "text/plain")]
public IActionResult GetDownloadLanguage()
{
return Ok(Tranga.Settings.DownloadLanguage);
}
///
/// Sets the language in which Manga are downloaded
///
///
[HttpPatch("DownloadLanguage/{Language}")]
[ProducesResponseType(Status200OK)]
public IActionResult SetDownloadLanguage(string Language)
{
//TODO Validation
Tranga.Settings.SetDownloadLanguage(Language);
return Ok();
}
}