diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs index f4b00369..f57967f2 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs @@ -1,6 +1,6 @@ using DigitalData.Core.DTO; using DigitalData.EmailProfilerDispatcher.Abstraction.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Common; namespace EnvelopeGenerator.Application.Contracts diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs index 38c8f2b6..d565d39a 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs @@ -1,6 +1,6 @@ using DigitalData.Core.Abstractions.Application; using DigitalData.Core.DTO; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.Contracts diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs new file mode 100644 index 00000000..7590df6e --- /dev/null +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs @@ -0,0 +1,26 @@ +using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +{ + public record EnvelopeReceiverBasicDto() + { + public int EnvelopeId { get; init; } + + public int ReceiverId { get; init; } + + public int Sequence { get; init; } + + [TemplatePlaceholder("[NAME_RECEIVER]")] + public string? Name { get; init; } + + public string? JobTitle { get; init; } + + public string? CompanyName { get; init; } + + public string? PrivateMessage { get; init; } + + public DateTime AddedWhen { get; init; } + + public DateTime? ChangedWhen { get; init; } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs new file mode 100644 index 00000000..49625eee --- /dev/null +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs @@ -0,0 +1,11 @@ +using EnvelopeGenerator.Application.DTOs.Receiver; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +{ + public record EnvelopeReceiverDto() : EnvelopeReceiverBasicDto() + { + public EnvelopeDto? Envelope { get; set; } + + public ReceiverReadDto? Receiver { get; set; } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverDto.cs deleted file mode 100644 index e2fbcdca..00000000 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverDto.cs +++ /dev/null @@ -1,31 +0,0 @@ -using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; -using EnvelopeGenerator.Application.DTOs.Receiver; - -namespace EnvelopeGenerator.Application.DTOs -{ - public record EnvelopeReceiverDto() - { - public int EnvelopeId { get; set; } - - public int ReceiverId { get; set; } - - public int Sequence { get; set; } - - [TemplatePlaceholder("[NAME_RECEIVER]")] - public string? Name { get; set; } - - public string? JobTitle { get; set; } - - public string? CompanyName { get; set; } - - public string? PrivateMessage { get; set; } - - public DateTime AddedWhen { get; set; } - - public DateTime? ChangedWhen { get; set; } - - public EnvelopeDto? Envelope { get; set; } - - public ReceiverReadDto? Receiver { get; set; } - } -} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs index 4c5d5c69..ec6e5b76 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs @@ -1,4 +1,6 @@ using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; +using System.Text.Json.Serialization; namespace EnvelopeGenerator.Application.DTOs.Receiver { @@ -6,6 +8,12 @@ namespace EnvelopeGenerator.Application.DTOs.Receiver int Id, string EmailAddress, string Signature, - DateTime AddedWhen - ) : BaseDTO(Id); + DateTime AddedWhen + ) : BaseDTO(Id) + { + [JsonIgnore] + public IEnumerable? EnvelopeReceivers { get; init; } + + public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name; + }; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs index df3637da..59c89c0b 100644 --- a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs +++ b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs @@ -1,6 +1,7 @@ using AutoMapper; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Domain.Entities; @@ -43,6 +44,7 @@ namespace EnvelopeGenerator.Application.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs index 59f83118..296ad932 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs @@ -5,7 +5,7 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.DTOs.EmailOut; using DigitalData.EmailProfilerDispatcher.Abstraction.Services; using DigitalData.UserManager.Application; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Common; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; @@ -14,7 +14,7 @@ using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Application.Services { - public class EnvelopeMailService : EmailOutService, IEnvelopeMailService + public class EnvelopeMailService : EmailOutService, IEnvelopeMailService { private readonly IEmailTemplateService _tempService; private readonly IEnvelopeReceiverService _envRcvService; diff --git a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs index 11baafc0..e57a1729 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs @@ -2,7 +2,7 @@ using DigitalData.Core.Application; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs index beef339d..e1374b3e 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs @@ -1,45 +1,10 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")] - public class EnvelopeReceiver + public class EnvelopeReceiver : EnvelopeReceiverBase { - [Key] - [Column("ENVELOPE_ID")] - public int EnvelopeId { get; set; } - - [Key] - [Column("RECEIVER_ID")] - public int ReceiverId { get; set; } - - [Required] - [Column("SEQUENCE")] - public int Sequence { get; set; } - - [Column("NAME", TypeName = "nvarchar(128)")] - public string? Name { get; set; } - - [Column("JOB_TITLE", TypeName = "nvarchar(128)")] - public string? JobTitle { get; set; } - - [Column("COMPANY_NAME", TypeName = "nvarchar(128)")] - public string? CompanyName { get; set; } - - [Column("PRIVATE_MESSAGE", TypeName = "nvarchar(max)")] - public string? PrivateMessage { get; set; } - - [Column("ACCESS_CODE", TypeName = "nvarchar(64)")] - public string? AccessCode { get; set; } - - [Required] - [Column("ADDED_WHEN", TypeName = "datetime")] - public DateTime AddedWhen { get; set; } - - [Column("CHANGED_WHEN", TypeName = "datetime")] - public DateTime? ChangedWhen { get; set; } - [ForeignKey("EnvelopeId")] public Envelope? Envelope { get; set; } diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs new file mode 100644 index 00000000..7669389d --- /dev/null +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs @@ -0,0 +1,43 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EnvelopeGenerator.Domain.Entities +{ + [Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")] + public class EnvelopeReceiverBase + { + [Key] + [Column("ENVELOPE_ID")] + public int EnvelopeId { get; set; } + + [Key] + [Column("RECEIVER_ID")] + public int ReceiverId { get; set; } + + [Required] + [Column("SEQUENCE")] + public int Sequence { get; set; } + + [Column("NAME", TypeName = "nvarchar(128)")] + public string? Name { get; set; } + + [Column("JOB_TITLE", TypeName = "nvarchar(128)")] + public string? JobTitle { get; set; } + + [Column("COMPANY_NAME", TypeName = "nvarchar(128)")] + public string? CompanyName { get; set; } + + [Column("PRIVATE_MESSAGE", TypeName = "nvarchar(max)")] + public string? PrivateMessage { get; set; } + + [Column("ACCESS_CODE", TypeName = "nvarchar(64)")] + public string? AccessCode { get; set; } + + [Required] + [Column("ADDED_WHEN", TypeName = "datetime")] + public DateTime AddedWhen { get; set; } + + [Column("CHANGED_WHEN", TypeName = "datetime")] + public DateTime? ChangedWhen { get; set; } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/Receiver.cs b/EnvelopeGenerator.Domain/Entities/Receiver.cs index bfb91c9c..ce354483 100644 --- a/EnvelopeGenerator.Domain/Entities/Receiver.cs +++ b/EnvelopeGenerator.Domain/Entities/Receiver.cs @@ -22,5 +22,7 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("ADDED_WHEN", TypeName = "datetime")] public DateTime AddedWhen { get; set; } + + public IEnumerable? EnvelopeReceivers { get; init; } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs index 53ffb2ba..1d8f626d 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs @@ -11,7 +11,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { } - protected IQueryable ReadBy(string? emailAddress = null, string? signature = null) + protected IQueryable ReadBy(string? emailAddress = null, string? signature = null, bool withLastUsedName = true) { IQueryable query = _dbSet.AsNoTracking(); @@ -21,6 +21,12 @@ namespace EnvelopeGenerator.Infrastructure.Repositories if(signature is not null) query = query.Where(r => r.Signature == signature); + // envelope receivers are ignored (with '[JsonIgnore]' attribute). The reson to add them is to get the las used receiver name + if (withLastUsedName) + { + query = query.Include(r => r.EnvelopeReceivers!.OrderByDescending(er => er.EnvelopeId).Take(1)); + } + return query; } diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 98c5b69a..46f12d7f 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -10,11 +10,11 @@ using DigitalData.Core.API; using EnvelopeGenerator.Application; using Microsoft.Extensions.Localization; using DigitalData.Core.DTO; -using EnvelopeGenerator.Application.DTOs; using Microsoft.AspNetCore.Localization; using System.Text.Encodings.Web; using EnvelopeGenerator.Web.Models; using EnvelopeGenerator.Application.Resources; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; namespace EnvelopeGenerator.Web.Controllers { diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs index 2840c53f..47f958b2 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs @@ -1,12 +1,12 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using Microsoft.AspNetCore.Mvc; using System.Net; namespace EnvelopeGenerator.Web.Controllers.Test { - [ApiController] + [ApiController] [Route("api/test/[controller]")] public class TestEnvelopeMailController : ControllerBase { diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs index c4a09eb7..a88a8887 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs @@ -1,10 +1,10 @@ using DigitalData.Core.API; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application; using EnvelopeGenerator.Domain.Entities; using Microsoft.AspNetCore.Mvc; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; namespace EnvelopeGenerator.Web.Controllers.Test { diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml index c007d932..d927d11d 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml @@ -4,10 +4,10 @@ @{ var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string; } -@using DigitalData.Core.DTO; -@using EnvelopeGenerator.Application.DTOs; -@using Newtonsoft.Json -@using Newtonsoft.Json.Serialization +@ using DigitalData.Core.DTO; +@ using EnvelopeGenerator.Application.DTOs; +@ using Newtonsoft.Json +@ using Newtonsoft.Json.Serialization @model EnvelopeReceiverDto; @{ diff --git a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml index d1d9ad58..fd46d857 100644 --- a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml @@ -1,10 +1,10 @@ @{ var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string; } -@using DigitalData.Core.DTO; -@using EnvelopeGenerator.Application.DTOs; -@using Newtonsoft.Json -@using Newtonsoft.Json.Serialization +@ using DigitalData.Core.DTO; +@ using EnvelopeGenerator.Application.DTOs; +@ using Newtonsoft.Json +@ using Newtonsoft.Json.Serialization @model EnvelopeReceiverDto; @{ ViewData["Title"] = _localizer[WebKey.SignDoc];