diff --git a/EnvelopeGenerator.Application/DIExtensions.cs b/EnvelopeGenerator.Application/DIExtensions.cs index 33e7f569..80db37ba 100644 --- a/EnvelopeGenerator.Application/DIExtensions.cs +++ b/EnvelopeGenerator.Application/DIExtensions.cs @@ -5,11 +5,6 @@ using EnvelopeGenerator.Application.Services; using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Repositories; using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace EnvelopeGenerator.Application { @@ -33,6 +28,7 @@ namespace EnvelopeGenerator.Application services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -46,6 +42,7 @@ namespace EnvelopeGenerator.Application services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); //Auto mapping profiles services.AddAutoMapper(typeof(BasicDtoMappingProfile).Assembly); diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs index 03cc70db..d75d3621 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs @@ -1,11 +1,15 @@ -namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly +using System.Text.Json.Serialization; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly { public record EnvelopeReceiverReadOnlyCreateDto( long EnvelopeId, string ReceiverMail, - DateTime DateValid, - string AddedWho) + DateTime DateValid) { + [JsonIgnore] + public string? AddedWho { get; set; } + public DateTime AddedWhen { get; } = DateTime.Now; }; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs index 453582b2..88417d66 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly +using EnvelopeGenerator.Application.DTOs.Receiver; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly { public record EnvelopeReceiverReadOnlyDto( long Id, @@ -9,5 +11,6 @@ string AddedWho, EnvelopeDto? Envelope = null, string? ChangedWho = null, - DateTime? ChangedWhen = null); + DateTime? ChangedWhen = null, + ReceiverReadDto? Receiver = null); } \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverReadOnly.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverReadOnly.cs index 4b96e7a7..56a5319d 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverReadOnly.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverReadOnly.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions; +using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; namespace EnvelopeGenerator.Domain.Entities { @@ -16,9 +17,13 @@ namespace EnvelopeGenerator.Domain.Entities [Required] public long EnvelopeId { get; init; } + [ForeignKey("EnvelopeId")] + public Envelope? Envelope { get; init; } + [Column("RECEIVER_MAIL")] [Required] [StringLength(250)] + [TemplatePlaceholder("NAME_RECEIVER")] public required string ReceiverMail { get; init; } [Column("DATE_VALID")] @@ -30,6 +35,8 @@ namespace EnvelopeGenerator.Domain.Entities [StringLength(100)] public required string AddedWho { get; init; } + public Receiver? Receiver { get; init; } + [Column("ADDED_WHEN")] [Required] public DateTime AddedWhen { get; init; } diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index b35b228c..daa454a3 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -129,12 +129,24 @@ namespace EnvelopeGenerator.Infrastructure .HasForeignKey(eh => eh.UserReference) .HasPrincipalKey(e => e.Email); + modelBuilder.Entity() + .HasOne(erro => erro.Receiver) + .WithMany() + .HasForeignKey(erro => erro.AddedWho) + .HasPrincipalKey(r => r.EmailAddress); + + modelBuilder.Entity() + .HasOne(erro => erro.Envelope) + .WithMany() + .HasForeignKey(erro => (int) erro.EnvelopeId); + // 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")); modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBEMLP_EMAIL_OUT_AFT_INS")); modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBEMLP_EMAIL_OUT_AFT_UPD")); - + modelBuilder.Entity().ToTable(tb => tb.HasTrigger("TBSIG_ENVELOPE_RECEIVER_READ_ONLY_UPD")); + //configure model builder for user manager tables modelBuilder.ConfigureUserManager(); diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs index 40e0d238..acbdd1f6 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs @@ -1,6 +1,7 @@ using DigitalData.Core.Infrastructure; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; +using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Infrastructure.Repositories { @@ -9,5 +10,12 @@ namespace EnvelopeGenerator.Infrastructure.Repositories public EnvelopeReceiverReadOnlyRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeReceiverReadOnlys) { } + + protected override IQueryable ReadOnly() + { + return base.ReadOnly() + .Include(erro => erro.Envelope) + .Include(erro => erro.Receiver); + } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs b/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs new file mode 100644 index 00000000..59d6b812 --- /dev/null +++ b/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs @@ -0,0 +1,54 @@ +using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.Contracts; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; + +namespace EnvelopeGenerator.Web.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class ReadOnlyController : ControllerBase + { + private readonly ILogger _logger; + + private readonly IEnvelopeReceiverReadOnlyService _erroService; + + public ReadOnlyController(ILogger logger, IEnvelopeReceiverReadOnlyService erroService) + { + _logger = logger; + _erroService = erroService; + } + + [HttpGet] + [Authorize] + public async Task GetAllAsync() + { + var res = await _erroService.ReadAllAsync(); + return Ok(res); + } + + [HttpPost] + [Authorize] + public async Task CreateAsync([FromBody] EnvelopeReceiverReadOnlyCreateDto createDto) + { + //set AddedWho + var authReceiverMail = this.GetAuthReceiverMail(); + if (authReceiverMail is null) + { + _logger.LogError("Email clam is not found in envelope-receiver-read-only creation process. Create DTO is:\n {dto}", JsonConvert.SerializeObject(createDto)); + + return Unauthorized(); + } + createDto.AddedWho = authReceiverMail; + + return await _erroService.CreateAsync(createDto: createDto).ThenAsync( + Success: id => Ok(id), + Fail: IActionResult (msg, ntc) => + { + return StatusCode(StatusCodes.Status500InternalServerError); + }); + } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Web/appsettings.json b/EnvelopeGenerator.Web/appsettings.json index e3c23d6a..181159b5 100644 --- a/EnvelopeGenerator.Web/appsettings.json +++ b/EnvelopeGenerator.Web/appsettings.json @@ -16,7 +16,7 @@ }, "AdminPassword": "dd", "PSPDFKitLicenseKey": "SXCtGGY9XA-31OGUXQK-r7c6AkdLGPm2ljuyDr1qu0kkhLvydg-Do-fxpNUF4Rq3fS_xAnZRNFRHbXpE6sQ2BMcCSVTcXVJO6tPviexjpiT-HnrDEySlUERJnnvh-tmeOWprxS6BySPnSILkmaVQtUfOIUS-cUbvvEYHTvQBKbSF8di4XHQFyfv49ihr51axm3NVV3AXwh2EiKL5C5XdqBZ4sQ4O7vXBjM2zvxdPxlxdcNYmiU83uAzw7B83O_jubPzya4CdUHh_YH7Nlp2gP56MeG1Sw2JhMtfG3Rj14Sg4ctaeL9p6AEWca5dDjJ2li5tFIV2fQSsw6A_cowLu0gtMm5i8IfJXeIcQbMC2-0wGv1oe9hZYJvFMdzhTM_FiejM0agemxt3lJyzuyP8zbBSOgp7Si6A85krLWPZptyZBTG7pp7IHboUHfPMxCXqi-zMsqewOJtQBE2mjntU-lPryKnssOpMPfswwQX7QSkJYV5EMqNmEhQX6mEkp2wcqFzMC7bJQew1aO4pOpvChUaMvb1vgRek0HxLag0nwQYX2YrYGh7F_xXJs-8HNwJe8H0-eW4x4faayCgM5rB5772CCCsD9ThZcvXFrjNHHLGJ8WuBUFm6LArvSfFQdii_7j-_sqHMpeKZt26NFgivj1A==", - "UseCSPInDev": true, + "UseCSPInDev": false, "Content-Security-Policy": [ // The first format parameter {0} will be replaced by the nonce value. "default-src 'self'", "script-src 'self' 'nonce-{0}' 'unsafe-eval'",