refactor: Receiver-Service in CRUD-Service umgewandelt und DTOs aktualisiert

- Receiver-Service von einfachem CRUD zu generischem CRUD-Service umgewandelt.
- `ReceiverDto` in `ReceiverReadDto` umbenannt.
- Neues `ReceiverCreateDto` mit automatischer SHA-256-Signaturerstellung und aktuellem Zeitstempel erstellt.
- Leeres `ReceiverUpdateDto` für zukünftige Updates hinzugefügt.
This commit is contained in:
Developer 02 2024-08-21 14:37:45 +02:00
parent 3a7099feb4
commit afedfdd596
13 changed files with 66 additions and 18 deletions

View File

@ -1,7 +1,7 @@
using DigitalData.Core.Abstractions.Application; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
@ -22,7 +22,7 @@ namespace EnvelopeGenerator.Application.Contracts
Task<IEnumerable<EnvelopeHistoryDto>> ReadRejectedAsync(int envelopeId, string? userReference = null); Task<IEnumerable<EnvelopeHistoryDto>> ReadRejectedAsync(int envelopeId, string? userReference = null);
Task<IEnumerable<ReceiverDto>> ReadRejectingReceivers(int envelopeId); Task<IEnumerable<ReceiverReadDto>> ReadRejectingReceivers(int envelopeId);
Task<DataResult<long>> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null); Task<DataResult<long>> RecordAsync(int envelopeId, string userReference, EnvelopeStatus status, string? comment = null);
} }

View File

@ -1,10 +1,10 @@
using DigitalData.Core.Abstractions.Application; using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts
{ {
public interface IReceiverService : IBasicCRUDService<ReceiverDto, Receiver, int> public interface IReceiverService : ICRUDService<ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>
{ {
} }
} }

View File

@ -1,5 +1,6 @@
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.DTOs.User; using DigitalData.UserManager.Application.DTOs.User;
using EnvelopeGenerator.Application.DTOs.Receiver;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
@ -12,7 +13,7 @@ namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
DateTime AddedWhen, DateTime AddedWhen,
DateTime? ActionDate, DateTime? ActionDate,
UserCreateDto? Sender, UserCreateDto? Sender,
ReceiverDto? Receiver, ReceiverReadDto? Receiver,
ReferenceType ReferenceType, ReferenceType ReferenceType,
string? Comment = null) : BaseDTO<long>(Id); string? Comment = null) : BaseDTO<long>(Id);
} }

View File

@ -1,4 +1,5 @@
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.DTOs namespace EnvelopeGenerator.Application.DTOs
{ {
@ -25,6 +26,6 @@ namespace EnvelopeGenerator.Application.DTOs
public EnvelopeDto? Envelope { get; set; } public EnvelopeDto? Envelope { get; set; }
public ReceiverDto? Receiver { get; set; } public ReceiverReadDto? Receiver { get; set; }
} }
} }

View File

@ -0,0 +1,20 @@
using System.Security.Cryptography;
using System.Text;
namespace EnvelopeGenerator.Application.DTOs.Receiver
{
public record ReceiverCreateDto(string EmailAddress)
{
public string Signature => sha256HexOfMail.Value;
private readonly Lazy<string> sha256HexOfMail = new(() =>
{
var bytes_arr = Encoding.UTF8.GetBytes(EmailAddress.ToUpper());
var hash_arr = SHA256.HashData(bytes_arr);
var hexa_str = BitConverter.ToString(hash_arr);
return hexa_str.Replace("-", string.Empty);
});
public DateTime AddedWhen { get; } = DateTime.Now;
};
}

View File

@ -1,8 +1,8 @@
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
namespace EnvelopeGenerator.Application.DTOs namespace EnvelopeGenerator.Application.DTOs.Receiver
{ {
public record ReceiverDto( public record ReceiverReadDto(
int Id, int Id,
string EmailAddress, string EmailAddress,
string Signature, string Signature,

View File

@ -0,0 +1,4 @@
namespace EnvelopeGenerator.Application.DTOs.Receiver
{
public record ReceiverUpdateDto();
}

View File

@ -1,6 +1,7 @@
using AutoMapper; using AutoMapper;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.MappingProfiles namespace EnvelopeGenerator.Application.MappingProfiles
@ -21,7 +22,9 @@ namespace EnvelopeGenerator.Application.MappingProfiles
CreateMap<EnvelopeHistory, EnvelopeHistoryCreateDto>(); CreateMap<EnvelopeHistory, EnvelopeHistoryCreateDto>();
CreateMap<EnvelopeReceiver, EnvelopeReceiverDto>(); CreateMap<EnvelopeReceiver, EnvelopeReceiverDto>();
CreateMap<EnvelopeType, EnvelopeTypeDto>(); CreateMap<EnvelopeType, EnvelopeTypeDto>();
CreateMap<Receiver, ReceiverDto>(); CreateMap<Receiver, ReceiverReadDto>();
CreateMap<Receiver, ReceiverCreateDto>();
CreateMap<Receiver, ReceiverUpdateDto>();
CreateMap<UserReceiver, UserReceiverDto>(); CreateMap<UserReceiver, UserReceiverDto>();
// DTO to Entity mappings // DTO to Entity mappings
@ -36,7 +39,9 @@ namespace EnvelopeGenerator.Application.MappingProfiles
CreateMap<EnvelopeHistoryCreateDto, EnvelopeHistory>(); CreateMap<EnvelopeHistoryCreateDto, EnvelopeHistory>();
CreateMap<EnvelopeReceiverDto, EnvelopeReceiver>(); CreateMap<EnvelopeReceiverDto, EnvelopeReceiver>();
CreateMap<EnvelopeTypeDto, EnvelopeType>(); CreateMap<EnvelopeTypeDto, EnvelopeType>();
CreateMap<ReceiverDto, Receiver>(); CreateMap<ReceiverReadDto, Receiver>();
CreateMap<ReceiverCreateDto, Receiver>();
CreateMap<ReceiverUpdateDto, Receiver>();
CreateMap<UserReceiverDto, UserReceiver>(); CreateMap<UserReceiverDto, UserReceiver>();
} }
} }

View File

@ -8,7 +8,7 @@ using static EnvelopeGenerator.Common.Constants;
using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Application.Resources;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
@ -67,11 +67,11 @@ namespace EnvelopeGenerator.Application.Services
await ReadAsync(envelopeId: envelopeId, userReference: userReference, status: (int)EnvelopeStatus.DocumentRejected, withReceiver:true); await ReadAsync(envelopeId: envelopeId, userReference: userReference, status: (int)EnvelopeStatus.DocumentRejected, withReceiver:true);
//TODO: use IQueryable in repository to incerease the performance //TODO: use IQueryable in repository to incerease the performance
public async Task<IEnumerable<ReceiverDto>> ReadRejectingReceivers(int envelopeId) public async Task<IEnumerable<ReceiverReadDto>> ReadRejectingReceivers(int envelopeId)
{ {
var envelopes = await ReadRejectedAsync(envelopeId); var envelopes = await ReadRejectedAsync(envelopeId);
return envelopes is null return envelopes is null
? Enumerable.Empty<ReceiverDto>() ? Enumerable.Empty<ReceiverReadDto>()
: envelopes : envelopes
.Where(eh => eh?.Receiver != null) .Where(eh => eh?.Receiver != null)
.Select(eh => eh.Receiver!); .Select(eh => eh.Receiver!);

View File

@ -2,14 +2,14 @@
using DigitalData.Core.Application; using DigitalData.Core.Application;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
public class ReceiverService : BasicCRUDService<IReceiverRepository, ReceiverDto, Receiver, int>, IReceiverService public class ReceiverService : CRUDService<IReceiverRepository, ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>, IReceiverService
{ {
public ReceiverService(IReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper) public ReceiverService(IReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper)
: base(repository, mapper) : base(repository, mapper)

View File

@ -0,0 +1,17 @@
using DigitalData.Core.API;
using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities;
using Microsoft.AspNetCore.Mvc;
namespace EnvelopeGenerator.GeneratorAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ReceiverController : CRUDControllerBaseWithErrorHandling<IReceiverService, ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>
{
public ReceiverController(ILogger logger, IReceiverService service) : base(logger, service)
{
}
}
}

View File

@ -1,10 +1,10 @@
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Web.Controllers.Test namespace EnvelopeGenerator.Web.Controllers.Test
{ {
public class TestReceiverController : TestControllerBase<IReceiverService, ReceiverDto, Receiver, int> public class TestReceiverController : TestControllerBase<IReceiverService, ReceiverReadDto, Receiver, int>
{ {
public TestReceiverController(ILogger<TestReceiverController> logger, IReceiverService service) : base(logger, service) public TestReceiverController(ILogger<TestReceiverController> logger, IReceiverService service) : base(logger, service)
{ {