Repository navigation
Expand file tree
/
Copy pathReminderService.cs
More file actions
66 lines (59 loc) · 2.41 KB
/
Copy pathReminderService.cs
File metadata and controls
66 lines (59 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System.Globalization;
using System.Runtime.InteropServices;
namespace SchoolHelpdesk;
public class ReminderService(ILogger<ReminderService> logger) : BackgroundService
{
private readonly TimeZoneInfo ukTimeZone = TimeZoneInfo.FindSystemTimeZoneById(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "GMT Standard Time" : "Europe/London");
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var utcNow = DateTime.UtcNow;
var ukNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, ukTimeZone);
var ukNext = new DateTime(ukNow.Year, ukNow.Month, ukNow.Day, 7, 30, 0);
if (ukNow >= ukNext) ukNext = ukNext.AddDays(1);
if (ukNext.DayOfWeek == DayOfWeek.Saturday) ukNext = ukNext.AddDays(2);
else if (ukNext.DayOfWeek == DayOfWeek.Sunday) ukNext = ukNext.AddDays(1);
var utcNext = TimeZoneInfo.ConvertTimeToUtc(ukNext, ukTimeZone);
var delay = utcNext - utcNow;
if (delay < TimeSpan.Zero) delay = TimeSpan.Zero;
await Task.Delay(delay, stoppingToken);
var today = DateOnly.FromDateTime(DateTime.UtcNow);
if (School.Instance.Holidays.Any(h => h.Start <= today && h.End >= today))
{
logger.LogInformation("Today is a holiday, skipping reminders");
continue;
}
try
{
await SendRemindersAsync();
logger.LogInformation("Sent reminder emails");
}
catch (Exception ex)
{
logger.LogError(ex, "Error sending reminder emails");
}
try
{
await QueueService.ProcessPendingEmailsAsync();
logger.LogInformation("Processed pending emails from queue");
}
catch (Exception ex)
{
logger.LogError(ex, "Error processing pending emails from queue");
}
}
}
private static async Task SendRemindersAsync()
{
var allTickets = await TableService.GetAllTicketsAsync();
var now = DateTime.UtcNow;
var openTickets = allTickets.Where(t => !t.IsClosed && (t.WaitingSince is null || now - t.WaitingSince > TimeSpan.FromHours(16)));
foreach (var ticket in openTickets)
{
var id = int.Parse(ticket.RowKey, CultureInfo.InvariantCulture);
if (!School.Instance.StaffByEmail.TryGetValue(ticket.PartitionKey, out var staff)) continue;
await EmailService.SendTicketUpdateEmailAsync(id, ticket, staff, TicketUpdateAction.Reminder);
}
}
}