using System; using System.Collections.Generic; using System.Threading.Tasks; using Jellyfin.Data.Enums; using Jellyfin.Data.Queries; using Jellyfin.Database.Implementations.Enums; using MediaBrowser.Common.Api; using MediaBrowser.Model.Activity; using MediaBrowser.Model.Querying; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace Jellyfin.Api.Controllers; /// /// Activity log controller. /// [Route("System/ActivityLog")] [Authorize(Policy = Policies.RequiresElevation)] public class ActivityLogController : BaseJellyfinApiController { private readonly IActivityManager _activityManager; /// /// Initializes a new instance of the class. /// /// Instance of interface. public ActivityLogController(IActivityManager activityManager) { _activityManager = activityManager; } /// /// Gets activity log entries. /// /// The record index to start at. All items with a lower index will be dropped from the results. /// The maximum number of records to return. /// The minimum date. /// Filter log entries if it has user id, or not. /// Filter by name. /// Filter by overview. /// Filter by short overview. /// Filter by type. /// Filter by item id. /// Filter by username. /// Filter by log severity. /// Specify one or more sort orders. Format: SortBy=Name,Type. /// Sort Order.. /// Activity log returned. /// A containing the log entries. [HttpGet("Entries")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetLogEntries( [FromQuery] int? startIndex, [FromQuery] int? limit, [FromQuery] DateTime? minDate, [FromQuery] bool? hasUserId, [FromQuery] string? name, [FromQuery] string? overview, [FromQuery] string? shortOverview, [FromQuery] string? type, [FromQuery] Guid? itemId, [FromQuery] string? username, [FromQuery] LogLevel? severity, [FromQuery] ActivityLogSortBy[]? sortBy, [FromQuery] SortOrder[]? sortOrder) { var query = new ActivityLogQuery { Skip = startIndex, Limit = limit, MinDate = minDate, HasUserId = hasUserId, Name = name, Overview = overview, ShortOverview = shortOverview, Type = type, ItemId = itemId, Username = username, Severity = severity, OrderBy = GetOrderBy(sortBy ?? [], sortOrder ?? []), }; return await _activityManager.GetPagedResultAsync(query).ConfigureAwait(false); } private static (ActivityLogSortBy SortBy, SortOrder SortOrder)[] GetOrderBy( IReadOnlyList sortBy, IReadOnlyList requestedSortOrder) { if (sortBy.Count == 0) { return []; } var result = new (ActivityLogSortBy, SortOrder)[sortBy.Count]; var i = 0; for (; i < requestedSortOrder.Count; i++) { result[i] = (sortBy[i], requestedSortOrder[i]); } // Add remaining elements with the first specified SortOrder // or the default one if no SortOrders are specified var order = requestedSortOrder.Count > 0 ? requestedSortOrder[0] : SortOrder.Ascending; for (; i < sortBy.Count; i++) { result[i] = (sortBy[i], order); } return result; } }