< Summary - Jellyfin

Information
Class: Jellyfin.Api.Controllers.ActivityLogController
Assembly: Jellyfin.Api
File(s): /srv/git/jellyfin/Jellyfin.Api/Controllers/ActivityLogController.cs
Line coverage
74%
Covered lines: 23
Uncovered lines: 8
Coverable lines: 31
Total lines: 119
Line coverage: 74.1%
Branch coverage
25%
Covered branches: 3
Total branches: 12
Branch coverage: 25%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 1/23/2026 - 12:11:06 AM Line coverage: 38.4% (5/13) Branch coverage: 12.5% (1/8) Total lines: 1184/19/2026 - 12:14:27 AM Line coverage: 74.1% (23/31) Branch coverage: 25% (3/12) Total lines: 1184/27/2026 - 12:15:04 AM Line coverage: 74.1% (23/31) Branch coverage: 25% (3/12) Total lines: 119 1/23/2026 - 12:11:06 AM Line coverage: 38.4% (5/13) Branch coverage: 12.5% (1/8) Total lines: 1184/19/2026 - 12:14:27 AM Line coverage: 74.1% (23/31) Branch coverage: 25% (3/12) Total lines: 1184/27/2026 - 12:15:04 AM Line coverage: 74.1% (23/31) Branch coverage: 25% (3/12) Total lines: 119

Coverage delta

Coverage delta 36 -36

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetLogEntries()50%44100%
GetOrderBy(...)12.5%41820%

File(s)

/srv/git/jellyfin/Jellyfin.Api/Controllers/ActivityLogController.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Threading.Tasks;
 4using Jellyfin.Data.Enums;
 5using Jellyfin.Data.Queries;
 6using Jellyfin.Database.Implementations.Enums;
 7using MediaBrowser.Common.Api;
 8using MediaBrowser.Model.Activity;
 9using MediaBrowser.Model.Querying;
 10using Microsoft.AspNetCore.Authorization;
 11using Microsoft.AspNetCore.Http;
 12using Microsoft.AspNetCore.Mvc;
 13using Microsoft.Extensions.Logging;
 14
 15namespace Jellyfin.Api.Controllers;
 16
 17/// <summary>
 18/// Activity log controller.
 19/// </summary>
 20[Route("System/ActivityLog")]
 21[Authorize(Policy = Policies.RequiresElevation)]
 22[Tags("System")]
 23public class ActivityLogController : BaseJellyfinApiController
 24{
 25    private readonly IActivityManager _activityManager;
 26
 27    /// <summary>
 28    /// Initializes a new instance of the <see cref="ActivityLogController"/> class.
 29    /// </summary>
 30    /// <param name="activityManager">Instance of <see cref="IActivityManager"/> interface.</param>
 131    public ActivityLogController(IActivityManager activityManager)
 32    {
 133        _activityManager = activityManager;
 134    }
 35
 36    /// <summary>
 37    /// Gets activity log entries.
 38    /// </summary>
 39    /// <param name="startIndex">The record index to start at. All items with a lower index will be dropped from the res
 40    /// <param name="limit">The maximum number of records to return.</param>
 41    /// <param name="minDate">The minimum date.</param>
 42    /// <param name="maxDate">The maximum date.</param>
 43    /// <param name="hasUserId">Filter log entries if it has user id, or not.</param>
 44    /// <param name="name">Filter by name.</param>
 45    /// <param name="overview">Filter by overview.</param>
 46    /// <param name="shortOverview">Filter by short overview.</param>
 47    /// <param name="type">Filter by type.</param>
 48    /// <param name="itemId">Filter by item id.</param>
 49    /// <param name="username">Filter by username.</param>
 50    /// <param name="severity">Filter by log severity.</param>
 51    /// <param name="sortBy">Specify one or more sort orders. Format: SortBy=Name,Type.</param>
 52    /// <param name="sortOrder">Sort Order..</param>
 53    /// <response code="200">Activity log returned.</response>
 54    /// <returns>A <see cref="QueryResult{ActivityLogEntry}"/> containing the log entries.</returns>
 55    [HttpGet("Entries")]
 56    [ProducesResponseType(StatusCodes.Status200OK)]
 57    public async Task<ActionResult<QueryResult<ActivityLogEntry>>> GetLogEntries(
 58        [FromQuery] int? startIndex,
 59        [FromQuery] int? limit,
 60        [FromQuery] DateTime? minDate,
 61        [FromQuery] DateTime? maxDate,
 62        [FromQuery] bool? hasUserId,
 63        [FromQuery] string? name,
 64        [FromQuery] string? overview,
 65        [FromQuery] string? shortOverview,
 66        [FromQuery] string? type,
 67        [FromQuery] Guid? itemId,
 68        [FromQuery] string? username,
 69        [FromQuery] LogLevel? severity,
 70        [FromQuery] ActivityLogSortBy[]? sortBy,
 71        [FromQuery] SortOrder[]? sortOrder)
 72    {
 173        var query = new ActivityLogQuery
 174        {
 175            Skip = startIndex,
 176            Limit = limit,
 177            MinDate = minDate,
 178            MaxDate = maxDate,
 179            HasUserId = hasUserId,
 180            Name = name,
 181            Overview = overview,
 182            ShortOverview = shortOverview,
 183            Type = type,
 184            ItemId = itemId,
 185            Username = username,
 186            Severity = severity,
 187            OrderBy = GetOrderBy(sortBy ?? [], sortOrder ?? []),
 188        };
 89
 190        return await _activityManager.GetPagedResultAsync(query).ConfigureAwait(false);
 191    }
 92
 93    private static (ActivityLogSortBy SortBy, SortOrder SortOrder)[] GetOrderBy(
 94        IReadOnlyList<ActivityLogSortBy> sortBy,
 95        IReadOnlyList<SortOrder> requestedSortOrder)
 96    {
 197        if (sortBy.Count == 0)
 98        {
 199            return [];
 100        }
 101
 0102        var result = new (ActivityLogSortBy, SortOrder)[sortBy.Count];
 0103        var i = 0;
 0104        for (; i < requestedSortOrder.Count; i++)
 105        {
 0106            result[i] = (sortBy[i], requestedSortOrder[i]);
 107        }
 108
 109        // Add remaining elements with the first specified SortOrder
 110        // or the default one if no SortOrders are specified
 0111        var order = requestedSortOrder.Count > 0 ? requestedSortOrder[0] : SortOrder.Ascending;
 0112        for (; i < sortBy.Count; i++)
 113        {
 0114            result[i] = (sortBy[i], order);
 115        }
 116
 0117        return result;
 118    }
 119}