Developer 02 ded88383b3 refactor(HistoryController): Added new using directives for EmailProfiler and EF Core.
- Expanded XML documentation for GetEnvelopeStatus method,
clarifying the related parameter and its usage.
 - Updated
method signature to include [FromQuery] for better
parameter binding from the query string.
2025-04-11 22:51:40 +02:00

161 lines
8.0 KiB
C#

using DigitalData.EmailProfilerDispatcher.Abstraction.Entities;
using EnvelopeGenerator.Application.Contracts.Services;
using EnvelopeGenerator.Application.Histories.Queries.Read;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Drawing;
using System.Runtime.ConstrainedExecution;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.GeneratorAPI.Controllers;
/// <summary>
/// Dieser Controller stellt Endpunkte für den Zugriff auf die Umschlaghistorie bereit.
/// </summary>
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class HistoryController : ControllerBase
{
private readonly ILogger<HistoryController> _logger;
private readonly IEnvelopeHistoryService _service;
/// <summary>
/// Konstruktor für den HistoryController.
/// </summary>
/// <param name="logger">Der Logger, der für das Protokollieren von Informationen verwendet wird.</param>
/// <param name="service">Der Dienst, der für die Verarbeitung der Umschlaghistorie verantwortlich ist.</param>
public HistoryController(ILogger<HistoryController> logger, IEnvelopeHistoryService service)
{
_logger = logger;
_service = service;
}
/// <summary>
/// An der Versendung eines Umschlags können mehrere Beteiligte beteiligt sein, darunter der Absender, der Empfänger und das System selbst.
/// Der Prozess liefert alle relevanten Nenner, die mit der Schlüsselnummer verbunden sind, und ermöglicht es dem Client,
/// die Aktualität und Richtigkeit der Informationen zu überprüfen.
/// <list type="bullet">
/// <item><description><c>0</c>: Receiver</description></item>
/// <item><description><c>1</c>: Sender</description></item>
/// <item><description><c>2</c>: System</description></item>
/// <item><description><c>3</c>: Unknown
/// (Ein unbekannter Datensatz weist auf einen möglichen Mangel oder eine Unstimmigkeit im Aktualisierungsprozess der Anwendung hin.)</description></item>
/// </list>
/// </summary>
/// <returns></returns>
/// <response code="200"></response>
[HttpGet("related")]
[Authorize]
public IActionResult GetReferenceTypes()
{
// Enum zu Schlüssel-Wert-Paar
var referenceTypes = Enum.GetValues(typeof(ReferenceType))
.Cast<ReferenceType>()
.ToDictionary(rt =>
{
var key = rt.ToString();
var keyAsCamelCase = char.ToLower(key[0]) + key[1..];
return keyAsCamelCase;
}, rt => (int)rt);
return Ok(referenceTypes);
}
/// <summary>
/// Gibt alle möglichen Status in einem Verlaufsdatensatz zurück.
/// Dies wird hinzugefügt, damit Client-Anwendungen sich selbst auf dem neuesten Stand halten können.
/// <list type="bullet">
/// <item><description><c>0</c>: Invalid</description></item>
/// <item><description><c>1001</c>: EnvelopeCreated</description></item>
/// <item><description><c>1002</c>: EnvelopeSaved</description></item>
/// <item><description><c>1003</c>: EnvelopeQueued</description></item>
/// <item><description><c>1004</c>: EnvelopeSent (Nicht verwendet)</description></item>
/// <item><description><c>1005</c>: EnvelopePartlySigned</description></item>
/// <item><description><c>1006</c>: EnvelopeCompletelySigned</description></item>
/// <item><description><c>1007</c>: EnvelopeReportCreated</description></item>
/// <item><description><c>1008</c>: EnvelopeArchived</description></item>
/// <item><description><c>1009</c>: EnvelopeDeleted</description></item>
/// <item><description><c>2001</c>: AccessCodeRequested</description></item>
/// <item><description><c>2002</c>: AccessCodeCorrect</description></item>
/// <item><description><c>2003</c>: AccessCodeIncorrect</description></item>
/// <item><description><c>2004</c>: DocumentOpened</description></item>
/// <item><description><c>2005</c>: DocumentSigned</description></item>
/// <item><description><c>4001</c>: DocumentForwarded</description></item>
/// <item><description><c>2006</c>: SignatureConfirmed</description></item>
/// <item><description><c>2007</c>: DocumentRejected</description></item>
/// <item><description><c>2008</c>: EnvelopeShared</description></item>
/// <item><description><c>2009</c>: EnvelopeViewed</description></item>
/// <item><description><c>3001</c>: MessageInvitationSent (Wird von Trigger verwendet)</description></item>
/// <item><description><c>3002</c>: MessageAccessCodeSent</description></item>
/// <item><description><c>3003</c>: MessageConfirmationSent</description></item>
/// <item><description><c>3004</c>: MessageDeletionSent</description></item>
/// <item><description><c>3005</c>: MessageCompletionSent</description></item>
/// </list>
/// </summary>
/// <param name="related">
/// Abfrageparameter, der angibt, auf welche Referenz sich der Status bezieht.
/// 0 - Sender: Die Status des Senders werden von der Anwendung Envelope.Form aktualisiert und haben die Codes, die mit 1* beginnen.
/// 1 - Receiver: Die Status der Empfänger werden von der Anwendung Envelope.Web aktualisiert und haben die Codes, die mit 2* beginnen.
/// 2 - System: Diese werden durch Datenbank-Trigger aktualisiert und sind in den Tabellen EnvelopeHistory und EmailOut zu finden.Sie arbeiten
/// integriert mit der Anwendung EmailProfiler, um E-Mails zu versenden und haben die Codes, die mit 3* beginnen.
/// </param>
/// <returns>Gibt die HTTP-Antwort zurück.</returns>
/// <response code="200"></response>
[HttpGet("status")]
[Authorize]
public IActionResult GetEnvelopeStatus([FromQuery] ReferenceType? related = null)
{
// Enum zu Schlüssel-Wert-Paar
var referenceTypes = Enum.GetValues(typeof(EnvelopeStatus))
.Cast<EnvelopeStatus>()
.ToDictionary(rt =>
{
var key = rt.ToString();
var keyAsCamelCase = char.ToLower(key[0]) + key[1..];
return keyAsCamelCase;
}, rt => (int)rt);
return Ok(referenceTypes);
}
/// <summary>
/// Ruft die gesamte Umschlaghistorie basierend auf den angegebenen Abfrageparametern ab.
/// </summary>
/// <param name="history">Die Abfrageparameter, die die Filterkriterien für die Umschlaghistorie definieren.</param>
/// <returns>Eine Liste von Historieneinträgen, die den angegebenen Kriterien entsprechen, oder nur der letzte Eintrag.</returns>
/// <response code="200">Die Anfrage war erfolgreich, und die Umschlaghistorie wird zurückgegeben.</response>
/// <response code="400">Die Anfrage war ungültig oder unvollständig.</response>
/// <response code="401">Der Benutzer ist nicht authentifiziert.</response>
/// <response code="403">Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen.</response>
/// <response code="500">Ein unerwarteter Fehler ist aufgetreten.</response>
[HttpGet]
[Authorize]
public async Task<IActionResult> GetAllAsync([FromQuery] ReadHistoryQuery history)
{
bool withReceiver = false;
bool withSender = false;
switch (history.Related)
{
case ReferenceType.Receiver:
withReceiver = true;
break;
case ReferenceType.Sender:
withSender = true;
break;
}
var histories = await _service.ReadAsync(
envelopeId: history.EnvelopeId,
referenceType: history.Related,
withSender: withSender,
withReceiver: withReceiver);
return Ok(histories);
}
}