diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs index f57967f2..06a4ab18 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs @@ -1,6 +1,7 @@ using DigitalData.Core.DTO; using DigitalData.EmailProfilerDispatcher.Abstraction.Contracts; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly; using EnvelopeGenerator.Common; namespace EnvelopeGenerator.Application.Contracts @@ -8,6 +9,9 @@ namespace EnvelopeGenerator.Application.Contracts public interface IEnvelopeMailService : IEmailOutService { Task> SendAsync(EnvelopeReceiverDto envelopeReceiverDto, Constants.EmailTemplateType tempType); + + Task> SendAsync(EnvelopeReceiverReadOnlyDto dto); + Task> SendAccessCodeAsync(EnvelopeReceiverDto envelopeReceiverDto); } -} +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs index 46d2d8ec..fad38655 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs @@ -12,6 +12,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using static EnvelopeGenerator.Common.Constants; using EnvelopeGenerator.Extensions; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly; namespace EnvelopeGenerator.Application.Services { @@ -31,7 +32,7 @@ namespace EnvelopeGenerator.Application.Services } //TODO: create ioptions and implement TemplatePlaceHolderAttribute instead of this method - private async Task> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null) + private async Task> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null, EnvelopeReceiverReadOnlyDto? readOnlyDto = null) { Dictionary placeholders = new() { { "[NAME_PORTAL]", "signFlow" }, @@ -41,15 +42,25 @@ namespace EnvelopeGenerator.Application.Services if (accessCode is not null) placeholders["[DOCUMENT_ACCESS_CODE]"] = accessCode; - if(envelopeReceiverDto is not null && envelopeReceiverDto.Envelope is not null && envelopeReceiverDto.Receiver is not null) + if(envelopeReceiverDto?.Envelope is not null && envelopeReceiverDto.Receiver is not null) { var erId = (envelopeReceiverDto.Envelope.Uuid, envelopeReceiverDto.Receiver.Signature).EncodeEnvelopeReceiverId(); var sigHost = await _configService.ReadDefaultSignatureHost(); - var linkToDoc = $"{sigHost}/envelope/{erId}"; + var linkToDoc = $"{sigHost}/EnvelopeKey/{erId}"; placeholders["[LINK_TO_DOCUMENT]"] = linkToDoc; - placeholders["[LINK_TO_DOCUMENT_TEXT]"] = linkToDoc[..Math.Min(40, linkToDoc.Length)]; + placeholders["[LINK_TO_DOCUMENT_TEXT]"] = linkToDoc[..Math.Min(40, linkToDoc.Length)] + ".."; } + 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; + var erReadOnlyId = (readOnlyDto.Id).EncodeEnvelopeReceiverId(); + var sigHost = await _configService.ReadDefaultSignatureHost(); + var linkToDoc = $"{sigHost}/EnvelopeKey/{erReadOnlyId}"; + placeholders["[LINK_TO_DOCUMENT]"] = linkToDoc; + placeholders["[LINK_TO_DOCUMENT_TEXT]"] = linkToDoc[..Math.Min(40, linkToDoc.Length)] + ".."; + } + return placeholders; } @@ -93,8 +104,43 @@ namespace EnvelopeGenerator.Application.Services var placeholders = await CreatePlaceholders(accessCode: accessCode, envelopeReceiverDto: dto); + //TODO: remove the requirement to add the models using reflections return await CreateWithTemplateAsync(createDto: mail,placeholders: placeholders, dto, dto.Envelope.User!, dto.Envelope); } - } + + public async Task> SendAsync(EnvelopeReceiverReadOnlyDto dto) + { + var tempSerResult = await _tempService.ReadByNameAsync(Constants.EmailTemplateType.DocumentShared); + if (tempSerResult.IsFailed) + return tempSerResult.ToFail().Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"The email cannot send because '{Constants.EmailTemplateType.DocumentShared}' template cannot found."); + var temp = tempSerResult.Data; + + var mail = new EmailOutCreateDto() + { + EmailAddress = dto.ReceiverMail, + EmailSubj = temp.Subject, + EmailBody = temp.Body, + //TODO: remove int casting when all + ReferenceId = (int) dto.EnvelopeId, //REFERENCE_ID = ENVELOPE_ID + ReferenceString = dto.Envelope!.Uuid, //REFERENCE_STRING = ENVELOPE_UUID + //receiver_name = receiver.name, + //receiver_access_code = receiver.access_code, + //sender_adress = envelope.user.email, + //sender_name = envelope.user.full_name, + //envelope_title = envelope.title, + ReminderTypeId = _dConfig.ReminderTypeId, + SendingProfile = _dConfig.SendingProfile, + EntityId = null, + WfId = (int)EnvelopeStatus.EnvelopeShared, + WfReference = null, + AddedWho = _dConfig.AddedWho, + EmailAttmt1 = _dConfig.EmailAttmt1 + }; + + var placeholders = await CreatePlaceholders(readOnlyDto: dto); + + return await CreateWithTemplateAsync(createDto: mail, placeholders: placeholders, dto.Envelope); + } + } } \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 19d37916..3139f331 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -16,7 +16,6 @@ using EnvelopeGenerator.Web.Models; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using static EnvelopeGenerator.Common.Constants; -using EnvelopeGenerator.Domain.Entities; using Ganss.Xss; namespace EnvelopeGenerator.Web.Controllers diff --git a/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs b/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs index 98d4d82b..cda16e8a 100644 --- a/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs +++ b/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs @@ -5,6 +5,7 @@ using EnvelopeGenerator.Extensions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace EnvelopeGenerator.Web.Controllers { @@ -16,10 +17,13 @@ namespace EnvelopeGenerator.Web.Controllers private readonly IEnvelopeReceiverReadOnlyService _erroService; - public ReadOnlyController(ILogger logger, IEnvelopeReceiverReadOnlyService erroService) + private readonly IEnvelopeMailService _mailService; + + public ReadOnlyController(ILogger logger, IEnvelopeReceiverReadOnlyService erroService, IEnvelopeMailService mailService) { _logger = logger; _erroService = erroService; + _mailService = mailService; } [HttpGet] @@ -39,22 +43,40 @@ namespace EnvelopeGenerator.Web.Controllers 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); - }); + // create entity + var creation_res = await _erroService.CreateAsync(createDto: createDto); + + if (creation_res.IsFailed) + { + _logger.LogNotice(creation_res); + return StatusCode(StatusCodes.Status500InternalServerError); + } + + //read new entity + var read_res = await _erroService.ReadByIdAsync(creation_res.Data); + if (read_res.IsFailed) + { + _logger.LogNotice(creation_res); + return StatusCode(StatusCodes.Status500InternalServerError); + } + + var new_erro = read_res.Data; + + //send email two receiver + return await _mailService.SendAsync(new_erro).ThenAsync(Success: res => Ok(), Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); } [HttpGet("key/{readOnlyId}")] public IActionResult CreateLink(long readOnlyId) => Ok( Request.Headers["Origin"].ToString() + "/EnvelopeKey/" + readOnlyId.EncodeEnvelopeReceiverId()); - } } \ No newline at end of file