📄
MatDenDagen/Services/NotificationBackgroundService.cs
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
using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace MatDenDagen.Services; public sealed class NotificationBackgroundService( IServiceProvider serviceProvider, ILogger<NotificationBackgroundService> logger, IOptions<NotificationServiceOptions> options ) : BackgroundService { private readonly TimeSpan checkInterval = options.Value.CheckInterval; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { logger.LogInformation( "Notification background service started with {Interval} minute interval", checkInterval.TotalMinutes ); using var timer = new PeriodicTimer(checkInterval); try { DateTimeOffset? lastCheck = null; do { lastCheck = await ExecuteNotificationCheckAsync(lastCheck, stoppingToken); } while (await timer.WaitForNextTickAsync(stoppingToken)); } catch (OperationCanceledException) { logger.LogInformation("Notification background service is stopping"); } catch (Exception ex) { logger.LogError(ex, "Notification background service failed"); } } private async Task<DateTimeOffset?> ExecuteNotificationCheckAsync( DateTimeOffset? lastCheck, CancellationToken cancellationToken ) { try { using var scope = serviceProvider.CreateScope(); var notificationService = scope.ServiceProvider.GetRequiredService<NotificationService>(); return await notificationService.CheckAndSendNotificationsAsync(lastCheck, cancellationToken); } catch (Exception ex) { logger.LogError(ex, "Error during notification check"); return null; } } }