From 2e66129485d010070c4bfeb6cf681a5d72078349 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 16 May 2024 16:40:38 +0200 Subject: [PATCH] =?UTF-8?q?DTO=20f=C3=BCr=20EnvelopeHistory-Erstellung=20h?= =?UTF-8?q?inzugef=C3=BCgt,=20asynchrone=20Record-Methode=20implementiert?= =?UTF-8?q?=20und=20Datenbank-Trigger=20f=C3=BCr=20Envelope-=20und=20Envel?= =?UTF-8?q?opeHistory-Entit=C3=A4ten=20konfiguriert.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contracts/IEnvelopeHistoryService.cs | 7 +++++-- EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs | 1 + .../DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs | 8 ++++++++ .../DTOs/{ => EnvelopeHistory}/EnvelopeHistoryDto.cs | 2 +- .../MappingProfiles/BasicDtoMappingProfile.cs | 3 +++ .../Services/EnvelopeHistoryService.cs | 12 ++++++++++-- EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs | 1 + EnvelopeGenerator.Infrastructure/EGDbContext.cs | 12 +++--------- EnvelopeGenerator.Web/Controllers/HomeController.cs | 9 ++++----- .../Test/TestEnvelopeHistoryController.cs | 4 ++-- EnvelopeGenerator.Web/appsettings.json | 2 +- 11 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs rename EnvelopeGenerator.Application/DTOs/{ => EnvelopeHistory}/EnvelopeHistoryDto.cs (74%) diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs index 8883160e..6a1f4eda 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs @@ -1,17 +1,20 @@ using DigitalData.Core.Contracts.Application; -using EnvelopeGenerator.Application.DTOs; +using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Application.Contracts { - public interface IEnvelopeHistoryService : IBasicCRUDService + public interface IEnvelopeHistoryService : ICRUDService { Task CountAsync(int? envelopeId = null, string? userReference = null, int? status = null); Task AccessCodeAlreadyRequested(int envelopeId, string userReference); Task IsSigned(int envelopeId, string userReference); + + Task> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs index eab0d471..3b1cc6db 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs @@ -1,4 +1,5 @@ using DigitalData.UserManager.Domain.Entities; +using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.DTOs diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs new file mode 100644 index 00000000..2999935d --- /dev/null +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs @@ -0,0 +1,8 @@ +namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory +{ + public record EnvelopeHistoryCreateDto( + int EnvelopeId, + string UserReference, + int Status, + DateTime? ActionDate); +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeHistoryDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs similarity index 74% rename from EnvelopeGenerator.Application/DTOs/EnvelopeHistoryDto.cs rename to EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs index 8efd12e1..8f242bc0 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeHistoryDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs @@ -1,4 +1,4 @@ -namespace EnvelopeGenerator.Application.DTOs +namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory { public record EnvelopeHistoryDto( long Id, diff --git a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs index cd7304f7..b271c472 100644 --- a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs +++ b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs @@ -1,5 +1,6 @@ using AutoMapper; using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.MappingProfiles @@ -17,6 +18,7 @@ namespace EnvelopeGenerator.Application.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); CreateMap(); @@ -32,6 +34,7 @@ namespace EnvelopeGenerator.Application.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); CreateMap(); diff --git a/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs b/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs index fb8d3c77..94fdd471 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs @@ -2,15 +2,16 @@ using DigitalData.Core.Application; using Microsoft.Extensions.Localization; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using static EnvelopeGenerator.Common.Constants; using EnvelopeGenerator.Application.Resources; +using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; namespace EnvelopeGenerator.Application.Services { - public class EnvelopeHistoryService : BasicCRUDService, IEnvelopeHistoryService + public class EnvelopeHistoryService : CRUDService, IEnvelopeHistoryService { public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IStringLocalizer localizer, IMapper mapper) : base(repository, localizer, mapper) @@ -33,5 +34,12 @@ namespace EnvelopeGenerator.Application.Services envelopeId: envelopeId, userReference: userReference, status: (int) EnvelopeStatus.DocumentSigned) > 0; + + public async Task> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status) => + await CreateAsync(new (EnvelopeId: envelopeId, UserReference: userReference, Status: (int)status, ActionDate: DateTime.Now)) + .ThenAsync( + Success: id => Result.Success(id), + Fail: (mssg, ntc) => Result.Fail().Message(mssg).Notice(ntc) + ); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs index 20ee71bc..ada07298 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs @@ -25,6 +25,7 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("ADDED_WHEN", TypeName = "datetime")] + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime AddedWhen { get; set; } [Column("ACTION_DATE", TypeName = "datetime")] diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index eb5c053c..1a910bcb 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -33,11 +33,6 @@ namespace DigitalData.UserManager.Infrastructure.Repositories .WithOne() .HasForeignKey(ed => ed.EnvelopeId); - //modelBuilder.Entity() - // .HasMany(e => e.Receivers) - // .WithOne(er => er.Envelope) - // .HasForeignKey(er => er.EnvelopeId); - modelBuilder.Entity() .HasMany(e => e.History) .WithOne() @@ -53,10 +48,9 @@ namespace DigitalData.UserManager.Infrastructure.Repositories .WithMany(ed => ed.Elements) .HasForeignKey(dre => dre.DocumentId); - //modelBuilder.Entity() - // .HasMany(e => e.EnvelopeReceivers) - // .WithOne(er => er.Receiver) - // .HasForeignKey(er => er.ReceiverId); + // Configure entities to handle database triggers + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_HISTORY_AFT_INS")); + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_HISTORY_AFT_INS")); base.OnModelCreating(modelBuilder); } diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 52fbab73..27700489 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -56,8 +56,8 @@ namespace EnvelopeGenerator.Web.Controllers bool accessCodeAlreadyRequested = await _historyService.AccessCodeAlreadyRequested(envelopeId: er.Envelope!.Id, userReference: er.Receiver!.EmailAddress); if (!accessCodeAlreadyRequested) { - // Send email with password - bool actionResult = database.Services.actionService.RequestAccessCode(response.Envelope, response.Receiver); + await _historyService.RecordAsync(er.EnvelopeId, er.Receiver.EmailAddress, Constants.EnvelopeStatus.AccessCodeRequested); + bool result = database.Services.emailService.SendDocumentAccessCodeReceivedEmail(response.Envelope, response.Receiver); } @@ -89,13 +89,12 @@ namespace EnvelopeGenerator.Web.Controllers UserLanguage = _cultures.Default.Language; return Redirect($"{Request.Headers["Referer"]}?culture={_cultures.Default.Language}"); } - - if (UserLanguage is not null && culture is not null) + else if (UserLanguage is not null && culture is not null) { return Redirect($"Locked"); } - ViewData["UserLanguage"] = UserLanguage; + ViewData["UserLanguage"] = UserLanguage ?? culture; return await _envRcvService.IsExisting(envelopeReceiverId: envelopeReceiverId).ThenAsync( Success: isExisting => isExisting ? View().WithData("EnvelopeKey", envelopeReceiverId) : this.ViewEnvelopeNotFound(), diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeHistoryController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeHistoryController.cs index 8ecab4bd..3fb439c7 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeHistoryController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeHistoryController.cs @@ -1,13 +1,13 @@ using DigitalData.Core.API; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Web.Controllers.Test { - public class TestEnvelopeHistoryController : TestControllerBase + public class TestEnvelopeHistoryController : CRUDControllerBase { public TestEnvelopeHistoryController(ILogger logger, IEnvelopeHistoryService service) : base(logger, service) { diff --git a/EnvelopeGenerator.Web/appsettings.json b/EnvelopeGenerator.Web/appsettings.json index d8779239..90e35de5 100644 --- a/EnvelopeGenerator.Web/appsettings.json +++ b/EnvelopeGenerator.Web/appsettings.json @@ -19,7 +19,7 @@ }, "PSPDFKitLicenseKey": null, /* The first format parameter {0} will be replaced by the nonce value. */ - "TestCSP": true, + "TestCSP": false, "Content-Security-Policy": [ "default-src 'self'", "script-src 'self' 'nonce-{0}' 'unsafe-inline' 'unsafe-eval' blob: data:",