using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using av_motion_api.Data; // Adjust the namespace to match your project
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Microsoft.Data.SqlClient;
using av_motion_api.Models;
namespace av_motion_api.Services
{
public class OrderStatusUpdater : IHostedService, IDisposable
{
private Timer _timer;
private readonly IServiceProvider _serviceProvider;
private readonly IOptionsMonitor<OverdueSettings> _settings;
public OrderStatusUpdater(IServiceProvider serviceProvider, IOptionsMonitor<OverdueSettings> settings)
{
_serviceProvider = serviceProvider;
_settings = settings;
}
public Task StartAsync(CancellationToken cancellationToken)
{
ScheduleOrderStatusUpdate();
_settings.OnChange(settings => ScheduleOrderStatusUpdate());
return Task.CompletedTask;
}
private void ScheduleOrderStatusUpdate()
{
var overdueTimeValue = _settings.CurrentValue.OverdueTimeValue;
var overdueTimeUnit = _settings.CurrentValue.OverdueTimeUnit;
if (string.IsNullOrEmpty(overdueTimeUnit))
{
// Log error or warning here
Console.WriteLine("OverdueTimeUnit is null or empty.");
}
var interval = GetTimeSpan(overdueTimeValue, overdueTimeUnit);
_timer?.Dispose();
_timer = new Timer(UpdateOrderStatuses, null, TimeSpan.Zero, interval);
}
private void UpdateOrderStatuses(object state)
{
using (var scope = _serviceProvider.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Calculate the overdue threshold time
var overdueThreshold = DateTime.UtcNow.Subtract(GetTimeSpan(_settings.CurrentValue.OverdueTimeValue, _settings.CurrentValue.OverdueTimeUnit));
var connection = context.Database.GetDbConnection();
if (connection.State != System.Data.ConnectionState.Open)
{
connection.Open();
}
using (var command = connection.CreateCommand())
{
command.CommandText = "UpdateOrderStatuses";
command.CommandType = System.Data.CommandType.StoredProcedure;
// Add the required parameters
command.Parameters.Add(new SqlParameter("@OverdueTimeValue", _settings.CurrentValue.OverdueTimeValue));
command.Parameters.Add(new SqlParameter("@OverdueTimeUnit", _settings.CurrentValue.OverdueTimeUnit));
// Execute the stored procedure
command.ExecuteNonQuery();
}
}
}
private TimeSpan GetTimeSpan(int value, string unit)
{
if (string.IsNullOrEmpty(unit))
{
throw new ArgumentNullException(nameof(unit), "Unit cannot be null or empty.");
}
return unit.ToLower() switch
{
"minutes" => TimeSpan.FromMinutes(value),
"hours" => TimeSpan.FromHours(value),
"days" => TimeSpan.FromDays(value),
"weeks" => TimeSpan.FromDays(value * 7),
"months" => TimeSpan.FromDays(value * 30), // Approximation
"years" => TimeSpan.FromDays(value * 365), // Approximation
_ => TimeSpan.FromMinutes(value),
};
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter