From 56085fde7cdc4fa757af0cdd7959506e34a7b7f0 Mon Sep 17 00:00:00 2001 From: Young-Jin Chung Date: Wed, 15 Apr 2020 14:27:57 -0700 Subject: [PATCH] HMCR-611 --- .../Mappings/EntityToModelProfile.cs | 3 +- .../Mappings/ModelToEntityProfile.cs | 1 + .../Repositories/FeebackMessageRepository.cs | 24 +++++++- .../Hangfire/Base/ReportJobServiceBase.cs | 2 + api/Hmcr.Domain/Hangfire/EmailJobService.cs | 57 +++++++++++++++++++ .../Hangfire/SkipSameJobAttribute.cs | 9 ++- api/Hmcr.Domain/Services/EmailService.cs | 49 +++++++++++----- api/Hmcr.Hangfire/Startup.cs | 2 + .../FeedbackMessageUpdateDto.cs | 16 ++++++ 9 files changed, 144 insertions(+), 19 deletions(-) create mode 100644 api/Hmcr.Domain/Hangfire/EmailJobService.cs create mode 100644 api/Hmcr.Model/Dtos/FeedbackMessage/FeedbackMessageUpdateDto.cs diff --git a/api/Hmcr.Data/Mappings/EntityToModelProfile.cs b/api/Hmcr.Data/Mappings/EntityToModelProfile.cs index 35e047f9..d54df836 100644 --- a/api/Hmcr.Data/Mappings/EntityToModelProfile.cs +++ b/api/Hmcr.Data/Mappings/EntityToModelProfile.cs @@ -109,8 +109,9 @@ public EntityToModelProfile() CreateMap(); CreateMap(); + CreateMap(); + - } } } diff --git a/api/Hmcr.Data/Mappings/ModelToEntityProfile.cs b/api/Hmcr.Data/Mappings/ModelToEntityProfile.cs index f6ff0d82..510b2d26 100644 --- a/api/Hmcr.Data/Mappings/ModelToEntityProfile.cs +++ b/api/Hmcr.Data/Mappings/ModelToEntityProfile.cs @@ -95,6 +95,7 @@ public ModelToEntityProfile() CreateMap(); CreateMap(); + CreateMap(); } } } diff --git a/api/Hmcr.Data/Repositories/FeebackMessageRepository.cs b/api/Hmcr.Data/Repositories/FeebackMessageRepository.cs index 045e72d9..a8e02825 100644 --- a/api/Hmcr.Data/Repositories/FeebackMessageRepository.cs +++ b/api/Hmcr.Data/Repositories/FeebackMessageRepository.cs @@ -2,13 +2,18 @@ using Hmcr.Data.Database.Entities; using Hmcr.Data.Repositories.Base; using Hmcr.Model.Dtos.FeedbackMessage; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace Hmcr.Data.Repositories { public interface IFeebackMessageRepository { - Task CreateFeedbackMessage(FeedbackMessageDto feedback); + Task CreateFeedbackMessageAsync(FeedbackMessageDto feedback); + Task UpdateFeedbackMessageAsync(FeedbackMessageUpdateDto feedbackMessage); + Task> GetFailedFeedbackMessagesAsync(); } public class FeebackMessageRepository : HmcrRepositoryBase, IFeebackMessageRepository { @@ -17,9 +22,24 @@ public FeebackMessageRepository(AppDbContext dbContext, IMapper mapper) { } - public async Task CreateFeedbackMessage(FeedbackMessageDto feedback) + public async Task CreateFeedbackMessageAsync(FeedbackMessageDto feedback) { return await AddAsync(feedback); } + + public async Task UpdateFeedbackMessageAsync(FeedbackMessageUpdateDto feedbackMessage) + { + var entity = await DbSet + .FirstAsync(x => x.FeedbackMessageId == feedbackMessage.FeedbackMessageId); + + Mapper.Map(feedbackMessage, entity); + } + + public async Task> GetFailedFeedbackMessagesAsync() + { + var hourAgo = DateTime.UtcNow.AddHours(-1); + + return await GetAllAsync(x => x.IsSent == false && x.CommunicationDate < hourAgo); + } } } diff --git a/api/Hmcr.Domain/Hangfire/Base/ReportJobServiceBase.cs b/api/Hmcr.Domain/Hangfire/Base/ReportJobServiceBase.cs index 953a9635..08955ca9 100644 --- a/api/Hmcr.Domain/Hangfire/Base/ReportJobServiceBase.cs +++ b/api/Hmcr.Domain/Hangfire/Base/ReportJobServiceBase.cs @@ -217,6 +217,8 @@ protected async Task CommitAndSendEmailAsync() _unitOfWork.Commit(); await _emailService.SendStatusEmailAsync(_submission.SubmissionObjectId); + + _logger.LogInformation("[Hangfire] Finishing submission {submissionObjectId}", _submission.SubmissionObjectId); } protected void LogRowParseException(decimal rowNum, string exception, ReadingContext context) diff --git a/api/Hmcr.Domain/Hangfire/EmailJobService.cs b/api/Hmcr.Domain/Hangfire/EmailJobService.cs new file mode 100644 index 00000000..51b8b816 --- /dev/null +++ b/api/Hmcr.Domain/Hangfire/EmailJobService.cs @@ -0,0 +1,57 @@ +using Hangfire; +using Hmcr.Data.Repositories; +using Hmcr.Domain.Services; +using Hmcr.Model; +using Hmcr.Model.Dtos.User; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hmcr.Domain.Hangfire +{ + public interface IEmailJobService + { + Task ResendEmails(); + } + + public class EmailJobService : IEmailJobService + { + private IFeebackMessageRepository _feedbackRepo; + private IEmailService _emailService; + private HmcrCurrentUser _user; + private ILogger _logger; + + public EmailJobService(IFeebackMessageRepository feedbackRepo, IEmailService emailService, HmcrCurrentUser user, ILogger logger) + { + _feedbackRepo = feedbackRepo; + _emailService = emailService; + _user = user; + _logger = logger; + } + + [SkipSameJob] + [AutomaticRetry(Attempts = 0)] + public async Task ResendEmails() + { + _user.AuthDirName = UserTypeDto.IDIR; + _user.UniversalId = "hangfire"; + _user.UserGuid = new Guid(); + + var feedbackMessages = await _feedbackRepo.GetFailedFeedbackMessagesAsync(); + var count = feedbackMessages.Count(); + + if (count == 0) + return; + + _logger.LogInformation($"[Hangfire] The job for resending emails is starting - {count} emails to send"); + + foreach (var feedbackMessage in feedbackMessages) + { + await _emailService.SendStatusEmailAsync(feedbackMessage.SubmissionObjectId, feedbackMessage); + } + } + } +} diff --git a/api/Hmcr.Domain/Hangfire/SkipSameJobAttribute.cs b/api/Hmcr.Domain/Hangfire/SkipSameJobAttribute.cs index 2189cfdd..88aa39e0 100644 --- a/api/Hmcr.Domain/Hangfire/SkipSameJobAttribute.cs +++ b/api/Hmcr.Domain/Hangfire/SkipSameJobAttribute.cs @@ -64,7 +64,14 @@ public void OnPerformed(PerformedContext filterContext) private string GetJobFingerprint(Job job) { - return $"{job.Type.FullName}-{job.Method.Name}-{JsonConvert.SerializeObject(job.Args)}"; + var args = ""; + + if (job.Args.Count > 0) + { + args = "-" + JsonConvert.SerializeObject(job.Args); + } + + return $"{job.Type.FullName}-{job.Method.Name}{args}"; } } } diff --git a/api/Hmcr.Domain/Services/EmailService.cs b/api/Hmcr.Domain/Services/EmailService.cs index 74d72d65..a2fa3206 100644 --- a/api/Hmcr.Domain/Services/EmailService.cs +++ b/api/Hmcr.Domain/Services/EmailService.cs @@ -17,7 +17,7 @@ namespace Hmcr.Domain.Services { public interface IEmailService { - Task SendStatusEmailAsync(decimal submissionObjectId); + Task SendStatusEmailAsync(decimal submissionObjectId, FeedbackMessageUpdateDto feedbackDto = null); } public class EmailService : IEmailService @@ -56,7 +56,7 @@ public EmailService(IConfiguration config, IUserRepository userRepo, ILogger("ResendEmails", x => x.ResendEmails(), Cron.Minutely); } } } diff --git a/api/Hmcr.Model/Dtos/FeedbackMessage/FeedbackMessageUpdateDto.cs b/api/Hmcr.Model/Dtos/FeedbackMessage/FeedbackMessageUpdateDto.cs new file mode 100644 index 00000000..06924e50 --- /dev/null +++ b/api/Hmcr.Model/Dtos/FeedbackMessage/FeedbackMessageUpdateDto.cs @@ -0,0 +1,16 @@ +using System; + +namespace Hmcr.Model.Dtos.FeedbackMessage +{ + public class FeedbackMessageUpdateDto + { + public decimal FeedbackMessageId { get; set; } + public decimal SubmissionObjectId { get; set; } + public string CommunicationSubject { get; set; } + public string CommunicationText { get; set; } + public DateTime? CommunicationDate { get; set; } + public bool? IsSent { get; set; } + public bool? IsError { get; set; } + public string SendErrorText { get; set; } + } +}