Refaktorierung: Hauptentität auf EnvelopeReceiver geändert; Endlosschleifen-Bug behoben

- HomeController und ShowEnvelopeView aktualisiert.
- Endlosschleifenproblem zwischen Envelope und EnvelopeReceiver gelöst.
- Anpassungen an Envelope, EnvelopeDTO, EnvelopeRepository und EnvelopeService vorgenommen.
This commit is contained in:
Developer 02 2024-05-03 14:00:58 +02:00
parent eb096cb201
commit 9620cb7189
9 changed files with 22 additions and 35 deletions

View File

@ -8,8 +8,8 @@ namespace EnvelopeGenerator.Application.Contracts
{ {
public interface IEnvelopeService : IBasicCRUDService<IEnvelopeRepository, EnvelopeDto, Envelope, int> public interface IEnvelopeService : IBasicCRUDService<IEnvelopeRepository, EnvelopeDto, Envelope, int>
{ {
Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool envelopeReceivers = false, bool history = false, bool documentReceiverElement = false); Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false);
Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, string? signature = null, bool withDocuments = false, bool withEnvelopeReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false); Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false);
} }
} }

View File

@ -34,6 +34,5 @@ namespace EnvelopeGenerator.Application.DTOs
string? StatusTranslated, string? StatusTranslated,
string? ContractTypeTranslated, string? ContractTypeTranslated,
IEnumerable<EnvelopeDocumentDto>? Documents, IEnumerable<EnvelopeDocumentDto>? Documents,
IEnumerable<EnvelopeReceiverDto>? EnvelopeReceivers,
IEnumerable<EnvelopeHistoryDto>? History); IEnumerable<EnvelopeHistoryDto>? History);
} }

View File

@ -20,16 +20,16 @@ namespace EnvelopeGenerator.Application.Services
_logger = logger; _logger = logger;
} }
public async Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool envelopeReceivers = false, bool history = false, bool documentReceiverElement = false) public async Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false)
{ {
var envelopes = await _repository.ReadAllWithAsync(documents: documents, envelopeReceivers: envelopeReceivers, history: history, documentReceiverElement: documentReceiverElement); var envelopes = await _repository.ReadAllWithAsync(documents: documents, history: history, documentReceiverElement: documentReceiverElement);
var readDto = _mapper.MapOrThrow<IEnumerable<EnvelopeDto>>(envelopes); var readDto = _mapper.MapOrThrow<IEnumerable<EnvelopeDto>>(envelopes);
return Result.Success(readDto); return Result.Success(readDto);
} }
public async Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, string? signature = null, bool withDocuments = false, bool withEnvelopeReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false) public async Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false)
{ {
var envelope = await _repository.ReadByUuidAsync(uuid: uuid, signature: signature, withDocuments: withDocuments, withEnvelopeReceivers: withEnvelopeReceivers, withHistory: withHistory, withDocumentReceiverElement: withDocumentReceiverElement, withUser:withUser, withAll:withAll); var envelope = await _repository.ReadByUuidAsync(uuid: uuid, withDocuments: withDocuments, withHistory: withHistory, withDocumentReceiverElement: withDocumentReceiverElement, withUser:withUser, withAll:withAll);
if (envelope is null) if (envelope is null)
return Result.Fail<EnvelopeDto>(); return Result.Fail<EnvelopeDto>();

View File

@ -115,8 +115,6 @@ namespace EnvelopeGenerator.Domain.Entities
public IEnumerable<EnvelopeDocument>? Documents { get; set; } public IEnumerable<EnvelopeDocument>? Documents { get; set; }
public IEnumerable<EnvelopeReceiver>? EnvelopeReceivers { get; set; }
public IEnumerable<EnvelopeHistory>? History { get; set; } public IEnumerable<EnvelopeHistory>? History { get; set; }
} }
} }

View File

@ -5,8 +5,8 @@ namespace EnvelopeGenerator.Infrastructure.Contracts
{ {
public interface IEnvelopeRepository : ICRUDRepository<Envelope, int> public interface IEnvelopeRepository : ICRUDRepository<Envelope, int>
{ {
Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool envelopeReceivers = false, bool history = false, bool documentReceiverElement = true); Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false);
Task<Envelope?> ReadByUuidAsync(string uuid, string? signature = null, bool withDocuments = false, bool withEnvelopeReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false); Task<Envelope?> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false);
} }
} }

View File

@ -12,7 +12,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories
{ {
} }
public async Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false, bool documentReceiverElement = false) public async Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false)
{ {
var query = _dbSet.AsQueryable(); var query = _dbSet.AsQueryable();
@ -22,31 +22,22 @@ namespace EnvelopeGenerator.Infrastructure.Repositories
else else
query = query.Include(e => e.Documents); query = query.Include(e => e.Documents);
if (receivers)
query = query.Include(e => e.EnvelopeReceivers);
if (history) if (history)
query = query.Include(e => e.History); query = query.Include(e => e.History);
return await query.ToListAsync(); return await query.ToListAsync();
} }
public async Task<Envelope?> ReadByUuidAsync(string uuid, string? signature = null, bool withDocuments = false, bool withEnvelopeReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false) public async Task<Envelope?> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false)
{ {
var query = _dbSet.Where(e => e.Uuid == uuid); var query = _dbSet.Where(e => e.Uuid == uuid);
if (signature is not null)
query = query.Where(e => e.EnvelopeReceivers != null && e.EnvelopeReceivers.Any(er => er.Receiver != null && er.Receiver.Signature == signature));
if (withAll || withDocuments) if (withAll || withDocuments)
if (withAll || withDocumentReceiverElement) if (withAll || withDocumentReceiverElement)
query = query.Include(e => e.Documents!).ThenInclude(d => d.Elements); query = query.Include(e => e.Documents!).ThenInclude(d => d.Elements);
else else
query = query.Include(e => e.Documents); query = query.Include(e => e.Documents);
if (withAll || withEnvelopeReceivers)
query = query.Include(e => e.EnvelopeReceivers!).ThenInclude(er => er.Receiver);
if (withAll || withUser) if (withAll || withUser)
query = query.Include(e => e.User!); query = query.Include(e => e.User!);

View File

@ -24,9 +24,10 @@ namespace EnvelopeGenerator.Infrastructure.Repositories
query = query.Where(er => er.Receiver != null && er.Receiver.Signature == signature); query = query.Where(er => er.Receiver != null && er.Receiver.Signature == signature);
if (withEnvelope) if (withEnvelope)
query = query.Include(er => er.Envelope).ThenInclude(e => e!.Documents!).ThenInclude(d => d.Elements) query = query
.Include(er => er.Envelope).ThenInclude(e => e!.Documents!).ThenInclude(d => d.Elements)
.Include(er => er.Envelope).ThenInclude(e => e!.History) .Include(er => er.Envelope).ThenInclude(e => e!.History)
.Include(er => er.Envelope).ThenInclude(e => e!.History); .Include(er => er.Envelope).ThenInclude(e => e!.User);
if (withReceiver) if (withReceiver)
query = query.Include(er => er.Receiver); query = query.Include(er => er.Receiver);

View File

@ -17,16 +17,16 @@ namespace EnvelopeGenerator.Web.Controllers.Test
public override Task<IActionResult> GetAll() => base.GetAll(); public override Task<IActionResult> GetAll() => base.GetAll();
[HttpGet] [HttpGet]
public async Task<IActionResult> GetAll([FromQuery] string? envelopeKey = default, [FromQuery] bool withDocuments = false, [FromQuery] bool withEnvelopeReceivers = false, [FromQuery] bool withHistory = false, [FromQuery] bool withDocumentReceiverElement = false, [FromQuery] bool withUser = false, [FromQuery] bool withAll = true) public async Task<IActionResult> GetAll([FromQuery] string? envelopeKey = default, [FromQuery] bool withDocuments = false, [FromQuery] bool withHistory = false, [FromQuery] bool withDocumentReceiverElement = false, [FromQuery] bool withUser = false, [FromQuery] bool withAll = true)
{ {
if(envelopeKey is not null) if(envelopeKey is not null)
{ {
var decoded = envelopeKey.DecodeEnvelopeReceiverId(); (var uuid, var signature) = envelopeKey.DecodeEnvelopeReceiverId();
if (uuid is null)
return BadRequest("UUID is null");
var envlopeServiceResult = await _service.ReadByUuidAsync( var envlopeServiceResult = await _service.ReadByUuidAsync(
uuid: decoded.EnvelopeUuid, uuid: uuid,
signature: decoded.ReceiverSignature, withDocuments: withDocuments, withHistory: withHistory, withDocumentReceiverElement:withDocumentReceiverElement, withUser:withUser, withAll:withAll);
withDocuments: withDocuments, withEnvelopeReceivers: withEnvelopeReceivers, withHistory: withHistory, withDocumentReceiverElement:withDocumentReceiverElement, withUser:withUser, withAll:withAll);
if (envlopeServiceResult.IsSuccess) if (envlopeServiceResult.IsSuccess)
{ {
@ -35,7 +35,7 @@ namespace EnvelopeGenerator.Web.Controllers.Test
return NotFound(); return NotFound();
} }
var result = await _service.ReadAllWithAsync(documents: withDocuments, envelopeReceivers: withEnvelopeReceivers, history: withHistory); var result = await _service.ReadAllWithAsync(documents: withDocuments, history: withHistory);
if (result.IsSuccess) if (result.IsSuccess)
{ {
return Ok(result); return Ok(result);

View File

@ -8,9 +8,7 @@
@{ @{
var envelope = Model.Envelope; var envelope = Model.Envelope;
var document = Model.Envelope?.Documents?.FirstOrDefault(); var document = Model.Envelope?.Documents?.FirstOrDefault();
var receiver = Model.Envelope?.EnvelopeReceivers?.FirstOrDefault();
var sender = Model.Envelope?.User; var sender = Model.Envelope?.User;
var receiverName = receiver?.Name ?? string.Empty;
var pages = document?.Elements?.Select(e => e.Page) ?? Array.Empty<int>(); var pages = document?.Elements?.Select(e => e.Page) ?? Array.Empty<int>();
var stPageIndexes = string.Join(pages.Count() > 1 ? ", " : "", pages.Take(pages.Count() - 1)) var stPageIndexes = string.Join(pages.Count() > 1 ? ", " : "", pages.Take(pages.Count() - 1))
+ (pages.Count() > 1 ? " und " : "") + pages.LastOrDefault(); + (pages.Count() > 1 ? " und " : "") + pages.LastOrDefault();
@ -20,7 +18,7 @@
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggleExternalContent" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggleExternalContent" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="navbar-brand me-auto ms-5 envelope-message">@($"Hallo {receiverName}, {@envelope?.Message}")</div> <div class="navbar-brand me-auto ms-5 envelope-message">@($"Hallo {Model.Name}, {@envelope?.Message}")</div>
<div class="col-1 p-0 m-0 me-3 d-flex"> <div class="col-1 p-0 m-0 me-3 d-flex">
<img src="~/img/digital_data.svg" alt="..."> <img src="~/img/digital_data.svg" alt="...">
</div> </div>
@ -37,7 +35,7 @@
<div class="card-body p-0 m-0"> <div class="card-body p-0 m-0">
<h5 class="card-title p-0 m-0">@($"{envelope?.Title}")</h5> <h5 class="card-title p-0 m-0">@($"{envelope?.Title}")</h5>
<p class="card-text p-0 m-0">@($"Sie haben {(pages.Count())} Briefe zu unterschreiben. Bitte prüfen Sie die Seiten {stPageIndexes}.")</p> <p class="card-text p-0 m-0">@($"Sie haben {(pages.Count())} Briefe zu unterschreiben. Bitte prüfen Sie die Seiten {stPageIndexes}.")</p>
<p class="card-text p-0 m-0"><small class="text-body-secondary">Erstellt am @envelope.?AddedWhen von @sender?.Prename @sender?.Name. Sie können den Absender über <a href="mailto:@(sender?.Email)?subject=@(envelope?.Title)&body=Sehr%20geehrter%20@(sender?.Prename)%20@(sender?.Name),%0A%0A%0A">@sender?.Email</a> kontaktieren.</small></p> <p class="card-text p-0 m-0"><small class="text-body-secondary">Erstellt am @envelope?.AddedWhen von @sender?.Prename @sender?.Name. Sie können den Absender über <a href="mailto:@(sender?.Email)?subject=@(envelope?.Title)&body=Sehr%20geehrter%20@(sender?.Prename)%20@(sender?.Name),%0A%0A%0A">@sender?.Email</a> kontaktieren.</small></p>
</div> </div>
</div> </div>
</div> </div>