Meme Generation API
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Kynareth/src/Controllers/ImageGenerationController.cs

130 lines
4.1 KiB

using System.Text.Json;
using Exsersewo.Common.Utilities;
using ImageMagick;
using Kynareth.Attributes;
using Kynareth.Helpers;
using Kynareth.Managers;
using Kynareth.Models;
using Microsoft.AspNetCore.Mvc;
namespace Kynareth.Controllers;
[Route("image/generate")]
public class ImageGenerationController : BaseController<ImageGenerationController>
{
private ImageGenerator _generator;
public ImageGenerationController(
ImageGenerator generator,
IConfiguration configuration,
ILoggerFactory loggerFactory,
IWebHostEnvironment environment
) : base(configuration, loggerFactory, environment)
{
_generator = generator;
}
[HttpGet]
[EndpointMetrics("image.generate.get.templates")]
[IgnoreToken]
[ProducesResponseType(typeof(IEnumerable<ImageGenerationEndpointRead>), StatusCodes.Status200OK)]
public Task<object> GetTemplates()
{
return Task.FromResult(HttpContext.Send(EventResult.FromSuccess(_generator.GetGenerationEndpoints())));
}
[HttpGet("{template}")]
[EndpointMetrics("image.generate.generate")]
[ProducesResponseType(typeof(Stream), StatusCodes.Status200OK, "image/png")]
[ProducesResponseType(typeof(Stream), StatusCodes.Status200OK, "image/gif")]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status500InternalServerError)]
public async Task<object> GetImageAsync(string template, [FromQuery(Name = "source")] string[] sources, [FromQuery] string variant = null)
{
try
{
var result = await _generator.GenerateImageAsync(template, variant, sources, Request.HttpContext.RequestAborted);
if (result is byte[] data)
{
var image = new MemoryStream(data);
return HttpContext.SendStream(image, "image/png");
}
return result as IResult;
}
catch (ArgumentException ex)
{
return HttpContext.Send(
EventResult.FromFailureException($"Can't parse result. Reason:\"{ex.Message}\"", ex),
System.Net.HttpStatusCode.InternalServerError
);
}
}
[HttpGet("{template}/random")]
[EndpointMetrics("image.generate.generate.random")]
[ProducesResponseType(typeof(Stream), StatusCodes.Status200OK, "image/png")]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status500InternalServerError)]
[IgnoreToken]
public async Task<object> GenerateMemeAsync(string template, [FromQuery] string variant = null)
{
try
{
if (!string.IsNullOrWhiteSpace(template))
{
var result = await _generator.GenerateImageAsync(template, variant, Request.HttpContext.RequestAborted);
if (result is byte[] data)
{
var image = new MemoryStream(data);
return HttpContext.SendStream(image, "image/png");
}
return result as IResult;
}
return HttpContext.Send(EventResult.FromFailure("No template has been provided"), System.Net.HttpStatusCode.BadRequest);
}
catch (ArgumentException ex)
{
_logger.LogCritical(ex.Message, ex);
return HttpContext.Send(EventResult.FromFailure("Can't parse result"), System.Net.HttpStatusCode.InternalServerError);
}
}
[HttpGet("random")]
[EndpointMetrics("image.generate.generate.random")]
[ProducesResponseType(typeof(Stream), StatusCodes.Status200OK, "image/png")]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(EventResult), StatusCodes.Status500InternalServerError)]
[IgnoreToken]
public async Task<object> GenerateMemeAsync()
{
try
{
var result = await _generator.GenerateImageAsync(Request.HttpContext.RequestAborted);
if (result is byte[] data)
{
var image = new MemoryStream(data);
return HttpContext.SendStream(image, "image/png");
}
return result as IResult;
}
catch (ArgumentException ex)
{
_logger.LogCritical(ex.Message, ex);
return HttpContext.Send(EventResult.FromFailure("Can't parse result"), System.Net.HttpStatusCode.InternalServerError);
}
}
}