From dedfb924d89857adb28d6e615bf85449534c8ba4 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 27 Jun 2025 10:59:52 +0200 Subject: [PATCH] Refactor EnvelopeController and EnvelopeOldService Significantly refactored `EnvelopeController.cs` to improve structure, add logging, and enhance error handling in methods. Introduced new private fields and updated constructor parameters, with some marked as obsolete. Updated `EnvelopeOldService.cs` to add private fields, improve logging, and enhance error handling in key methods. Introduced `ReceiverAlreadySigned` method and marked `GetDocument` as obsolete. Improved overall functionality and maintainability. --- .../Controllers/EnvelopeController.cs | 240 +++++++-------- .../Services/EnvelopeOldService.cs | 276 +++++++++--------- 2 files changed, 264 insertions(+), 252 deletions(-) diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index 16a37dc2..3d2870c6 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -1,153 +1,161 @@ -using DigitalData.Core.DTO; -using EnvelopeGenerator.CommonServices; +using EnvelopeGenerator.CommonServices; using EnvelopeGenerator.Web.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Text.Encodings.Web; -using static EnvelopeGenerator.CommonServices.Constants; using EnvelopeGenerator.Extensions; using EnvelopeGenerator.Application.Contracts.Services; +using static EnvelopeGenerator.Domain.Constants; +using EnvelopeGenerator.Domain.Entities; +using EnvelopeGenerator.Domain; +using DigitalData.Core.Abstraction.Application.DTO; -namespace EnvelopeGenerator.Web.Controllers +namespace EnvelopeGenerator.Web.Controllers; + +[Authorize(Roles = ReceiverRole.FullyAuth)] +[ApiController] +[Route("api/[controller]")] +public class EnvelopeController : BaseController { - [Authorize(Roles = ReceiverRole.FullyAuth)] - [ApiController] - [Route("api/[controller]")] - public class EnvelopeController : BaseController + private readonly EnvelopeOldService envelopeService; + private readonly ActionService? actionService; + private readonly UrlEncoder _urlEncoder; + [Obsolete("Use MediatR")] + private readonly IEnvelopeHistoryService _histService; + [Obsolete("Use MediatR")] + private readonly IReceiverService _receiverService; + [Obsolete("Use MediatR")] + private readonly IEnvelopeReceiverService _envRcvService; + + [Obsolete("Use MediatR")] + public EnvelopeController(DatabaseService database, + EnvelopeOldService envelope, + ILogger logger, UrlEncoder urlEncoder, + IEnvelopeHistoryService envelopeHistoryService, + IReceiverService receiverService, + IEnvelopeReceiverService envelopeReceiverService) : base(database, logger) { - private readonly EnvelopeOldService envelopeService; - private readonly ActionService? actionService; - private readonly UrlEncoder _urlEncoder; - private readonly IEnvelopeHistoryService _histService; - private readonly IReceiverService _receiverService; - private readonly IEnvelopeReceiverService _envRcvService; - - public EnvelopeController(DatabaseService database, - EnvelopeOldService envelope, - ILogger logger, UrlEncoder urlEncoder, - IEnvelopeHistoryService envelopeHistoryService, - IReceiverService receiverService, - IEnvelopeReceiverService envelopeReceiverService) : base(database, logger) - { - envelopeService = envelope; - actionService = database?.Services?.actionService; - _urlEncoder = urlEncoder; - _histService = envelopeHistoryService; - _receiverService = receiverService; - _envRcvService = envelopeReceiverService; - } + envelopeService = envelope; + actionService = database?.Services?.actionService; + _urlEncoder = urlEncoder; + _histService = envelopeHistoryService; + _receiverService = receiverService; + _envRcvService = envelopeReceiverService; + } - [NonAction] - public async Task Get([FromRoute] string envelopeKey) + [NonAction] + [Obsolete("Use MediatR")] + public async Task Get([FromRoute] string envelopeKey) + { + try { - try - { - envelopeKey = _urlEncoder.Encode(envelopeKey); - - // Validate Envelope Key and load envelope - envelopeService.EnsureValidEnvelopeKey(envelopeKey); - - EnvelopeReceiver response = await envelopeService.LoadEnvelope(envelopeKey); + envelopeKey = _urlEncoder.Encode(envelopeKey); - if (envelopeService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id) == true) - { - return Problem(statusCode: 403); - } + // Validate Envelope Key and load envelope + envelopeService.EnsureValidEnvelopeKey(envelopeKey); + + EnvelopeReceiver response = await envelopeService.LoadEnvelope(envelopeKey); - _logger.LogInformation("Loaded envelope [{0}] for receiver [{1}]", response.Envelope.Id, response.Envelope.Id); - return Json(response); - } - catch (Exception e) + if (envelopeService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id) == true) { - _logger.LogError(e, "{Message}", e.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } + return Problem(statusCode: 403); + } + + _logger.LogInformation("Loaded envelope [{0}] for receiver [{1}]", response.Envelope.Id, response.Envelope.Id); + return Json(response); + } + catch (Exception e) + { + _logger.LogError(e, "{Message}", e.Message); + return StatusCode(StatusCodes.Status500InternalServerError); } + } - [Authorize(Roles = ReceiverRole.FullyAuth)] - [HttpPost("{envelopeKey}")] - public async Task Update(string envelopeKey, int index) + [Authorize(Roles = ReceiverRole.FullyAuth)] + [HttpPost("{envelopeKey}")] + [Obsolete("Use MediatR")] + public async Task Update(string envelopeKey, int index) + { + try { - try - { - envelopeKey = _urlEncoder.Encode(envelopeKey); + envelopeKey = _urlEncoder.Encode(envelopeKey); - var authSignature = this.GetAuthReceiverSignature(); + var authSignature = this.GetAuthReceiverSignature(); - if (authSignature != envelopeKey.GetReceiverSignature()) - return Unauthorized(); + if (authSignature != envelopeKey.GetReceiverSignature()) + return Unauthorized(); - // Validate Envelope Key and load envelope - envelopeService.EnsureValidEnvelopeKey(envelopeKey); - EnvelopeReceiver response = await envelopeService.LoadEnvelope(envelopeKey); + // Validate Envelope Key and load envelope + envelopeService.EnsureValidEnvelopeKey(envelopeKey); + EnvelopeReceiver response = await envelopeService.LoadEnvelope(envelopeKey); - // Again check if receiver has already signed - if (envelopeService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id) == true) - { - return Problem(statusCode: 403); - } + // Again check if receiver has already signed + if (envelopeService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id) == true) + { + return Problem(statusCode: 403); + } - var document = envelopeService.GetDocument(index, envelopeKey); + var document = envelopeService.GetDocument(index, envelopeKey); - string? annotationData = await envelopeService.EnsureValidAnnotationData(Request); + string? annotationData = await envelopeService.EnsureValidAnnotationData(Request); - envelopeService.InsertDocumentStatus(new Common.DocumentStatus() - { - EnvelopeId = response.Envelope.Id, - ReceiverId = response.Receiver.Id, - Value = annotationData, - Status = Common.Constants.DocumentStatus.Signed - }); + envelopeService.InsertDocumentStatus(new Domain.Entities.DocumentStatus() + { + EnvelopeId = response.Envelope.Id, + ReceiverId = response.Receiver.Id, + Value = annotationData, + Status = Constants.DocumentStatus.Signed + }); - var signResult = actionService?.SignEnvelope(response.Envelope, response.Receiver); + var signResult = actionService?.SignEnvelope(response.Envelope, response.Receiver); - return Ok(new object()); - } - catch (Exception e) - { - _logger.LogError(e, "{Message}", e.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } + return Ok(new object()); + } + catch (Exception e) + { + _logger.LogError(e, "{Message}", e.Message); + return StatusCode(StatusCodes.Status500InternalServerError); } + } - [Authorize(Roles = ReceiverRole.FullyAuth)] - [HttpPost("reject")] - public async Task Reject([FromBody] string? reason = null) + [Authorize(Roles = ReceiverRole.FullyAuth)] + [HttpPost("reject")] + [Obsolete("Use DigitalData.Core.Exceptions and .Middleware")] + public async Task Reject([FromBody] string? reason = null) + { + try { - try + var signature = this.GetAuthReceiverSignature(); + var uuid = this.GetAuthEnvelopeUuid(); + var mail = this.GetAuthReceiverMail(); + if(uuid is null || signature is null || mail is null) { - var signature = this.GetAuthReceiverSignature(); - var uuid = this.GetAuthEnvelopeUuid(); - var mail = this.GetAuthReceiverMail(); - if(uuid is null || signature is null || mail is null) - { - _logger.LogEnvelopeError(uuid: uuid, signature: signature, - message: @$"Unauthorized POST request in api\envelope\reject. One of claims, Envelope, signature or mail ({mail}) is null."); - return Unauthorized(); - } + _logger.LogEnvelopeError(uuid: uuid, signature: signature, + message: @$"Unauthorized POST request in api\envelope\reject. One of claims, Envelope, signature or mail ({mail}) is null."); + return Unauthorized(); + } - var envRcvRes = await _envRcvService.ReadByUuidSignatureAsync(uuid: uuid, signature: signature); + var envRcvRes = await _envRcvService.ReadByUuidSignatureAsync(uuid: uuid, signature: signature); - if (envRcvRes.IsFailed) - { - _logger.LogNotice(envRcvRes.Notices); - return Unauthorized("you are not authirized"); - } - - return await _histService.RecordAsync(envRcvRes.Data.EnvelopeId, userReference: mail, EnvelopeStatus.DocumentRejected, comment: reason).ThenAsync( - Success: id => NoContent(), - Fail: IActionResult (mssg, ntc) => - { - _logger.LogEnvelopeError(uuid: uuid, signature: signature, message: "Unexpected error happend in api/envelope/reject"); - _logger.LogNotice(ntc); - return this.ViewInnerServiceError(); - }); - } - catch (Exception e) + if (envRcvRes.IsFailed) { - _logger.LogError(e, "{Message}", e.Message); - return StatusCode(StatusCodes.Status500InternalServerError); + _logger.LogNotice(envRcvRes.Notices); + return Unauthorized("you are not authirized"); } + + return await _histService.RecordAsync(envRcvRes.Data.EnvelopeId, userReference: mail, EnvelopeStatus.DocumentRejected, comment: reason).ThenAsync( + Success: id => NoContent(), + Fail: IActionResult (mssg, ntc) => + { + _logger.LogEnvelopeError(uuid: uuid, signature: signature, message: "Unexpected error happend in api/envelope/reject"); + _logger.LogNotice(ntc); + return this.ViewInnerServiceError(); + }); + } + catch (Exception e) + { + _logger.LogError(e, "{Message}", e.Message); + return StatusCode(StatusCodes.Status500InternalServerError); } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Services/EnvelopeOldService.cs b/EnvelopeGenerator.Web/Services/EnvelopeOldService.cs index 8a1cc26d..fbb35de6 100644 --- a/EnvelopeGenerator.Web/Services/EnvelopeOldService.cs +++ b/EnvelopeGenerator.Web/Services/EnvelopeOldService.cs @@ -1,186 +1,190 @@ using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.CommonServices; +using EnvelopeGenerator.Domain.Entities; using System.Text; -namespace EnvelopeGenerator.Web.Services +namespace EnvelopeGenerator.Web.Services; + +public class EnvelopeOldService { - public class EnvelopeOldService + private readonly ReceiverModel receiverModel; + private readonly EnvelopeModel envelopeModel; + private readonly HistoryModel historyModel; + + private readonly DocumentStatusModel documentStatusModel; + + [Obsolete("Use MediatR")] + private readonly IConfigService _configService; + private readonly ILogger _logger; + + [Obsolete("Use MediatR")] + public EnvelopeOldService(DatabaseService database, IConfigService configService, ILogger logger) { - private readonly ReceiverModel receiverModel; - private readonly EnvelopeModel envelopeModel; - private readonly HistoryModel historyModel; - - private readonly DocumentStatusModel documentStatusModel; + _logger = logger; - private readonly IConfigService _configService; - private readonly ILogger _logger; + if (database.Models is null) + throw new ArgumentNullException("Models not loaded."); - public EnvelopeOldService(DatabaseService database, IConfigService configService, ILogger logger) - { - _logger = logger; + receiverModel = database.Models.receiverModel; + envelopeModel = database.Models.envelopeModel; + historyModel = database.Models.historyModel; + documentStatusModel = database.Models.documentStatusModel; - if (database.Models is null) - throw new ArgumentNullException("Models not loaded."); + _configService = configService; + } - receiverModel = database.Models.receiverModel; - envelopeModel = database.Models.envelopeModel; - historyModel = database.Models.historyModel; - documentStatusModel = database.Models.documentStatusModel; + public void EnsureValidEnvelopeKey(string envelopeKey) + { + _logger.LogInformation("Parsing EnvelopeKey.."); - _configService = configService; - } + if (string.IsNullOrEmpty(envelopeKey)) + throw new ArgumentNullException("EnvelopeKey"); - public void EnsureValidEnvelopeKey(string envelopeKey) - { - _logger.LogInformation("Parsing EnvelopeKey.."); + Tuple result = Helpers.DecodeEnvelopeReceiverId(envelopeKey); + _logger.LogInformation("EnvelopeUUID: [{0}]", result.Item1); + _logger.LogInformation("ReceiverSignature: [{0}]", result.Item2); - if (string.IsNullOrEmpty(envelopeKey)) - throw new ArgumentNullException("EnvelopeKey"); + if (string.IsNullOrEmpty(result.Item1)) + throw new ArgumentNullException("EnvelopeUUID"); - Tuple result = Helpers.DecodeEnvelopeReceiverId(envelopeKey); - _logger.LogInformation("EnvelopeUUID: [{0}]", result.Item1); - _logger.LogInformation("ReceiverSignature: [{0}]", result.Item2); + if (string.IsNullOrEmpty(result.Item2)) + throw new ArgumentNullException("ReceiverSignature"); + } - if (string.IsNullOrEmpty(result.Item1)) - throw new ArgumentNullException("EnvelopeUUID"); + [Obsolete("Use MediatR")] + public async Task LoadEnvelope(string pEnvelopeKey) + { + _logger.LogInformation("Loading Envelope by Key [{0}]", pEnvelopeKey); - if (string.IsNullOrEmpty(result.Item2)) - throw new ArgumentNullException("ReceiverSignature"); - } + Tuple result = Helpers.DecodeEnvelopeReceiverId(pEnvelopeKey); + var envelopeUuid = result.Item1; + var receiverSignature = result.Item2; + var receiverId = receiverModel.GetReceiverIdBySignature(receiverSignature); - public async Task LoadEnvelope(string pEnvelopeKey) - { - _logger.LogInformation("Loading Envelope by Key [{0}]", pEnvelopeKey); + _logger.LogInformation("Resolved receiver signature to receiverId [{0}]", receiverId); - Tuple result = Helpers.DecodeEnvelopeReceiverId(pEnvelopeKey); - var envelopeUuid = result.Item1; - var receiverSignature = result.Item2; - var receiverId = receiverModel.GetReceiverIdBySignature(receiverSignature); + _logger.LogInformation("Loading envelope.."); + Envelope? envelope = envelopeModel.GetByUuid(envelopeUuid); - _logger.LogInformation("Resolved receiver signature to receiverId [{0}]", receiverId); + if (envelope == null) + { + _logger.LogWarning("Envelope not found"); + throw new NullReferenceException("Envelope not found"); + } - _logger.LogInformation("Loading envelope.."); - Envelope? envelope = envelopeModel.GetByUuid(envelopeUuid); + _logger.LogInformation("Envelope loaded"); - if (envelope == null) - { - _logger.LogWarning("Envelope not found"); - throw new NullReferenceException("Envelope not found"); - } + if (envelope.Receivers == null) + { + _logger.LogWarning("Receivers for envelope not loaded"); + throw new NullReferenceException("Receivers for envelope not loaded"); + } - _logger.LogInformation("Envelope loaded"); + _logger.LogInformation("Envelope receivers found: [{0}]", envelope.Receivers.Count); - if (envelope.Receivers == null) - { - _logger.LogWarning("Receivers for envelope not loaded"); - throw new NullReferenceException("Receivers for envelope not loaded"); - } + Receiver? receiver = envelope.Receivers.Where(r => r.Id == receiverId).SingleOrDefault(); - _logger.LogInformation("Envelope receivers found: [{0}]", envelope.Receivers.Count); + if (receiver == null) + { + _logger.LogWarning("Receiver [{0}] not found", receiverId); + throw new NullReferenceException("Receiver not found"); + } - Receiver? receiver = envelope.Receivers.Where(r => r.Id == receiverId).SingleOrDefault(); + _logger.LogInformation("Loading documents for receiver [{0}]", receiver.EmailAddress); - if (receiver == null) - { - _logger.LogWarning("Receiver [{0}] not found", receiverId); - throw new NullReferenceException("Receiver not found"); - } + // filter elements by receiver + envelope.Documents = envelope.Documents.Select((document) => + { + document.Elements = document.Elements.Where((e) => e.ReceiverId == receiverId).ToList(); + return document; + }).ToList(); - _logger.LogInformation("Loading documents for receiver [{0}]", receiver.EmailAddress); + //if documenet_path_dmz is existing in config, replace the path with it + var config = await _configService.ReadDefaultAsync(); - // filter elements by receiver - envelope.Documents = envelope.Documents.Select((document) => - { - document.Elements = document.Elements.Where((e) => e.ReceiverId == receiverId).ToList(); - return document; - }).ToList(); + return new() + { + Receiver = receiver, + Envelope = envelope + }; + } - //if documenet_path_dmz is existing in config, replace the path with it - var config = await _configService.ReadDefaultAsync(); + public List LoadEnvelopes() + { + var receivers = receiverModel.ListReceivers(); + List envelopes = new(); - return new() - { - Receiver = receiver, - Envelope = envelope - }; + foreach (var receiver in receivers) + { + var envs = (List)envelopeModel.List(receiver.Id); + envelopes.AddRange(envs); } - public List LoadEnvelopes() - { - var receivers = receiverModel.ListReceivers(); - List envelopes = new(); + return envelopes; + } - foreach (var receiver in receivers) - { - var envs = (List)envelopeModel.List(receiver.Id); - envelopes.AddRange(envs); - } + public List LoadEnvelopes(int pReceiverId) + { + return (List)envelopeModel.List(pReceiverId); + } - return envelopes; - } + public bool ReceiverAlreadySigned(Envelope envelope, int receiverId) + { + return historyModel.HasReceiverSigned(envelope.Id, receiverId); + } - public List LoadEnvelopes(int pReceiverId) + public async Task EnsureValidAnnotationData(HttpRequest request) + { + try { - return (List)envelopeModel.List(pReceiverId); - } + _logger.LogInformation("Parsing annotation data from request.."); - public bool ReceiverAlreadySigned(Envelope envelope, int receiverId) - { - return historyModel.HasReceiverSigned(envelope.Id, receiverId); - } + using MemoryStream ms = new(); + await request.BodyReader.CopyToAsync(ms); + var bytes = ms.ToArray(); + + _logger.LogInformation("Annotation data parsed, size: [{0}]", bytes.Length); - public async Task EnsureValidAnnotationData(HttpRequest request) + return Encoding.UTF8.GetString(bytes); + } + catch (Exception e) { - try - { - _logger.LogInformation("Parsing annotation data from request.."); - - using MemoryStream ms = new(); - await request.BodyReader.CopyToAsync(ms); - var bytes = ms.ToArray(); - - _logger.LogInformation("Annotation data parsed, size: [{0}]", bytes.Length); - - return Encoding.UTF8.GetString(bytes); - } - catch (Exception e) - { - _logger.LogError(e, "Inner Service Error"); - throw new ArgumentNullException("AnnotationData"); - } + _logger.LogError(e, "Inner Service Error"); + throw new ArgumentNullException("AnnotationData"); } + } - public async Task GetDocument(int documentId, string envelopeKey) - { - EnvelopeReceiver response = await LoadEnvelope(envelopeKey); + [Obsolete("Use MediatR")] + public async Task GetDocument(int documentId, string envelopeKey) + { + EnvelopeReceiver response = await LoadEnvelope(envelopeKey); - _logger.LogInformation("Loading document for Id [{0}]", documentId); - - var document = response.Envelope.Documents. - Where(d => d.Id == documentId). - FirstOrDefault(); + _logger.LogInformation("Loading document for Id [{0}]", documentId); + + var document = response.Envelope.Documents. + Where(d => d.Id == documentId). + FirstOrDefault(); - if (document == null) - throw new ArgumentException("DocumentId"); + if (document == null) + throw new ArgumentException("DocumentId"); - _logger.LogInformation("Document [{0}] loaded!", documentId); + _logger.LogInformation("Document [{0}] loaded!", documentId); - return document; - } + return document; + } - public bool InsertDocumentStatus(Common.DocumentStatus documentStatus) - { - _logger.LogInformation("Saving annotation data.."); - return documentStatusModel.InsertOrUpdate(documentStatus); - } + public bool InsertDocumentStatus(DocumentStatus documentStatus) + { + _logger.LogInformation("Saving annotation data.."); + return documentStatusModel.InsertOrUpdate(documentStatus); + } - public async Task GetDocumentContents(EnvelopeDocument document) - { - _logger.LogInformation("Loading file [{0}]", document.Filepath); - var bytes = await File.ReadAllBytesAsync(document.Filepath); - _logger.LogInformation("File loaded, size: [{0}]", bytes.Length); + public async Task GetDocumentContents(EnvelopeDocument document) + { + _logger.LogInformation("Loading file [{0}]", document.Filepath); + var bytes = await File.ReadAllBytesAsync(document.Filepath); + _logger.LogInformation("File loaded, size: [{0}]", bytes.Length); - return bytes; - } + return bytes; } } \ No newline at end of file