Add project files.
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
using CalendarReminder.Api.Data;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace CalendarReminder.Api.Services;
|
||||
|
||||
public class ReminderNotificationService : BackgroundService
|
||||
{
|
||||
private readonly IServiceScopeFactory _scopeFactory;
|
||||
private readonly ILogger<ReminderNotificationService> _logger;
|
||||
|
||||
public ReminderNotificationService(IServiceScopeFactory scopeFactory,
|
||||
ILogger<ReminderNotificationService> 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<AppDbContext>();
|
||||
var emailService = scope.ServiceProvider.GetRequiredService<EmailService>();
|
||||
|
||||
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 = $"""
|
||||
<h2>⏰ Pripomienka: {reminder.Title}</h2>
|
||||
<p><strong>Čas:</strong> {reminder.ReminderDate:dd.MM.yyyy HH:mm}</p>
|
||||
<p><strong>O:</strong> {minutesLeft} minút</p>
|
||||
{(reminder.Description != null ? $"<p><strong>Popis:</strong> {reminder.Description}</p>" : "")}
|
||||
<hr>
|
||||
<small>CalendarReminder</small>
|
||||
""";
|
||||
|
||||
await emailService.SendAsync(
|
||||
reminder.User!.Email,
|
||||
reminder.User.Username,
|
||||
$"⏰ Pripomienka: {reminder.Title}",
|
||||
body);
|
||||
|
||||
reminder.NotificationSent = true;
|
||||
}
|
||||
|
||||
if (upcoming.Count > 0)
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user