using EnvelopeGenerator.API.Extensions; using EnvelopeGenerator.Application.Envelopes.Commands; using EnvelopeGenerator.Application.Envelopes.Queries; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; namespace EnvelopeGenerator.API.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 IMediator _mediator; /// /// Erstellt eine neue Instanz des EnvelopeControllers. /// /// Der Logger, der für das Protokollieren von Informationen verwendet wird. /// public EnvelopeController(ILogger logger, IMediator mediator) { _logger = logger; _mediator = mediator; } /// /// 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) { var result = await _mediator.Send(envelope.Authorize(User.GetId())); return result.Any() ? Ok(result) : NotFound(); } /// /// Ruft das Ergebnis eines Dokuments basierend auf der ID ab. /// /// /// Gibt an, ob das Dokument inline angezeigt werden soll (true) oder als Download bereitgestellt wird (false). /// Eine IActionResult-Instanz, die das Dokument oder einen Fehlerstatus enthält. /// Das Dokument wurde erfolgreich abgerufen. /// Das Dokument wurde nicht gefunden oder ist nicht verfügbar. /// Ein unerwarteter Fehler ist aufgetreten. [HttpGet("doc-result")] public async Task GetDocResultAsync([FromQuery] ReadEnvelopeQuery query, [FromQuery] bool view = false) { var envelopes = await _mediator.Send(query.Authorize(User.GetId())); var envelope = envelopes.FirstOrDefault(); if (envelope is null) return NotFound("Envelope not available."); if (envelope.DocResult is null) return NotFound("The document has not been fully signed or the result has not yet been released."); if (view) { Response.Headers.Append("Content-Disposition", "inline; filename=\"" + envelope.Uuid + ".pdf\""); return File(envelope.DocResult, "application/pdf"); } return File(envelope.DocResult, "application/pdf", $"{envelope.Uuid}.pdf"); } /// /// /// /// /// [NonAction] [Authorize] [HttpPost] public async Task CreateAsync([FromBody] CreateEnvelopeCommand command) { var res = await _mediator.Send(command.Authorize(User.GetId())); if (res is null) { _logger.LogError("Failed to create envelope. Envelope details: {EnvelopeDetails}", JsonConvert.SerializeObject(command)); return StatusCode(StatusCodes.Status500InternalServerError); } else return Ok(res); } }