using System; using System.Globalization; using System.Linq; using Jellyfin.Data.Entities; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Activity; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Services; using Microsoft.Extensions.Logging; namespace MediaBrowser.Api.System { [Route("/System/ActivityLog/Entries", "GET", Summary = "Gets activity log entries")] public class GetActivityLogs : IReturn> { /// /// Skips over a given number of items within the results. Use for paging. /// /// The start index. [ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public int? StartIndex { get; set; } /// /// The maximum number of items to return. /// /// The limit. [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public int? Limit { get; set; } [ApiMember(Name = "MinDate", Description = "Optional. The minimum date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string MinDate { get; set; } public bool? HasUserId { get; set; } } [Authenticated(Roles = "Admin")] public class ActivityLogService : BaseApiService { private readonly IActivityManager _activityManager; public ActivityLogService( ILogger logger, IServerConfigurationManager serverConfigurationManager, IHttpResultFactory httpResultFactory, IActivityManager activityManager) : base(logger, serverConfigurationManager, httpResultFactory) { _activityManager = activityManager; } public object Get(GetActivityLogs request) { DateTime? minDate = string.IsNullOrWhiteSpace(request.MinDate) ? (DateTime?)null : DateTime.Parse(request.MinDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); var filterFunc = new Func, IQueryable>( entries => entries.Where(entry => entry.DateCreated >= minDate && (!request.HasUserId.HasValue || (request.HasUserId.Value ? entry.UserId != Guid.Empty : entry.UserId == Guid.Empty)))); var result = _activityManager.GetPagedResult(filterFunc, request.StartIndex, request.Limit); return ToOptimizedResult(result); } } }