using DigitalData.Modules.Logging; using EnvelopeGenerator.Common; using EnvelopeGenerator.Web.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Web.Controllers { public class HistoryController : Controller { private DatabaseService database; private LoggingService logging; private Logger logger; private ApiService api; public HistoryController(DatabaseService database, LoggingService logging, ApiService api) { this.database = database; this.logging = logging; this.logger = logging.LogConfig.GetLoggerFor("HistoryController"); this.api = api; } [HttpPost] [Route("api/history/{envelopeKey}")] public IActionResult Create(HttpContext ctx, string envelopeKey) { try { api.EnsureValidEnvelopeKey(envelopeKey); EnvelopeResponse r = database.LoadEnvelope(envelopeKey); var receiver = r.Envelope.Receivers.Where(receiver => receiver.Id == r.ReceiverId).SingleOrDefault(); if (receiver == null) { return BadRequest(); } string actionTypeString = EnsureValidQueryField(ctx.Request, "actionType"); string actionDescription = EnsureValidQueryField(ctx.Request, "actionDescription"); if (!Enum.TryParse(actionTypeString, out var actionType)) { return BadRequest(); }; database.InsertHistoryEntry(new EnvelopeHistoryEntry() { ActionDescription = actionDescription, ActionDate = DateTime.Now, ActionType = actionType, EnvelopeId = r.Envelope.Id, UserReference = receiver.Email }); return Json(new { }); } catch (Exception e) { logger.Error(e); return Problem(statusCode: 500); } } private string EnsureValidQueryField(HttpRequest request, string fieldName) { if (request.Query.TryGetValue(fieldName, out StringValues documentIndexString)) { try { return documentIndexString.First(); } catch (Exception e) { throw new ArgumentNullException(fieldName, e); } } else { throw new ArgumentNullException(fieldName); } } } }