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