ActivityLogController.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using Jellyfin.Data.Enums;
  5. using Jellyfin.Data.Queries;
  6. using Jellyfin.Database.Implementations.Enums;
  7. using MediaBrowser.Common.Api;
  8. using MediaBrowser.Model.Activity;
  9. using MediaBrowser.Model.Querying;
  10. using Microsoft.AspNetCore.Authorization;
  11. using Microsoft.AspNetCore.Http;
  12. using Microsoft.AspNetCore.Mvc;
  13. using Microsoft.Extensions.Logging;
  14. namespace Jellyfin.Api.Controllers;
  15. /// <summary>
  16. /// Activity log controller.
  17. /// </summary>
  18. [Route("System/ActivityLog")]
  19. [Authorize(Policy = Policies.RequiresElevation)]
  20. public class ActivityLogController : BaseJellyfinApiController
  21. {
  22. private readonly IActivityManager _activityManager;
  23. /// <summary>
  24. /// Initializes a new instance of the <see cref="ActivityLogController"/> class.
  25. /// </summary>
  26. /// <param name="activityManager">Instance of <see cref="IActivityManager"/> interface.</param>
  27. public ActivityLogController(IActivityManager activityManager)
  28. {
  29. _activityManager = activityManager;
  30. }
  31. /// <summary>
  32. /// Gets activity log entries.
  33. /// </summary>
  34. /// <param name="startIndex">The record index to start at. All items with a lower index will be dropped from the results.</param>
  35. /// <param name="limit">The maximum number of records to return.</param>
  36. /// <param name="minDate">The minimum date.</param>
  37. /// <param name="hasUserId">Filter log entries if it has user id, or not.</param>
  38. /// <param name="name">Filter by name.</param>
  39. /// <param name="overview">Filter by overview.</param>
  40. /// <param name="shortOverview">Filter by short overview.</param>
  41. /// <param name="type">Filter by type.</param>
  42. /// <param name="itemId">Filter by item id.</param>
  43. /// <param name="username">Filter by username.</param>
  44. /// <param name="severity">Filter by log severity.</param>
  45. /// <param name="sortBy">Specify one or more sort orders. Format: SortBy=Name,Type.</param>
  46. /// <param name="sortOrder">Sort Order..</param>
  47. /// <response code="200">Activity log returned.</response>
  48. /// <returns>A <see cref="QueryResult{ActivityLogEntry}"/> containing the log entries.</returns>
  49. [HttpGet("Entries")]
  50. [ProducesResponseType(StatusCodes.Status200OK)]
  51. public async Task<ActionResult<QueryResult<ActivityLogEntry>>> GetLogEntries(
  52. [FromQuery] int? startIndex,
  53. [FromQuery] int? limit,
  54. [FromQuery] DateTime? minDate,
  55. [FromQuery] bool? hasUserId,
  56. [FromQuery] string? name,
  57. [FromQuery] string? overview,
  58. [FromQuery] string? shortOverview,
  59. [FromQuery] string? type,
  60. [FromQuery] Guid? itemId,
  61. [FromQuery] string? username,
  62. [FromQuery] LogLevel? severity,
  63. [FromQuery] ActivityLogSortBy[]? sortBy,
  64. [FromQuery] SortOrder[]? sortOrder)
  65. {
  66. var query = new ActivityLogQuery
  67. {
  68. Skip = startIndex,
  69. Limit = limit,
  70. MinDate = minDate,
  71. HasUserId = hasUserId,
  72. Name = name,
  73. Overview = overview,
  74. ShortOverview = shortOverview,
  75. Type = type,
  76. ItemId = itemId,
  77. Username = username,
  78. Severity = severity,
  79. OrderBy = GetOrderBy(sortBy ?? [], sortOrder ?? []),
  80. };
  81. return await _activityManager.GetPagedResultAsync(query).ConfigureAwait(false);
  82. }
  83. private static (ActivityLogSortBy SortBy, SortOrder SortOrder)[] GetOrderBy(
  84. IReadOnlyList<ActivityLogSortBy> sortBy,
  85. IReadOnlyList<SortOrder> requestedSortOrder)
  86. {
  87. if (sortBy.Count == 0)
  88. {
  89. return [];
  90. }
  91. var result = new (ActivityLogSortBy, SortOrder)[sortBy.Count];
  92. var i = 0;
  93. for (; i < requestedSortOrder.Count; i++)
  94. {
  95. result[i] = (sortBy[i], requestedSortOrder[i]);
  96. }
  97. // Add remaining elements with the first specified SortOrder
  98. // or the default one if no SortOrders are specified
  99. var order = requestedSortOrder.Count > 0 ? requestedSortOrder[0] : SortOrder.Ascending;
  100. for (; i < sortBy.Count; i++)
  101. {
  102. result[i] = (sortBy[i], order);
  103. }
  104. return result;
  105. }
  106. }