using CalendarReminder.Api.Data; using Microsoft.EntityFrameworkCore; namespace CalendarReminder.Api.Services; public class ReminderNotificationService : BackgroundService { private readonly IServiceScopeFactory _scopeFactory; private readonly ILogger _logger; public ReminderNotificationService(IServiceScopeFactory scopeFactory, ILogger logger) { _scopeFactory = scopeFactory; _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Notification service spustený"); while (!stoppingToken.IsCancellationRequested) { await CheckRemindersAsync(); await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken); } } private async Task CheckRemindersAsync() { using var scope = _scopeFactory.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); var emailService = scope.ServiceProvider.GetRequiredService(); var now = DateTime.UtcNow; var windowEnd = now.AddMinutes(15); // Nájdi remindery, ktoré sú do 15 minút a notifikácia ešte nebola odoslaná var upcoming = await db.Reminders .Include(r => r.User) .Where(r => !r.IsCompleted && !r.NotificationSent && r.ReminderDate >= now && r.ReminderDate <= windowEnd) .ToListAsync(); foreach (var reminder in upcoming) { var minutesLeft = (int)(reminder.ReminderDate - now).TotalMinutes; var body = $"""

⏰ Pripomienka: {reminder.Title}

Čas: {reminder.ReminderDate:dd.MM.yyyy HH:mm}

O: {minutesLeft} minút

{(reminder.Description != null ? $"

Popis: {reminder.Description}

" : "")}
CalendarReminder """; await emailService.SendAsync( reminder.User!.Email, reminder.User.Username, $"⏰ Pripomienka: {reminder.Title}", body); reminder.NotificationSent = true; } if (upcoming.Count > 0) await db.SaveChangesAsync(); } }