| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | using System;using System.Linq;using System.Threading.Tasks;using Jellyfin.Data.Entities;using Jellyfin.Data.Events;using Jellyfin.Data.Queries;using MediaBrowser.Model.Activity;using MediaBrowser.Model.Querying;using Microsoft.EntityFrameworkCore;namespace Jellyfin.Server.Implementations.Activity{    /// <summary>    /// Manages the storage and retrieval of <see cref="ActivityLog"/> instances.    /// </summary>    public class ActivityManager : IActivityManager    {        private readonly IDbContextFactory<JellyfinDb> _provider;        /// <summary>        /// Initializes a new instance of the <see cref="ActivityManager"/> class.        /// </summary>        /// <param name="provider">The Jellyfin database provider.</param>        public ActivityManager(IDbContextFactory<JellyfinDb> provider)        {            _provider = provider;        }        /// <inheritdoc/>        public event EventHandler<GenericEventArgs<ActivityLogEntry>>? EntryCreated;        /// <inheritdoc/>        public async Task CreateAsync(ActivityLog entry)        {            var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);            await using (dbContext.ConfigureAwait(false))            {                dbContext.ActivityLogs.Add(entry);                await dbContext.SaveChangesAsync().ConfigureAwait(false);            }            EntryCreated?.Invoke(this, new GenericEventArgs<ActivityLogEntry>(ConvertToOldModel(entry)));        }        /// <inheritdoc/>        public async Task<QueryResult<ActivityLogEntry>> GetPagedResultAsync(ActivityLogQuery query)        {            var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);            await using (dbContext.ConfigureAwait(false))            {                IQueryable<ActivityLog> entries = dbContext.ActivityLogs                    .OrderByDescending(entry => entry.DateCreated);                if (query.MinDate.HasValue)                {                    entries = entries.Where(entry => entry.DateCreated >= query.MinDate);                }                if (query.HasUserId.HasValue)                {                    entries = entries.Where(entry => (!entry.UserId.Equals(default)) == query.HasUserId.Value);                }                return new QueryResult<ActivityLogEntry>(                    query.Skip,                    await entries.CountAsync().ConfigureAwait(false),                    await entries                        .Skip(query.Skip ?? 0)                        .Take(query.Limit ?? 100)                        .AsAsyncEnumerable()                        .Select(ConvertToOldModel)                        .ToListAsync()                        .ConfigureAwait(false));            }        }        /// <inheritdoc />        public async Task CleanAsync(DateTime startDate)        {            var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);            await using (dbContext.ConfigureAwait(false))            {                var entries = dbContext.ActivityLogs                    .Where(entry => entry.DateCreated <= startDate);                dbContext.RemoveRange(entries);                await dbContext.SaveChangesAsync().ConfigureAwait(false);            }        }        private static ActivityLogEntry ConvertToOldModel(ActivityLog entry)        {            return new ActivityLogEntry(entry.Name, entry.Type, entry.UserId)            {                Id = entry.Id,                Overview = entry.Overview,                ShortOverview = entry.ShortOverview,                ItemId = entry.ItemId,                Date = entry.DateCreated,                Severity = entry.LogSeverity            };        }    }}
 |