Skip to content

Commit f8e4eed

Browse files
authored
Merge pull request #408 from bcgov/1.2
Version 1.2
2 parents 59b5eb1 + 697a9d6 commit f8e4eed

File tree

9 files changed

+144
-19
lines changed

9 files changed

+144
-19
lines changed

api/Hmcr.Data/Mappings/EntityToModelProfile.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,9 @@ public EntityToModelProfile()
109109
CreateMap<HmrCodeLookup, CodeLookupDto>();
110110

111111
CreateMap<HmrFeedbackMessage, FeedbackMessageDto>();
112+
CreateMap<HmrFeedbackMessage, FeedbackMessageUpdateDto>();
113+
112114

113-
114115
}
115116
}
116117
}

api/Hmcr.Data/Mappings/ModelToEntityProfile.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public ModelToEntityProfile()
9595
CreateMap<CodeLookupDto, HmrCodeLookup>();
9696

9797
CreateMap<FeedbackMessageDto, HmrFeedbackMessage>();
98+
CreateMap<FeedbackMessageUpdateDto, HmrFeedbackMessage>();
9899
}
99100
}
100101
}

api/Hmcr.Data/Repositories/FeebackMessageRepository.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22
using Hmcr.Data.Database.Entities;
33
using Hmcr.Data.Repositories.Base;
44
using Hmcr.Model.Dtos.FeedbackMessage;
5+
using Microsoft.EntityFrameworkCore;
6+
using System;
7+
using System.Collections.Generic;
58
using System.Threading.Tasks;
69

710
namespace Hmcr.Data.Repositories
811
{
912
public interface IFeebackMessageRepository
1013
{
11-
Task<HmrFeedbackMessage> CreateFeedbackMessage(FeedbackMessageDto feedback);
14+
Task<HmrFeedbackMessage> CreateFeedbackMessageAsync(FeedbackMessageDto feedback);
15+
Task UpdateFeedbackMessageAsync(FeedbackMessageUpdateDto feedbackMessage);
16+
Task<IEnumerable<FeedbackMessageUpdateDto>> GetFailedFeedbackMessagesAsync();
1217
}
1318
public class FeebackMessageRepository : HmcrRepositoryBase<HmrFeedbackMessage>, IFeebackMessageRepository
1419
{
@@ -17,9 +22,24 @@ public FeebackMessageRepository(AppDbContext dbContext, IMapper mapper)
1722
{
1823
}
1924

20-
public async Task<HmrFeedbackMessage> CreateFeedbackMessage(FeedbackMessageDto feedback)
25+
public async Task<HmrFeedbackMessage> CreateFeedbackMessageAsync(FeedbackMessageDto feedback)
2126
{
2227
return await AddAsync(feedback);
2328
}
29+
30+
public async Task UpdateFeedbackMessageAsync(FeedbackMessageUpdateDto feedbackMessage)
31+
{
32+
var entity = await DbSet
33+
.FirstAsync(x => x.FeedbackMessageId == feedbackMessage.FeedbackMessageId);
34+
35+
Mapper.Map(feedbackMessage, entity);
36+
}
37+
38+
public async Task<IEnumerable<FeedbackMessageUpdateDto>> GetFailedFeedbackMessagesAsync()
39+
{
40+
var hourAgo = DateTime.UtcNow.AddHours(-1);
41+
42+
return await GetAllAsync<FeedbackMessageUpdateDto>(x => x.IsSent == false && x.CommunicationDate < hourAgo);
43+
}
2444
}
2545
}

api/Hmcr.Domain/Hangfire/Base/ReportJobServiceBase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ protected async Task CommitAndSendEmailAsync()
217217
_unitOfWork.Commit();
218218

219219
await _emailService.SendStatusEmailAsync(_submission.SubmissionObjectId);
220+
221+
_logger.LogInformation("[Hangfire] Finishing submission {submissionObjectId}", _submission.SubmissionObjectId);
220222
}
221223

222224
protected void LogRowParseException(decimal rowNum, string exception, ReadingContext context)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using Hangfire;
2+
using Hmcr.Data.Repositories;
3+
using Hmcr.Domain.Services;
4+
using Hmcr.Model;
5+
using Hmcr.Model.Dtos.User;
6+
using Microsoft.Extensions.Logging;
7+
using System;
8+
using System.Collections.Generic;
9+
using System.Linq;
10+
using System.Text;
11+
using System.Threading.Tasks;
12+
13+
namespace Hmcr.Domain.Hangfire
14+
{
15+
public interface IEmailJobService
16+
{
17+
Task ResendEmails();
18+
}
19+
20+
public class EmailJobService : IEmailJobService
21+
{
22+
private IFeebackMessageRepository _feedbackRepo;
23+
private IEmailService _emailService;
24+
private HmcrCurrentUser _user;
25+
private ILogger<EmailJobService> _logger;
26+
27+
public EmailJobService(IFeebackMessageRepository feedbackRepo, IEmailService emailService, HmcrCurrentUser user, ILogger<EmailJobService> logger)
28+
{
29+
_feedbackRepo = feedbackRepo;
30+
_emailService = emailService;
31+
_user = user;
32+
_logger = logger;
33+
}
34+
35+
[SkipSameJob]
36+
[AutomaticRetry(Attempts = 0)]
37+
public async Task ResendEmails()
38+
{
39+
_user.AuthDirName = UserTypeDto.IDIR;
40+
_user.UniversalId = "hangfire";
41+
_user.UserGuid = new Guid();
42+
43+
var feedbackMessages = await _feedbackRepo.GetFailedFeedbackMessagesAsync();
44+
var count = feedbackMessages.Count();
45+
46+
if (count == 0)
47+
return;
48+
49+
_logger.LogInformation($"[Hangfire] The job for resending emails is starting - {count} emails to send");
50+
51+
foreach (var feedbackMessage in feedbackMessages)
52+
{
53+
await _emailService.SendStatusEmailAsync(feedbackMessage.SubmissionObjectId, feedbackMessage);
54+
}
55+
}
56+
}
57+
}

api/Hmcr.Domain/Hangfire/SkipSameJobAttribute.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,14 @@ public void OnPerformed(PerformedContext filterContext)
6464

6565
private string GetJobFingerprint(Job job)
6666
{
67-
return $"{job.Type.FullName}-{job.Method.Name}-{JsonConvert.SerializeObject(job.Args)}";
67+
var args = "";
68+
69+
if (job.Args.Count > 0)
70+
{
71+
args = "-" + JsonConvert.SerializeObject(job.Args);
72+
}
73+
74+
return $"{job.Type.FullName}-{job.Method.Name}{args}";
6875
}
6976
}
7077
}

api/Hmcr.Domain/Services/EmailService.cs

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace Hmcr.Domain.Services
1717
{
1818
public interface IEmailService
1919
{
20-
Task SendStatusEmailAsync(decimal submissionObjectId);
20+
Task SendStatusEmailAsync(decimal submissionObjectId, FeedbackMessageUpdateDto feedbackDto = null);
2121
}
2222

2323
public class EmailService : IEmailService
@@ -56,7 +56,7 @@ public EmailService(IConfiguration config, IUserRepository userRepo, ILogger<Ema
5656
_unitOfWork = unitOfWork;
5757
}
5858

59-
public async Task SendStatusEmailAsync(decimal submissionObjectId)
59+
public async Task SendStatusEmailAsync(decimal submissionObjectId, FeedbackMessageUpdateDto feedbackMessage = null)
6060
{
6161
var submissionInfo = await _submissionRepo.GetSubmissionInfoForEmailAsync(submissionObjectId);
6262
submissionInfo.SubmissionDate = DateUtils.ConvertUtcToPacificTime(submissionInfo.SubmissionDate);
@@ -77,7 +77,7 @@ public async Task SendStatusEmailAsync(decimal submissionObjectId)
7777
var textBody = htmlBody.HtmlToPlainText();
7878

7979
var isSent = true;
80-
var isError = false;
80+
var isError = !submissionInfo.Success;
8181
var errorText = "";
8282

8383
try
@@ -87,27 +87,46 @@ public async Task SendStatusEmailAsync(decimal submissionObjectId)
8787
catch (Exception ex)
8888
{
8989
isSent = false;
90-
isError = true;
9190
errorText = ex.Message;
9291

92+
_logger.LogError($"Email for the submission {submissionObjectId} failed.");
9393
_logger.LogError(ex.ToString());
9494
}
9595

96-
var feedback = new FeedbackMessageDto
96+
if (feedbackMessage == null)
9797
{
98-
SubmissionObjectId = submissionObjectId,
99-
CommunicationSubject = subject,
100-
CommunicationText = htmlBody,
101-
CommunicationDate = DateTime.UtcNow,
102-
IsSent = isSent,
103-
IsError = isError,
104-
SendErrorText = errorText
105-
};
98+
var feedback = new FeedbackMessageDto
99+
{
100+
SubmissionObjectId = submissionObjectId,
101+
CommunicationSubject = subject,
102+
CommunicationText = htmlBody,
103+
CommunicationDate = DateTime.UtcNow,
104+
IsSent = isSent,
105+
IsError = isError,
106+
SendErrorText = errorText
107+
};
108+
109+
await _feedbackRepo.CreateFeedbackMessageAsync(feedback);
110+
}
111+
else
112+
{
113+
feedbackMessage.SubmissionObjectId = submissionObjectId;
114+
feedbackMessage.CommunicationSubject = subject;
115+
feedbackMessage.CommunicationText = htmlBody;
116+
feedbackMessage.CommunicationDate = DateTime.UtcNow;
117+
feedbackMessage.IsSent = isSent;
118+
feedbackMessage.IsError = isError;
119+
feedbackMessage.SendErrorText = errorText;
120+
121+
await _feedbackRepo.UpdateFeedbackMessageAsync(feedbackMessage);
122+
}
106123

107-
await _feedbackRepo.CreateFeedbackMessage(feedback);
108124
await _unitOfWork.CommitAsync();
109125

110-
_logger.LogInformation("[Hangfire] Finishing submission {submissionObjectId}", submissionObjectId);
126+
var finished = isSent ? "Finished" : "Failed";
127+
var sending = feedbackMessage == null ? "sending" : "resending";
128+
129+
_logger.LogInformation($"[Hangfire] {finished} {sending} email for submission {submissionObjectId}", submissionObjectId);
111130
}
112131

113132
private void SendEmailToUsersInServiceArea(decimal serviceAreaNumber, string subject, string htmlBody, string textBody)

api/Hmcr.Hangfire/Startup.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ISubmiss
6666

6767
//Inject Code Lookup
6868
validator.CodeLookup = codeLookupRepo.LoadCodeLookupCache();
69+
70+
RecurringJob.AddOrUpdate<EmailJobService>("ResendEmails", x => x.ResendEmails(), Cron.Minutely);
6971
}
7072
}
7173
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
3+
namespace Hmcr.Model.Dtos.FeedbackMessage
4+
{
5+
public class FeedbackMessageUpdateDto
6+
{
7+
public decimal FeedbackMessageId { get; set; }
8+
public decimal SubmissionObjectId { get; set; }
9+
public string CommunicationSubject { get; set; }
10+
public string CommunicationText { get; set; }
11+
public DateTime? CommunicationDate { get; set; }
12+
public bool? IsSent { get; set; }
13+
public bool? IsError { get; set; }
14+
public string SendErrorText { get; set; }
15+
}
16+
}

0 commit comments

Comments
 (0)