aboutsummaryrefslogtreecommitdiffstats
path: root/src/BackgroundServices/AssetsCleanupBackgroundService.cs
blob: effb5d7785c9ae62e565e74a9111f08c1d318d15 (plain) (blame)
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
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using VSH.Services;

namespace VSH.BackgroundServices;

/// <summary>
/// This service is not really necessary, but it is nice to have for future reference.
/// The job that this service is doing, could maybe become an http endpoint?
/// </summary>
public class AssetsCleanupBackgroundService : BackgroundService
{
	private readonly IServiceProvider _serviceProvider;
	private readonly ILogger<AssetsCleanupBackgroundService> _logger;

	private static TimeSpan CleanupInterval => TimeSpan.FromSeconds(10);

	public AssetsCleanupBackgroundService(
			IServiceProvider serviceProvider,
			ILogger<AssetsCleanupBackgroundService> logger
	) {
		_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
		_logger = logger;
	}

	protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
		await StartInternalAsync(stoppingToken);
	}

	private async Task StartInternalAsync(CancellationToken cancellationToken) {
		while (true) {
			if (cancellationToken.IsCancellationRequested) {
				_logger.LogDebug("CancellationRequested... Exiting");
				break;
			}

			try {
				await Task.Delay(CleanupInterval, cancellationToken);
			} catch (TaskCanceledException) {
				_logger.LogDebug("TaskCanceledException... Exiting");
				break;
			} catch (Exception ex) {
				_logger.LogError($"Task.Delay exception: {ex.Message}. Exiting.");
				break;
			}

			if (cancellationToken.IsCancellationRequested) {
				_logger.LogDebug("CancellationRequested... Exiting");
				break;
			}

			using var serviceProvider = _serviceProvider.CreateScope();
			var assetsService = serviceProvider.ServiceProvider.GetRequiredService<AssetsService>();
			await assetsService.RemoveUnusedProductImages();
		}
	}
}