using Microsoft.AspNetCore.Mvc; using EnvelopeGenerator.Common; using EnvelopeGenerator.Web.Services; using EnvelopeGenerator.Application.Contracts; using Microsoft.AspNetCore.Authorization; using EnvelopeGenerator.Extensions; using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Web.Controllers { [Authorize(Roles = ReceiverRole.FullyAuth)] [Route("api/[controller]")] public class DocumentController : BaseController { private readonly EnvelopeOldService envelopeService; private readonly ActionService? actionService; private readonly IEnvelopeDocumentService _envDocService; public DocumentController(DatabaseService database, EnvelopeOldService envelope, IEnvelopeDocumentService envDocService, ILogger logger) : base(database, logger) { envelopeService = envelope; actionService = database.Services?.actionService; _envDocService = envDocService; } [NonAction] public async Task Get([FromRoute] string envelopeKey, [FromQuery] int index) { try { // Validate Envelope Key and load envelope envelopeService.EnsureValidEnvelopeKey(envelopeKey); EnvelopeResponse response = await envelopeService.LoadEnvelope(envelopeKey); // Load document info var document = await envelopeService.GetDocument(index, envelopeKey); // Load the document from disk var bytes = await envelopeService.GetDocumentContents(document); // Return the document as bytes return File(bytes, "application/octet-stream"); } catch(Exception ex) { _logger.LogError(ex, "{Message}", ex.Message); return StatusCode(StatusCodes.Status500InternalServerError); } } [Authorize(Roles = ReceiverRole.FullyAuth)] [HttpPost("{envelopeKey}")] public async Task Open(string envelopeKey) { try { var authSignature = this.GetAuthReceiverSignature(); if (authSignature != envelopeKey.GetReceiverSignature()) return Forbid(); // Validate Envelope Key and load envelope envelopeService.EnsureValidEnvelopeKey(envelopeKey); EnvelopeResponse response = await envelopeService.LoadEnvelope(envelopeKey); actionService?.OpenEnvelope(response.Envelope, response.Receiver); return Ok(new object()); } catch(Exception ex) { _logger.LogError(ex, "{Message}", ex.Message); return StatusCode(StatusCodes.Status500InternalServerError); } } } }