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;
///
/// Dieser Controller stellt Endpunkte für den Zugriff auf die Umschlaghistorie bereit.
///
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class HistoryController : ControllerBase
{
private readonly ILogger _logger;
private readonly IEnvelopeHistoryService _service;
///
/// Konstruktor für den HistoryController.
///
/// Der Logger, der für das Protokollieren von Informationen verwendet wird.
/// Der Dienst, der für die Verarbeitung der Umschlaghistorie verantwortlich ist.
public HistoryController(ILogger logger, IEnvelopeHistoryService service)
{
_logger = logger;
_service = service;
}
///
/// Gibt alle möglichen Verweise auf alle möglichen Status in einem Verlaufsdatensatz zurück. (z. B. DocumentSigned bezieht sich auf Receiver.)
/// Dies wird hinzugefügt, damit Client-Anwendungen sich selbst auf dem neuesten Stand halten können.
///
/// - 0 - Receiver:
/// Historische Datensätze, die sich auf den Status des Absenders beziehen. Sie haben Statuscodes, die mit 1* beginnen.
/// - 1 - Sender:
/// Historische Datensätze über den Status der Empfänger. Diese haben Statuscodes, die mit 2* beginnen.
/// - 2 - System:
/// Historische Datensätze, die sich auf den allgemeinen Zustand des Umschlags beziehen. Diese haben Statuscodes, die mit 3* beginnen.
/// - 3 - Unknown:
/// Ein unbekannter Datensatz weist auf einen möglichen Mangel oder eine Unstimmigkeit im Aktualisierungsprozess der Anwendung hin.
///
///
///
///
[HttpGet("related")]
[Authorize]
public IActionResult GetReferenceTypes()
{
// Enum zu Schlüssel-Wert-Paar
var referenceTypes = Enum.GetValues(typeof(ReferenceType))
.Cast()
.ToDictionary(rt =>
{
var key = rt.ToString();
var keyAsCamelCase = char.ToLower(key[0]) + key[1..];
return keyAsCamelCase;
}, rt => (int)rt);
return Ok(referenceTypes);
}
///
/// 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.
///
/// - 0: Invalid
/// - 1001: EnvelopeCreated
/// - 1002: EnvelopeSaved
/// - 1003: EnvelopeQueued
/// - 1004: EnvelopeSent (Nicht verwendet)
/// - 1005: EnvelopePartlySigned
/// - 1006: EnvelopeCompletelySigned
/// - 1007: EnvelopeReportCreated
/// - 1008: EnvelopeArchived
/// - 1009: EnvelopeDeleted
/// - 2001: AccessCodeRequested
/// - 2002: AccessCodeCorrect
/// - 2003: AccessCodeIncorrect
/// - 2004: DocumentOpened
/// - 2005: DocumentSigned
/// - 4001: DocumentForwarded
/// - 2006: SignatureConfirmed
/// - 2007: DocumentRejected
/// - 2008: EnvelopeShared
/// - 2009: EnvelopeViewed
/// - 3001: MessageInvitationSent (Wird von Trigger verwendet)
/// - 3002: MessageAccessCodeSent
/// - 3003: MessageConfirmationSent
/// - 3004: MessageDeletionSent
/// - 3005: MessageCompletionSent
///
///
///
/// Abfrageparameter, der angibt, auf welche Referenz sich der Status bezieht.
/// 0 - Sender: Historische Datensätze, die sich auf den Status des Absenders beziehen. Sie haben Statuscodes, die mit 1* beginnen.
/// 1 - Receiver: Historische Datensätze über den Status der Empfänger. Diese haben Statuscodes, 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.
///
/// Gibt die HTTP-Antwort zurück.
///
[HttpGet("status")]
[Authorize]
public IActionResult GetEnvelopeStatus([FromQuery] ReferenceType? related = null)
{
// Enum zu Schlüssel-Wert-Paar
var referenceTypes = Enum.GetValues(typeof(EnvelopeStatus))
.Cast()
.ToDictionary(rt =>
{
var key = rt.ToString();
var keyAsCamelCase = char.ToLower(key[0]) + key[1..];
return keyAsCamelCase;
}, rt => (int)rt);
return Ok(referenceTypes);
}
///
/// Ruft die gesamte Umschlaghistorie basierend auf den angegebenen Abfrageparametern ab.
///
/// Die Abfrageparameter, die die Filterkriterien für die Umschlaghistorie definieren.
/// Eine Liste von Historieneinträgen, die den angegebenen Kriterien entsprechen, oder nur der letzte Eintrag.
/// Die Anfrage war erfolgreich, und die Umschlaghistorie wird zurückgegeben.
/// Die Anfrage war ungültig oder unvollständig.
/// Der Benutzer ist nicht authentifiziert.
/// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen.
/// Ein unerwarteter Fehler ist aufgetreten.
[HttpGet]
[Authorize]
public async Task 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);
}
}