2
0

CleanupUserDataTask.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #pragma warning disable RS0030 // Do not use banned APIs
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using Jellyfin.Database.Implementations;
  8. using Jellyfin.Server.Implementations.Item;
  9. using MediaBrowser.Model.Globalization;
  10. using MediaBrowser.Model.Tasks;
  11. using Microsoft.EntityFrameworkCore;
  12. using Microsoft.Extensions.Logging;
  13. namespace Emby.Server.Implementations.ScheduledTasks.Tasks;
  14. /// <summary>
  15. /// Task to clean up any detached userdata from the database.
  16. /// </summary>
  17. public class CleanupUserDataTask : IScheduledTask
  18. {
  19. private readonly ILocalizationManager _localization;
  20. private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
  21. private readonly ILogger<CleanupUserDataTask> _logger;
  22. /// <summary>
  23. /// Initializes a new instance of the <see cref="CleanupUserDataTask"/> class.
  24. /// </summary>
  25. /// <param name="localization">The localisation Provider.</param>
  26. /// <param name="dbProvider">The DB context factory.</param>
  27. /// <param name="logger">A logger.</param>
  28. public CleanupUserDataTask(ILocalizationManager localization, IDbContextFactory<JellyfinDbContext> dbProvider, ILogger<CleanupUserDataTask> logger)
  29. {
  30. _localization = localization;
  31. _dbProvider = dbProvider;
  32. _logger = logger;
  33. }
  34. /// <inheritdoc />
  35. public string Name => _localization.GetLocalizedString("CleanupUserDataTask");
  36. /// <inheritdoc />
  37. public string Description => _localization.GetLocalizedString("CleanupUserDataTaskDescription");
  38. /// <inheritdoc />
  39. public string Category => _localization.GetLocalizedString("TasksMaintenanceCategory");
  40. /// <inheritdoc />
  41. public string Key => nameof(CleanupUserDataTask);
  42. /// <inheritdoc/>
  43. public async Task ExecuteAsync(IProgress<double> progress, CancellationToken cancellationToken)
  44. {
  45. const int LimitDays = 90;
  46. var userDataDate = DateTime.UtcNow.AddDays(LimitDays * -1);
  47. var dbContext = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
  48. await using (dbContext.ConfigureAwait(false))
  49. {
  50. var detachedUserData = dbContext.UserData.Where(e => e.ItemId == BaseItemRepository.PlaceholderId);
  51. _logger.LogInformation("There are {NoDetached} detached UserData entries.", detachedUserData.Count());
  52. detachedUserData = detachedUserData.Where(e => e.RetentionDate < userDataDate);
  53. _logger.LogInformation("{NoDetached} are older then {Limit} days.", detachedUserData.Count(), LimitDays);
  54. await detachedUserData.ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
  55. }
  56. progress.Report(100);
  57. }
  58. /// <inheritdoc/>
  59. public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
  60. {
  61. yield break;
  62. }
  63. }