< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.ScheduledTasks.Tasks.CleanupUserDataTask
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/ScheduledTasks/Tasks/CleanupUserDataTask.cs
Line coverage
50%
Covered lines: 4
Uncovered lines: 4
Coverable lines: 8
Total lines: 77
Line coverage: 50%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Name()100%210%
get_Description()100%210%
get_Category()100%210%
get_Key()100%210%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/ScheduledTasks/Tasks/CleanupUserDataTask.cs

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