Browse Source

Rewrite activity log backend to use a query class.

Patrick Barron 4 years ago
parent
commit
4d7e7d6331

+ 10 - 10
Jellyfin.Api/Controllers/ActivityLogController.cs

@@ -1,7 +1,7 @@
 using System;
 using System;
-using System.Linq;
+using System.Threading.Tasks;
 using Jellyfin.Api.Constants;
 using Jellyfin.Api.Constants;
-using Jellyfin.Data.Entities;
+using Jellyfin.Data.Queries;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Authorization;
@@ -39,19 +39,19 @@ namespace Jellyfin.Api.Controllers
         /// <returns>A <see cref="QueryResult{ActivityLogEntry}"/> containing the log entries.</returns>
         /// <returns>A <see cref="QueryResult{ActivityLogEntry}"/> containing the log entries.</returns>
         [HttpGet("Entries")]
         [HttpGet("Entries")]
         [ProducesResponseType(StatusCodes.Status200OK)]
         [ProducesResponseType(StatusCodes.Status200OK)]
-        public ActionResult<QueryResult<ActivityLogEntry>> GetLogEntries(
+        public async Task<ActionResult<QueryResult<ActivityLogEntry>>> GetLogEntries(
             [FromQuery] int? startIndex,
             [FromQuery] int? startIndex,
             [FromQuery] int? limit,
             [FromQuery] int? limit,
             [FromQuery] DateTime? minDate,
             [FromQuery] DateTime? minDate,
             [FromQuery] bool? hasUserId)
             [FromQuery] bool? hasUserId)
         {
         {
-            var filterFunc = new Func<IQueryable<ActivityLog>, IQueryable<ActivityLog>>(
-                entries => entries.Where(entry => entry.DateCreated >= minDate
-                                                  && (!hasUserId.HasValue || (hasUserId.Value
-                                                      ? entry.UserId != Guid.Empty
-                                                      : entry.UserId == Guid.Empty))));
-
-            return _activityManager.GetPagedResult(filterFunc, startIndex, limit);
+            return await _activityManager.GetPagedResultAsync(new ActivityLogQuery
+            {
+                StartIndex = startIndex,
+                Limit = limit,
+                MinDate = minDate,
+                HasUserId = hasUserId
+            }).ConfigureAwait(false);
         }
         }
     }
     }
 }
 }

+ 30 - 0
Jellyfin.Data/Queries/ActivityLogQuery.cs

@@ -0,0 +1,30 @@
+using System;
+
+namespace Jellyfin.Data.Queries
+{
+    /// <summary>
+    /// A class representing a query to the activity logs.
+    /// </summary>
+    public class ActivityLogQuery
+    {
+        /// <summary>
+        /// Gets or sets the index to start at.
+        /// </summary>
+        public int? StartIndex { get; set; }
+
+        /// <summary>
+        /// Gets or sets the maximum number of items to include.
+        /// </summary>
+        public int? Limit { get; set; }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether to take entries with a user id.
+        /// </summary>
+        public bool? HasUserId { get; set; }
+
+        /// <summary>
+        /// Gets or sets the minimum date to query for.
+        /// </summary>
+        public DateTime? MinDate { get; set; }
+    }
+}

+ 16 - 21
Jellyfin.Server.Implementations/Activity/ActivityManager.cs

@@ -3,8 +3,10 @@ using System.Linq;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Events;
 using Jellyfin.Data.Events;
+using Jellyfin.Data.Queries;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
+using Microsoft.EntityFrameworkCore;
 
 
 namespace Jellyfin.Server.Implementations.Activity
 namespace Jellyfin.Server.Implementations.Activity
 {
 {
@@ -39,41 +41,34 @@ namespace Jellyfin.Server.Implementations.Activity
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
-        public QueryResult<ActivityLogEntry> GetPagedResult(
-            Func<IQueryable<ActivityLog>, IQueryable<ActivityLog>> func,
-            int? startIndex,
-            int? limit)
+        public async Task<QueryResult<ActivityLogEntry>> GetPagedResultAsync(ActivityLogQuery query)
         {
         {
-            using var dbContext = _provider.CreateContext();
+            await using var dbContext = _provider.CreateContext();
 
 
-            var query = func(dbContext.ActivityLogs.OrderByDescending(entry => entry.DateCreated));
+            IQueryable<ActivityLog> entries = dbContext.ActivityLogs.OrderByDescending(entry => entry.DateCreated);
 
 
-            if (startIndex.HasValue)
+            if (query.MinDate.HasValue)
             {
             {
-                query = query.Skip(startIndex.Value);
+                entries = entries.Where(entry => entry.DateCreated >= query.MinDate);
             }
             }
 
 
-            if (limit.HasValue)
+            if (query.HasUserId.HasValue)
             {
             {
-                query = query.Take(limit.Value);
+                entries = entries.Where(entry => entry.UserId != Guid.Empty == query.HasUserId.Value );
             }
             }
 
 
-            // This converts the objects from the new database model to the old for compatibility with the existing API.
-            var list = query.Select(ConvertToOldModel).ToList();
-
             return new QueryResult<ActivityLogEntry>
             return new QueryResult<ActivityLogEntry>
             {
             {
-                Items = list,
-                TotalRecordCount = func(dbContext.ActivityLogs).Count()
+                Items = await entries.Skip(query.StartIndex ?? 0)
+                    .Take(query.Limit ?? 100)
+                    .Select(ConvertToOldModel)
+                    .AsQueryable()
+                    .ToListAsync()
+                    .ConfigureAwait(false),
+                TotalRecordCount = await entries.CountAsync().ConfigureAwait(false)
             };
             };
         }
         }
 
 
-        /// <inheritdoc/>
-        public QueryResult<ActivityLogEntry> GetPagedResult(int? startIndex, int? limit)
-        {
-            return GetPagedResult(logs => logs, startIndex, limit);
-        }
-
         private static ActivityLogEntry ConvertToOldModel(ActivityLog entry)
         private static ActivityLogEntry ConvertToOldModel(ActivityLog entry)
         {
         {
             return new ActivityLogEntry
             return new ActivityLogEntry

+ 2 - 7
MediaBrowser.Model/Activity/IActivityManager.cs

@@ -1,10 +1,10 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
 
 
 using System;
 using System;
-using System.Linq;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Events;
 using Jellyfin.Data.Events;
+using Jellyfin.Data.Queries;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
 
 
 namespace MediaBrowser.Model.Activity
 namespace MediaBrowser.Model.Activity
@@ -15,11 +15,6 @@ namespace MediaBrowser.Model.Activity
 
 
         Task CreateAsync(ActivityLog entry);
         Task CreateAsync(ActivityLog entry);
 
 
-        QueryResult<ActivityLogEntry> GetPagedResult(int? startIndex, int? limit);
-
-        QueryResult<ActivityLogEntry> GetPagedResult(
-            Func<IQueryable<ActivityLog>, IQueryable<ActivityLog>> func,
-            int? startIndex,
-            int? limit);
+        Task<QueryResult<ActivityLogEntry>> GetPagedResultAsync(ActivityLogQuery query);
     }
     }
 }
 }