ActivityLogController.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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="maxDate">The maximum date.</param>
  38. /// <param name="hasUserId">Filter log entries if it has user id, or not.</param>
  39. /// <param name="name">Filter by name.</param>
  40. /// <param name="overview">Filter by overview.</param>
  41. /// <param name="shortOverview">Filter by short overview.</param>
  42. /// <param name="type">Filter by type.</param>
  43. /// <param name="itemId">Filter by item id.</param>
  44. /// <param name="username">Filter by username.</param>
  45. /// <param name="severity">Filter by log severity.</param>
  46. /// <param name="sortBy">Specify one or more sort orders. Format: SortBy=Name,Type.</param>
  47. /// <param name="sortOrder">Sort Order..</param>
  48. /// <response code="200">Activity log returned.</response>
  49. /// <returns>A <see cref="QueryResult{ActivityLogEntry}"/> containing the log entries.</returns>
  50. [HttpGet("Entries")]
  51. [ProducesResponseType(StatusCodes.Status200OK)]
  52. public async Task<ActionResult<QueryResult<ActivityLogEntry>>> GetLogEntries(
  53. [FromQuery] int? startIndex,
  54. [FromQuery] int? limit,
  55. [FromQuery] DateTime? minDate,
  56. [FromQuery] DateTime? maxDate,
  57. [FromQuery] bool? hasUserId,
  58. [FromQuery] string? name,
  59. [FromQuery] string? overview,
  60. [FromQuery] string? shortOverview,
  61. [FromQuery] string? type,
  62. [FromQuery] Guid? itemId,
  63. [FromQuery] string? username,
  64. [FromQuery] LogLevel? severity,
  65. [FromQuery] ActivityLogSortBy[]? sortBy,
  66. [FromQuery] SortOrder[]? sortOrder)
  67. {
  68. var query = new ActivityLogQuery
  69. {
  70. Skip = startIndex,
  71. Limit = limit,
  72. MinDate = minDate,
  73. MaxDate = maxDate,
  74. HasUserId = hasUserId,
  75. Name = name,
  76. Overview = overview,
  77. ShortOverview = shortOverview,
  78. Type = type,
  79. ItemId = itemId,
  80. Username = username,
  81. Severity = severity,
  82. OrderBy = GetOrderBy(sortBy ?? [], sortOrder ?? []),
  83. };
  84. return await _activityManager.GetPagedResultAsync(query).ConfigureAwait(false);
  85. }
  86. private static (ActivityLogSortBy SortBy, SortOrder SortOrder)[] GetOrderBy(
  87. IReadOnlyList<ActivityLogSortBy> sortBy,
  88. IReadOnlyList<SortOrder> requestedSortOrder)
  89. {
  90. if (sortBy.Count == 0)
  91. {
  92. return [];
  93. }
  94. var result = new (ActivityLogSortBy, SortOrder)[sortBy.Count];
  95. var i = 0;
  96. for (; i < requestedSortOrder.Count; i++)
  97. {
  98. result[i] = (sortBy[i], requestedSortOrder[i]);
  99. }
  100. // Add remaining elements with the first specified SortOrder
  101. // or the default one if no SortOrders are specified
  102. var order = requestedSortOrder.Count > 0 ? requestedSortOrder[0] : SortOrder.Ascending;
  103. for (; i < sortBy.Count; i++)
  104. {
  105. result[i] = (sortBy[i], order);
  106. }
  107. return result;
  108. }
  109. }