using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts.Services;
using EnvelopeGenerator.Application.EnvelopeHistories;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.GeneratorAPI.Controllers;
///
/// Dieser Controller stellt Endpunkte für die Verwaltung von Umschlägen bereit.
///
///
/// Die API ermöglicht das Abrufen und Verwalten von Umschlägen basierend auf Benutzerinformationen und Statusfiltern.
///
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class EnvelopeController : ControllerBase
{
private readonly ILogger _logger;
private readonly IEnvelopeService _envelopeService;
///
/// Erstellt eine neue Instanz des EnvelopeControllers.
///
/// Der Logger, der für das Protokollieren von Informationen verwendet wird.
/// Der Dienst, der für die Verarbeitung von Umschlägen zuständig ist.
public EnvelopeController(ILogger logger, IEnvelopeService envelopeService)
{
_logger = logger;
_envelopeService = envelopeService;
}
///
/// Ruft eine Liste von Umschlägen basierend auf dem Benutzer und den angegebenen Statusfiltern ab.
///
/// Die Statusfilter, die für die Abfrage verwendet werden sollen.
/// Eine IActionResult-Instanz, die die abgerufenen Umschläge oder einen Fehlerstatus enthält.
[Authorize]
[HttpGet]
public async Task GetAsync(
[FromQuery] StatusQuery status)
{
try
{
if (User.GetId() is int intId)
return await _envelopeService.ReadByUserAsync(intId, min_status: status.Min, max_status: status.Max, ignore_statuses: status.Ignore).ThenAsync(
Success: Ok,
Fail: IActionResult (msg, ntc) =>
{
_logger.LogNotice(ntc);
return StatusCode(StatusCodes.Status500InternalServerError);
});
else
{
_logger.LogError("Trotz erfolgreicher Autorisierung wurde die Benutzer-ID nicht als Ganzzahl erkannt. Dies könnte auf eine fehlerhafte Erstellung der Anspruchsliste zurückzuführen sein.");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}