using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts.Services;
using EnvelopeGenerator.Application.Envelopes.Queries.Read;
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.
///
/// Mögliche Antworten:
/// - 200 OK: Die Anfrage war erfolgreich, und die angeforderten Daten werden zurückgegeben.
/// - 400 Bad Request: Die Anfrage war fehlerhaft oder unvollständig.
/// - 401 Unauthorized: Der Benutzer ist nicht authentifiziert.
/// - 403 Forbidden: Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen.
/// - 404 Not Found: Die angeforderte Ressource wurde nicht gefunden.
/// - 500 Internal Server Error: Ein unerwarteter Fehler ist aufgetreten.
///
[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.
///
///
/// Eine IActionResult-Instanz, die die abgerufenen Umschläge oder einen Fehlerstatus enthält.
/// Die Anfrage war erfolgreich, und die Umschläge werden zurückgegeben.
/// Die Anfrage war fehlerhaft oder unvollständig.
/// Der Benutzer ist nicht authentifiziert.
/// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen.
/// Ein unerwarteter Fehler ist aufgetreten.
[Authorize]
[HttpGet]
public async Task GetAsync([FromQuery] ReadEnvelopeQuery envelope)
{
try
{
if (User.GetId() is int intId)
return await _envelopeService.ReadByUserAsync(intId, min_status: envelope.Status, max_status: envelope.Status).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);
}
}
}