From bbfbe3a7b40b36c8e632e531fb79a6cbdb6d49cd Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 6 Nov 2023 10:46:02 +0100 Subject: [PATCH] clean up server --- .../Controllers/BaseController.cs | 30 +++ .../Controllers/DocumentController.cs | 87 ++------ .../Controllers/EnvelopeController.cs | 61 ++---- .../EnvelopeGenerator.Web.csproj | 1 - EnvelopeGenerator.Web/Pages/Index.razor | 4 +- EnvelopeGenerator.Web/Program.cs | 6 +- EnvelopeGenerator.Web/Services/ApiService.cs | 131 ------------ EnvelopeGenerator.Web/Services/BaseService.cs | 18 ++ .../Services/DatabaseService.cs | 113 +++-------- .../Services/EnvelopeService.cs | 192 ++++++++++++++++++ 10 files changed, 315 insertions(+), 328 deletions(-) create mode 100644 EnvelopeGenerator.Web/Controllers/BaseController.cs delete mode 100644 EnvelopeGenerator.Web/Services/ApiService.cs create mode 100644 EnvelopeGenerator.Web/Services/BaseService.cs create mode 100644 EnvelopeGenerator.Web/Services/EnvelopeService.cs diff --git a/EnvelopeGenerator.Web/Controllers/BaseController.cs b/EnvelopeGenerator.Web/Controllers/BaseController.cs new file mode 100644 index 00000000..168e2607 --- /dev/null +++ b/EnvelopeGenerator.Web/Controllers/BaseController.cs @@ -0,0 +1,30 @@ +using DigitalData.Modules.Logging; +using EnvelopeGenerator.Web.Services; +using Microsoft.AspNetCore.Mvc; +using static EnvelopeGenerator.Web.Constants; + +namespace EnvelopeGenerator.Web.Controllers +{ + public class BaseController : Controller + { + internal DatabaseService database; + internal LogConfig logConfig; + internal Logger logger; + + public BaseController(DatabaseService database, LoggingService logging) + { + this.database = database; + this.logConfig = logging.LogConfig; + this.logger = logging.LogConfig.GetLoggerFor(GetType().Name); + } + + internal ObjectResult ErrorResponse(Exception e) + { + logger.Error(e); + return Problem( + statusCode: 500, + detail: e.Message, + type: ErrorType.ServerError.ToString()); + } + } +} diff --git a/EnvelopeGenerator.Web/Controllers/DocumentController.cs b/EnvelopeGenerator.Web/Controllers/DocumentController.cs index a1f7edd9..0f12bd35 100644 --- a/EnvelopeGenerator.Web/Controllers/DocumentController.cs +++ b/EnvelopeGenerator.Web/Controllers/DocumentController.cs @@ -1,25 +1,16 @@ using Microsoft.AspNetCore.Mvc; -using DigitalData.Modules.Logging; using EnvelopeGenerator.Common; using EnvelopeGenerator.Web.Services; -using static EnvelopeGenerator.Common.Constants; -using static EnvelopeGenerator.Web.Constants; namespace EnvelopeGenerator.Web.Controllers { - public class DocumentController : Controller + public class DocumentController : BaseController { - private readonly DatabaseService database; - private readonly LoggingService logging; - private readonly Logger logger; - private readonly ApiService api; + private readonly EnvelopeService envelopeService; - public DocumentController(DatabaseService database, LoggingService logging, ApiService api) + public DocumentController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging) { - this.database = database; - this.logging = logging; - this.logger = logging.LogConfig.GetLoggerFor(GetType().Name); - this.api = api; + envelopeService = envelope; } [HttpGet] @@ -28,40 +19,25 @@ namespace EnvelopeGenerator.Web.Controllers { try { - logger.Info("Handling file download."); + logger.Info("DocumentController/Get"); - // Validate Envelope Key - EnvelopeResponse r = api.EnsureValidEnvelopeKey(envelopeKey); + // Validate Envelope Key and load envelope + envelopeService.EnsureValidEnvelopeKey(envelopeKey); + EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey); // Load document info var Request = ControllerContext.HttpContext.Request; - var document = api.GetDocument(Request, envelopeKey); + var document = envelopeService.GetDocument(Request, envelopeKey); // Load the document from disk - var bytes = await System.IO.File.ReadAllBytesAsync(document.Filepath); - logger.Info("Serving file, size: [{0}]", bytes.Length); + var bytes = await envelopeService.GetDocumentContents(document); // Return the document as bytes return File(bytes, "application/octet-stream"); } - catch (IOException e) - { - logger.Error(e); - return Problem( - statusCode: 500, - detail: e.Message, - type: ErrorType.ServerError.ToString()); - - } catch (Exception e) { - // Better error handling & reporting - logger.Error(e); - return Problem( - statusCode: 500, - detail: e.Message, - type: ErrorType.ServerError.ToString()); - + return ErrorResponse(e); } } @@ -71,50 +47,27 @@ namespace EnvelopeGenerator.Web.Controllers { try { - logger.Info("Handling file update."); + logger.Info("DocumentController/Update"); - // Validate Envelope Key - EnvelopeResponse r = api.EnsureValidEnvelopeKey(envelopeKey); + // Validate Envelope Key and load envelope + envelopeService.EnsureValidEnvelopeKey(envelopeKey); + EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey); // Load Document info var Request = ControllerContext.HttpContext.Request; - var document = api.GetDocument(Request, envelopeKey); + var document = envelopeService.GetDocument(Request, envelopeKey); - // Try to update the document with new data - if (!await api.UpdateDocument(Request.Body, document.Filepath)) - { - throw new IOException("Document could not be saved to disk!"); - } + // Update the document with new data + await envelopeService.UpdateDocument(Request.Body, document.Filepath); // Add history entry - database.InsertHistoryEntry(new EnvelopeHistoryEntry() - { - ActionDescription = "Dokument wurde signiert", - ActionDate = DateTime.Now, - ActionType = EnvelopeHistoryActionType.Signed, - EnvelopeId = r.Envelope.Id, - UserReference = r.Receiver.Email - }); + envelopeService.InsertHistoryEntrySigned(response); return Ok(); } - catch (IOException e) - { - logger.Error(e); - return Problem( - statusCode: 500, - detail: e.Message, - type: ErrorType.ServerError.ToString()); - - } catch (Exception e) { - // Better error handling & reporting - logger.Error(e); - return Problem( - statusCode: 500, - detail: e.Message, - type: ErrorType.ServerError.ToString()); + return ErrorResponse(e); } } } diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index af019231..4c0f8fc4 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -2,24 +2,17 @@ using EnvelopeGenerator.Common; using EnvelopeGenerator.Web.Services; using Microsoft.AspNetCore.Mvc; -using NLog; using static EnvelopeGenerator.Web.Constants; namespace EnvelopeGenerator.Web.Controllers { - public class EnvelopeController : Controller + public class EnvelopeController : BaseController { - private readonly DatabaseService database; - private readonly LoggingService logging; - private readonly Logger logger; - private readonly ApiService api; + private readonly EnvelopeService envelopeService; - public EnvelopeController(DatabaseService database, LoggingService logging, ApiService api) + public EnvelopeController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging) { - this.database = database; - this.logging = logging; - this.logger = logging.LogConfig.GetLoggerFor(GetType().Name); - this.api = api; + envelopeService = envelope; } [HttpGet] @@ -28,23 +21,17 @@ namespace EnvelopeGenerator.Web.Controllers { try { - logger.Info("Handling envelope loading."); + logger.Info("EnvelopeController/Get"); - EnvelopeResponse r = api.EnsureValidEnvelopeKey(envelopeKey); - - // Return the envelope and additional data as json - return Json(r); + // Validate Envelope Key and load envelope + envelopeService.EnsureValidEnvelopeKey(envelopeKey); + EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey); + return Json(response); } catch (Exception e) { - // Better error handling & reporting - logger.Error(e); - return Problem( - statusCode: 500, - detail: e.Message, - type: ErrorType.ServerError.ToString()); - + return ErrorResponse(e); } } @@ -54,24 +41,21 @@ namespace EnvelopeGenerator.Web.Controllers { try { - logger.Info("Handling envelope saving."); + logger.Info("EnvelopeController/Update"); - EnvelopeResponse r = api.EnsureValidEnvelopeKey(envelopeKey); + // Validate Envelope Key and load envelope + envelopeService.EnsureValidEnvelopeKey(envelopeKey); + EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey); var Request = ControllerContext.HttpContext.Request; - var document = api.GetDocument(Request, envelopeKey); + var document = envelopeService.GetDocument(Request, envelopeKey); - string? annotationData = await api.EnsureValidAnnotationData(Request); - - if (annotationData == null) - { - throw new ArgumentNullException("AnnotationData"); - } + string annotationData = await envelopeService.EnsureValidAnnotationData(Request); - database.InsertDocumentStatus(new DocumentStatus() + envelopeService.InsertDocumentStatus(new DocumentStatus() { - EnvelopeId = r.Envelope.Id, - ReceiverId = r.Receiver.Id, + EnvelopeId = response.Envelope.Id, + ReceiverId = response.Receiver.Id, Value = annotationData, Status = Common.Constants.DocumentStatus.Signed }); @@ -80,12 +64,7 @@ namespace EnvelopeGenerator.Web.Controllers } catch (Exception e) { - // Better error handling & reporting - logger.Error(e); - return Problem( - statusCode: 500, - detail: e.Message, - type: ErrorType.ServerError.ToString()); + return ErrorResponse(e); } } } diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index cf989e2f..11fa5acc 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -41,7 +41,6 @@ - diff --git a/EnvelopeGenerator.Web/Pages/Index.razor b/EnvelopeGenerator.Web/Pages/Index.razor index 8eba6f50..e741f653 100644 --- a/EnvelopeGenerator.Web/Pages/Index.razor +++ b/EnvelopeGenerator.Web/Pages/Index.razor @@ -1,7 +1,7 @@ @page "/" @using EnvelopeGenerator.Common; @using EnvelopeGenerator.Web.Services; -@inject DatabaseService Database; +@inject EnvelopeService Envelope; Index @@ -32,7 +32,7 @@ protected override void OnInitialized() { // Test - envelopes = Database.LoadEnvelopes(receiverId); + envelopes = Envelope.LoadEnvelopes(receiverId); } diff --git a/EnvelopeGenerator.Web/Program.cs b/EnvelopeGenerator.Web/Program.cs index 6c3f8307..e2e1f206 100644 --- a/EnvelopeGenerator.Web/Program.cs +++ b/EnvelopeGenerator.Web/Program.cs @@ -6,11 +6,13 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); -// Add custom services +// Add base services builder.Services.AddSingleton(); -builder.Services.AddSingleton(); builder.Services.AddTransient(); +// Add higher order services +builder.Services.AddSingleton(); + builder.Services.AddControllers(); builder.Services.AddLocalization(); diff --git a/EnvelopeGenerator.Web/Services/ApiService.cs b/EnvelopeGenerator.Web/Services/ApiService.cs deleted file mode 100644 index d427a7f0..00000000 --- a/EnvelopeGenerator.Web/Services/ApiService.cs +++ /dev/null @@ -1,131 +0,0 @@ -using DigitalData.Modules.Database; -using DigitalData.Modules.Logging; -using EnvelopeGenerator.Common; -using Microsoft.Extensions.Primitives; -using System.Reflection; -using System.Reflection.Metadata; -using System.Text; - -namespace EnvelopeGenerator.Web.Services -{ - public class ApiService - { - private readonly DatabaseService database; - private readonly LogConfig logConfig; - private readonly Logger logger; - - public ApiService(LoggingService Logging, DatabaseService database, IConfiguration Config) - { - this.database = database; - this.logConfig = Logging.LogConfig; - this.logger = Logging.LogConfig.GetLogger(); - - logger.Debug("Initializing ApiService"); - } - - public EnvelopeResponse EnsureValidEnvelopeKey(string envelopeKey) - { - logger.Debug("Parsing EnvelopeKey.."); - - if (string.IsNullOrEmpty(envelopeKey)) - throw new ArgumentNullException("EnvelopeKey"); - - Tuple result = Helpers.DecodeEnvelopeReceiverId(envelopeKey); - logger.Debug("EnvelopeUUID: [{0}]", result.Item1); - logger.Debug("ReceiverSignature: [{0}]", result.Item2); - - if (string.IsNullOrEmpty(result.Item1)) - throw new ArgumentNullException("EnvelopeUUID"); - - if (string.IsNullOrEmpty(result.Item2)) - throw new ArgumentNullException("ReceiverSignature"); - - EnvelopeResponse response = database.LoadEnvelope(envelopeKey); - - return response; - } - - public async Task EnsureValidAnnotationData(HttpRequest request) - { - logger.Debug("Parsing AnnotationData.."); - - try - { - using MemoryStream ms = new(); - await request.BodyReader.CopyToAsync(ms); - var bytes = ms.ToArray(); - - return Encoding.UTF8.GetString(bytes); - } - catch (Exception e) - { - logger.Error(e); - return null; - } - - } - - public int EnsureValidDocumentIndex(HttpRequest request) - { - if (request.Query.TryGetValue("index", out StringValues documentIndexString)) - { - try - { - return int.Parse(documentIndexString.First()); - } - catch (Exception e) - { - throw new ArgumentNullException("DocumentIndex", e); - } - } - else - { - throw new ArgumentNullException("DocumentIndex"); - } - } - - - - public EnvelopeDocument GetDocument(HttpRequest request, string envelopeKey) - { - EnvelopeResponse r = database.LoadEnvelope(envelopeKey); - int documentId = EnsureValidDocumentIndex(request); - - var document = r.Envelope.Documents. - Where(d => d.Id == documentId). - FirstOrDefault(); - - if (document == null) - throw new ArgumentException("DocumentId"); - - return document; - } - - public async Task UpdateDocument(Stream fileStream, string filePath) - { - try - { - using FileStream fs = new(filePath, FileMode.Open); - await fileStream.CopyToAsync(fs); - fs.Flush(); - - return true; - } - catch (Exception ex) - { - logger.Error(ex); - return false; - } - } - - - public State GetState(LogConfig LogConfig, MSSQLServer Database) - { - return new State - { - LogConfig = LogConfig, - Database = Database, - }; - } - } -} diff --git a/EnvelopeGenerator.Web/Services/BaseService.cs b/EnvelopeGenerator.Web/Services/BaseService.cs new file mode 100644 index 00000000..0f4bb450 --- /dev/null +++ b/EnvelopeGenerator.Web/Services/BaseService.cs @@ -0,0 +1,18 @@ +using DigitalData.Modules.Logging; + +namespace EnvelopeGenerator.Web.Services +{ + public class BaseService + { + internal readonly LogConfig logConfig; + internal readonly IConfiguration config; + internal Logger logger; + + public BaseService(IConfiguration Config, LoggingService Logging) + { + logConfig = Logging.LogConfig; + logger = Logging.LogConfig.GetLogger(); + config = Config; + } + } +} diff --git a/EnvelopeGenerator.Web/Services/DatabaseService.cs b/EnvelopeGenerator.Web/Services/DatabaseService.cs index 2cd1707f..2428d3e0 100644 --- a/EnvelopeGenerator.Web/Services/DatabaseService.cs +++ b/EnvelopeGenerator.Web/Services/DatabaseService.cs @@ -1,116 +1,61 @@ using DigitalData.Modules.Database; -using DigitalData.Modules.Logging; using EnvelopeGenerator.Common; namespace EnvelopeGenerator.Web.Services { - public class DatabaseService + public class DatabaseService: BaseService { public MSSQLServer MSSQL { get; set; } - private EnvelopeModel envelopeModel; - private DocumentModel documentModel; - private ReceiverModel receiverModel; - private ElementModel elementModel; - private HistoryModel historyModel; - private DocumentStatusModel documentStatusModel; - private readonly LogConfig _logConfig; - private readonly Logger _logger; + public class ModelContainer + { + public EnvelopeModel envelopeModel; + public DocumentModel documentModel; + public ReceiverModel receiverModel; + public ElementModel elementModel; + public HistoryModel historyModel; + public DocumentStatusModel documentStatusModel; + public ModelContainer(State state) + { + envelopeModel = new(state); + documentModel = new(state); + receiverModel = new(state); + elementModel = new(state); + historyModel = new(state); + documentStatusModel = new(state); + } + } + public readonly ModelContainer? Models; - public DatabaseService(LoggingService Logging, IConfiguration Config) + public DatabaseService(IConfiguration Config, LoggingService Logging, DatabaseService database) : base(Config, Logging) { - _logConfig = Logging.LogConfig; - _logger = Logging.LogConfig.GetLogger(); + logger = Logging.LogConfig.GetLogger(); - _logger.Debug("Establishing MSSQL Database connection.."); - MSSQL = new MSSQLServer(_logConfig, Config["Config:ConnectionString"]); + logger.Debug("Establishing MSSQL Database connection.."); + MSSQL = new MSSQLServer(logConfig, Config["Config:ConnectionString"]); if (MSSQL.DBInitialized == true) { - _logger.Debug("MSSQL Connection: [{0}]", MSSQL.CurrentConnectionString); + logger.Debug("MSSQL Connection: [{0}]", MSSQL.CurrentConnectionString); var state = GetState(); - InitializeModels(state); + Models = new(state); } else { - _logger.Warn("Connection could not be established!"); + logger.Error("Connection could not be established!"); } } - public State GetState() + private State GetState() { return new State { Database = MSSQL, - LogConfig = _logConfig, + LogConfig = logConfig, UserId = 2 // TODO }; } - - public void InitializeModels(State state) - { - envelopeModel = new(state); - documentModel = new(state); - receiverModel = new(state); - elementModel = new(state); - historyModel = new(state); - documentStatusModel = new(state); - } - - public EnvelopeResponse LoadEnvelope(string pEnvelopeKey) - { - Tuple result = Helpers.DecodeEnvelopeReceiverId(pEnvelopeKey); - var envelopeUuid = result.Item1; - var receiverSignature = result.Item2; - var receiverId = receiverModel.GetReceiverIdBySignature(receiverSignature); - - Envelope? envelope = envelopeModel.GetByUuid(envelopeUuid); - - if (envelope == null) - { - throw new NullReferenceException("Envelope not found"); - } - - if (envelope.Receivers == null) - { - throw new NullReferenceException("Receivers for envelope not loaded"); - } - - EnvelopeReceiver? receiver = envelope.Receivers.Where(r => r.Id == receiverId).SingleOrDefault(); - - if (receiver == null) - { - throw new NullReferenceException("Receiver not found"); - } - - return new() - { - Receiver = receiver, - Envelope = envelope - }; - } - - public List LoadEnvelopes(int pReceiverId) - { - return (List)envelopeModel.List(pReceiverId); - } - - public EnvelopeDocument LoadDocument(int pDocumentId) - { - return documentModel.GetById(pDocumentId); - } - - public bool InsertHistoryEntry(EnvelopeHistoryEntry historyEntry) - { - return historyModel.Insert(historyEntry); - } - - public bool InsertDocumentStatus(DocumentStatus documentStatus) - { - return documentStatusModel.InsertOrUpdate(documentStatus); - } - } } diff --git a/EnvelopeGenerator.Web/Services/EnvelopeService.cs b/EnvelopeGenerator.Web/Services/EnvelopeService.cs new file mode 100644 index 00000000..f194c8e3 --- /dev/null +++ b/EnvelopeGenerator.Web/Services/EnvelopeService.cs @@ -0,0 +1,192 @@ +using EnvelopeGenerator.Common; +using Microsoft.Extensions.Primitives; +using System.Reflection.Metadata; +using System.Text; +using static EnvelopeGenerator.Common.Constants; + +namespace EnvelopeGenerator.Web.Services +{ + public class EnvelopeService : BaseService + { + private ReceiverModel receiverModel; + private EnvelopeModel envelopeModel; + private HistoryModel historyModel; + private DocumentModel documentModel; + private DocumentStatusModel documentStatusModel; + + public EnvelopeService(IConfiguration Config, LoggingService Logging, DatabaseService database) : base(Config, Logging) + { + logger = Logging.LogConfig.GetLogger(); + + if (database.Models == null) + { + throw new ArgumentNullException("Models not loaded."); + } + + receiverModel = database.Models.receiverModel; + envelopeModel = database.Models.envelopeModel; + historyModel = database.Models.historyModel; + documentModel = database.Models.documentModel; + documentStatusModel = database.Models.documentStatusModel; + } + + public void EnsureValidEnvelopeKey(string envelopeKey) + { + logger.Debug("Parsing EnvelopeKey.."); + + if (string.IsNullOrEmpty(envelopeKey)) + throw new ArgumentNullException("EnvelopeKey"); + + Tuple result = Helpers.DecodeEnvelopeReceiverId(envelopeKey); + logger.Debug("EnvelopeUUID: [{0}]", result.Item1); + logger.Debug("ReceiverSignature: [{0}]", result.Item2); + + if (string.IsNullOrEmpty(result.Item1)) + throw new ArgumentNullException("EnvelopeUUID"); + + if (string.IsNullOrEmpty(result.Item2)) + throw new ArgumentNullException("ReceiverSignature"); + } + + + public EnvelopeResponse LoadEnvelope(string pEnvelopeKey) + { + Tuple result = Helpers.DecodeEnvelopeReceiverId(pEnvelopeKey); + var envelopeUuid = result.Item1; + var receiverSignature = result.Item2; + var receiverId = receiverModel.GetReceiverIdBySignature(receiverSignature); + + Envelope? envelope = envelopeModel.GetByUuid(envelopeUuid); + + if (envelope == null) + { + throw new NullReferenceException("Envelope not found"); + } + + if (envelope.Receivers == null) + { + throw new NullReferenceException("Receivers for envelope not loaded"); + } + + EnvelopeReceiver? receiver = envelope.Receivers.Where(r => r.Id == receiverId).SingleOrDefault(); + + if (receiver == null) + { + throw new NullReferenceException("Receiver not found"); + } + + return new() + { + Receiver = receiver, + Envelope = envelope + }; + } + + public List LoadEnvelopes(int pReceiverId) + { + return (List)envelopeModel.List(pReceiverId); + } + + public bool InsertHistoryEntry(EnvelopeHistoryEntry historyEntry) + { + return historyModel.Insert(historyEntry); + } + + public bool InsertHistoryEntrySigned(EnvelopeResponse response) + { + return historyModel.Insert(new EnvelopeHistoryEntry() + { + ActionDescription = "Dokument wurde signiert", + ActionDate = DateTime.Now, + ActionType = EnvelopeHistoryActionType.Signed, + EnvelopeId = response.Envelope.Id, + UserReference = response.Receiver.Email + }); + } + + public bool InsertDocumentStatus(Common.DocumentStatus documentStatus) + { + return documentStatusModel.InsertOrUpdate(documentStatus); + } + + public async Task EnsureValidAnnotationData(HttpRequest request) + { + try + { + logger.Debug("Parsing annotation data from request.."); + + using MemoryStream ms = new(); + await request.BodyReader.CopyToAsync(ms); + var bytes = ms.ToArray(); + + return Encoding.UTF8.GetString(bytes); + } + catch (Exception e) + { + logger.Error(e); + throw new ArgumentNullException("AnnotationData"); + } + } + + public int EnsureValidDocumentIndex(HttpRequest request) + { + if (!request.Query.TryGetValue("index", out StringValues documentIndexStringList)) + { + logger.Warn("There is no query parameter called index"); + throw new ArgumentNullException("DocumentIndex"); + } + + if (documentIndexStringList.FirstOrDefault() == null) + { + logger.Warn("There is no query parameter called index"); + throw new ArgumentNullException("DocumentIndex"); + } + + if (!int.TryParse(documentIndexStringList.First(), out int documentIndex)) + { + logger.Warn("Invalid document index [{0}]", documentIndexStringList.First()); + throw new ArgumentNullException("DocumentIndex"); + } + + return documentIndex; + } + + public EnvelopeDocument GetDocument(HttpRequest request, string envelopeKey) + { + EnvelopeResponse response = LoadEnvelope(envelopeKey); + int documentId = EnsureValidDocumentIndex(request); + + logger.Debug("Loading document for Id [{0}]", documentId); + + var document = response.Envelope.Documents. + Where(d => d.Id == documentId). + FirstOrDefault(); + + if (document == null) + throw new ArgumentException("DocumentId"); + + logger.Debug("Document [{0}] loaded!", documentId); + + return document; + } + + public async Task UpdateDocument(Stream fileStream, string filePath) + { + logger.Debug("Writing document to path [{0}]..", filePath); + + using FileStream fs = new(filePath, FileMode.Open); + await fileStream.CopyToAsync(fs); + + logger.Debug("Document written!"); + } + + public async Task GetDocumentContents(EnvelopeDocument document) + { + logger.Debug("Loading file [{0}]", document.Filepath); + var bytes = await File.ReadAllBytesAsync(document.Filepath); + logger.Info("File loaded, size: [{0}]", bytes.Length); + + return bytes; + } + } +}