using EnvelopeGenerator.Application.Services; using EnvelopeGenerator.Common; using EnvelopeGenerator.Web.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Text.Encodings.Web; namespace EnvelopeGenerator.Web.Controllers { [Authorize] public class EnvelopeController : BaseController { private readonly EnvelopeOldService envelopeService; private readonly ActionService? actionService; private readonly UrlEncoder _urlEncoder; public EnvelopeController(DatabaseService database, EnvelopeOldService envelope, ILogger logger, UrlEncoder urlEncoder) : base(database, logger) { envelopeService = envelope; actionService = database?.Services?.actionService; _urlEncoder = urlEncoder; } [NonAction] public async Task Get([FromRoute] string envelopeKey) { try { envelopeKey = _urlEncoder.Encode(envelopeKey); // Validate Envelope Key and load envelope envelopeService.EnsureValidEnvelopeKey(envelopeKey); EnvelopeResponse response = await envelopeService.LoadEnvelope(envelopeKey); if (envelopeService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id) == true) { 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] [HttpPost("api/envelope/{envelopeKey}")] public async Task Update(string envelopeKey, int index) { try { envelopeKey = _urlEncoder.Encode(envelopeKey); var authSignature = this.GetAuthenticatedReceiverSignature(); if (authSignature != envelopeKey.GetReceiverSignature()) return Forbid(); // Validate Envelope Key and load envelope envelopeService.EnsureValidEnvelopeKey(envelopeKey); EnvelopeResponse 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); } var document = envelopeService.GetDocument(index, envelopeKey); string? annotationData = await envelopeService.EnsureValidAnnotationData(Request); envelopeService.InsertDocumentStatus(new DocumentStatus() { EnvelopeId = response.Envelope.Id, ReceiverId = response.Receiver.Id, Value = annotationData, Status = Common.Constants.DocumentStatus.Signed }); 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); } } } }