From c1bce7c63912f160747b047d2956994e1310b5ce Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 12 May 2025 09:38:29 +0200 Subject: [PATCH] Refactor receiver methods for async support Updated repository and service interfaces to use async methods for retrieving receiver information. Changed method signatures to include optional parameters for `id` and `signature`, and made existing parameters nullable. Adjusted related service and controller implementations to ensure consistent usage of the new async methods. Improved error handling in the repository to enforce parameter requirements. Updated using directives in the repository for necessary dependencies. --- .../IEnvelopeReceiverRepository.cs | 2 +- .../Services/IEnvelopeReceiverService.cs | 2 +- .../Services/EnvelopeMailService.cs | 2 +- .../Services/EnvelopeReceiverService.cs | 4 +-- .../Controllers/EnvelopeReceiverController.cs | 10 ++++---- .../Repositories/EnvlopeReceiverRepository.cs | 25 +++++++++++++++++-- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs b/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs index e8cf1659..d4aff70c 100644 --- a/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs +++ b/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs @@ -21,5 +21,5 @@ public interface IEnvelopeReceiverRepository : ICRUDRepository> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); - Task ReadLastByReceiver(string email); + Task ReadLastByReceiverAsync(string? email = null, int? id = null, string? signature = null); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Contracts/Services/IEnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Contracts/Services/IEnvelopeReceiverService.cs index 98a05635..01075025 100644 --- a/EnvelopeGenerator.Application/Contracts/Services/IEnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/Services/IEnvelopeReceiverService.cs @@ -35,7 +35,7 @@ public interface IEnvelopeReceiverService : IBasicCRUDService>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, EnvelopeQuery? envelopeQuery = null, ReadReceiverQuery? receiverQuery = null, params int[] ignore_statuses); - Task> ReadLastUsedReceiverNameByMail(string mail); + Task> ReadLastUsedReceiverNameByMailAsync(string? mail = null, int? id = null, string? signature = null); Task> SendSmsAsync(string envelopeReceiverId, string message); Task>> ReadWithSecretByUuidAsync(string uuid); diff --git a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs index 203d4a9c..d5e623bb 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs @@ -57,7 +57,7 @@ namespace EnvelopeGenerator.Application.Services { if (readOnlyDto?.Envelope is not null && readOnlyDto.Receiver is not null) { - _placeholders["[NAME_RECEIVER]"] = await _envRcvService.ReadLastUsedReceiverNameByMail(readOnlyDto.AddedWho).ThenAsync(res => res, (msg, ntc) => string.Empty) ?? string.Empty; + _placeholders["[NAME_RECEIVER]"] = await _envRcvService.ReadLastUsedReceiverNameByMailAsync(readOnlyDto.AddedWho).ThenAsync(res => res, (msg, ntc) => string.Empty) ?? string.Empty; var erReadOnlyId = (readOnlyDto.Id).EncodeEnvelopeReceiverId(); var sigHost = await _configService.ReadDefaultSignatureHost(); var linkToDoc = $"{sigHost}/EnvelopeKey/{erReadOnlyId}"; diff --git a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs index dcde6d75..54e7e79a 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs @@ -162,9 +162,9 @@ public class EnvelopeReceiverService : BasicCRUDService> ReadLastUsedReceiverNameByMail(string mail) + public async Task> ReadLastUsedReceiverNameByMailAsync(string? mail = null, int? id = null, string? signature = null) { - var er = await _repository.ReadLastByReceiver(mail); + var er = await _repository.ReadLastByReceiverAsync(mail, id, signature); return er is null ? Result.Fail().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name); } diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 2fa2245b..59537342 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -112,7 +112,7 @@ public class EnvelopeReceiverController : ControllerBase /// /// Ruft den Namen des zuletzt verwendeten Empfängers basierend auf der angegebenen E-Mail-Adresse ab. /// - /// Die Abfrage, die die E-Mail-Adresse des Empfängers enthält. + /// Abfrage, bei der nur eine der Angaben ID, Signatur oder E-Mail-Adresse des Empfängers eingegeben werden muss. /// Eine HTTP-Antwort mit dem Namen des Empfängers oder einem Fehlerstatus. /// /// Dieser Endpunkt ermöglicht es, den Namen des zuletzt verwendeten Empfängers basierend auf der E-Mail-Adresse abzurufen. @@ -123,13 +123,13 @@ public class EnvelopeReceiverController : ControllerBase /// Ein unerwarteter Fehler ist aufgetreten. [Authorize] [HttpGet("salute")] - public async Task GetReceiverName([FromQuery] ReadReceiverNameQuery receiverName) + public async Task GetReceiverName([FromQuery] ReadReceiverNameQuery receiver) { - if (receiverName.EmailAddress is null) + if (receiver.EmailAddress is null) return BadRequest(); - return await _erService.ReadLastUsedReceiverNameByMail(receiverName.EmailAddress).ThenAsync( - Success: res => res is null ? Ok(string.Empty) : Ok(res), + return await _erService.ReadLastUsedReceiverNameByMailAsync(receiver.EmailAddress, receiver.Id, receiver.Signature).ThenAsync( + Success: res => res is null ? NotFound() : Ok(res), Fail: IActionResult (msg, ntc) => { if (ntc.HasFlag(Flag.NotFound)) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs index b96f073d..85d29c88 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs @@ -2,6 +2,9 @@ using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Application.Contracts.Repositories; using Microsoft.EntityFrameworkCore; +using Microsoft.AspNetCore.Http.HttpResults; +using EnvelopeGenerator.Application.Exceptions; +using EnvelopeGenerator.Common.My.Resources; namespace EnvelopeGenerator.Infrastructure.Repositories; @@ -93,8 +96,26 @@ public class EnvelopeReceiverRepository : CRUDRepository er.Envelope).Include(er => er.Receiver).ToListAsync(); } - public async Task ReadLastByReceiver(string email) + public async Task ReadLastByReceiverAsync(string? email = null, int? id = null, string? signature = null) { - return await _dbSet.Where(er => er.Receiver!.EmailAddress == email).OrderBy(er => er.EnvelopeId).LastOrDefaultAsync(); + var parameters = new[] { email, id?.ToString(), signature }.Count(p => p != null); + + if (parameters == 0) + throw new BadRequestException("You must provide either 'email', 'id', or 'signature' for the query."); + if (parameters > 1) + throw new BadRequestException("Please provide only one parameter: either 'email', 'id', or 'signature'."); + + var query = _dbSet.AsNoTracking(); + + if(email is not null) + query = query.Where(er => er.Receiver!.EmailAddress == email); + + if (id is not null) + query = query.Where(er => er.Receiver!.Id == id); + + if (signature is not null) + query = query.Where(er => er.Receiver!.Signature == signature); + + return await query.OrderBy(er => er.EnvelopeId).LastOrDefaultAsync(); } } \ No newline at end of file