From 486b71780167ab048c99fe862c2a443cf92a6d52 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 7 May 2025 02:13:26 +0200 Subject: [PATCH] Update signature handling and database connection management - Changed `Signature` properties from `int` to `double` for precise positioning. - Added necessary using directives in `EnvelopeReceiverController.cs` for database operations. - Introduced a private `_cnnStr` field in `EnvelopeReceiverController` to store the connection string. - Updated the constructor to accept `IOptions` for dependency injection of the connection string. - Added a SQL command block to handle document element additions using a stored procedure. - Configured the `ConnectionString` class in `Program.cs` to bind the connection string from app settings. - Created a new `ConnectionString` class to manage the connection string value. --- .../Create/CreateEnvelopeReceiverDtos.cs | 2 +- .../Controllers/EnvelopeReceiverController.cs | 47 ++++++++++++++++++- .../Models/ConnectionString.cs | 12 +++++ EnvelopeGenerator.GeneratorAPI/Program.cs | 3 ++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/Models/ConnectionString.cs diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverDtos.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverDtos.cs index 54de38a9..77aa2869 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverDtos.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverDtos.cs @@ -14,7 +14,7 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; /// X-Position /// Y-Position /// Seite, auf der sie sich befindet -public record Signature([Required] int X, [Required] int Y, [Required] int Page); +public record Signature([Required] double X, [Required] double Y, [Required] int Page); /// /// DTO für Empfänger, die erstellt oder abgerufen werden sollen. diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 2c021dcb..ef9b77b6 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -7,9 +7,13 @@ using EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; using EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; using EnvelopeGenerator.Application.Envelopes.Queries.ReceiverName; using EnvelopeGenerator.Domain.Entities; +using EnvelopeGenerator.GeneratorAPI.Models; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Data.SqlClient; +using Microsoft.Extensions.Options; +using System.Data; using System.Threading.Channels; namespace EnvelopeGenerator.GeneratorAPI.Controllers; @@ -39,6 +43,8 @@ public class EnvelopeReceiverController : ControllerBase private readonly IDocumentExecutor _documentExecutor; + private readonly string _cnnStr; + /// /// Konstruktor für den EnvelopeReceiverController. /// @@ -48,7 +54,7 @@ public class EnvelopeReceiverController : ControllerBase /// /// /// - public EnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService envelopeReceiverService, IMediator mediator, IMapper mapper, IEnvelopeExecutor envelopeExecutor, IEnvelopeReceiverExecutor erExecutor, IDocumentExecutor documentExecutor) + public EnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService envelopeReceiverService, IMediator mediator, IMapper mapper, IEnvelopeExecutor envelopeExecutor, IEnvelopeReceiverExecutor erExecutor, IDocumentExecutor documentExecutor, IOptions csOpt) { _logger = logger; _erService = envelopeReceiverService; @@ -57,6 +63,7 @@ public class EnvelopeReceiverController : ControllerBase _envelopeExecutor = envelopeExecutor; _erExecutor = erExecutor; _documentExecutor = documentExecutor; + _cnnStr = csOpt.Value.Value; } /// @@ -228,7 +235,45 @@ public class EnvelopeReceiverController : ControllerBase if(document is null) return StatusCode(StatusCodes.Status500InternalServerError, "Document creation is failed."); + #endregion + + #region Add document element + string sql = @" + DECLARE @OUT_SUCCESS bit; + + EXEC [dbo].[PRSIG_API_ADD_DOC_RECEIVER_ELEM] + @DOC_ID = @DOC_ID, + @RECEIVER_ID = @RECEIVER_ID, + @POSITION_X = @POSITION_X, + @POSITION_Y = @POSITION_Y, + @PAGE = @PAGE, + @OUT_SUCCESS = @OUT_SUCCESS OUTPUT; + + SELECT @OUT_SUCCESS as [@OUT_SUCCESS];"; + + foreach(var rcv in res.SentRecipients) + foreach(var sign in request.Receivers.Where(r => r.EmailAddress == rcv.EmailAddress).FirstOrDefault()?.Signatures ?? Array.Empty()) + { + using (SqlConnection conn = new(_cnnStr)) + { + conn.Open(); + + using SqlCommand cmd = new SqlCommand(sql, conn); + cmd.CommandType = CommandType.Text; + + cmd.Parameters.AddWithValue("@DOC_ID", document.Id); + cmd.Parameters.AddWithValue("@RECEIVER_ID", rcv.Id); + cmd.Parameters.AddWithValue("@POSITION_X", sign.X.ToString()); + cmd.Parameters.AddWithValue("@POSITION_Y", sign.Y.ToString()); + cmd.Parameters.AddWithValue("@PAGE", sign.Page.ToString()); + using SqlDataReader reader = cmd.ExecuteReader(); + if (reader.Read()) + { + bool outSuccess = reader.GetBoolean(0); + } + } + } #endregion return Ok(res); diff --git a/EnvelopeGenerator.GeneratorAPI/Models/ConnectionString.cs b/EnvelopeGenerator.GeneratorAPI/Models/ConnectionString.cs new file mode 100644 index 00000000..0adb8e5b --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Models/ConnectionString.cs @@ -0,0 +1,12 @@ +namespace EnvelopeGenerator.GeneratorAPI.Models; + +/// +/// +/// +public class ConnectionString +{ + /// + /// + /// + public string Value { get; set; } = string.Empty; +} diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 121d83a4..4c09198f 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -90,6 +90,9 @@ builder.Services.AddSwaggerGen(options => builder.Services.AddOpenApi(); // DbContext var connStr = config.GetConnectionString("Default") ?? throw new InvalidOperationException("There is no default connection string in appsettings.json."); + +builder.Services.Configure(cs => cs.Value = connStr); + builder.Services.AddDbContext(options => options.UseSqlServer(connStr)); builder.Services.AddAuthHubClient(config.GetSection("AuthClientParams"));