ActivityManager.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Jellyfin.Data.Entities;
  5. using Jellyfin.Data.Events;
  6. using Jellyfin.Data.Queries;
  7. using Jellyfin.Database.Implementations;
  8. using MediaBrowser.Model.Activity;
  9. using MediaBrowser.Model.Querying;
  10. using Microsoft.EntityFrameworkCore;
  11. namespace Jellyfin.Server.Implementations.Activity
  12. {
  13. /// <summary>
  14. /// Manages the storage and retrieval of <see cref="ActivityLog"/> instances.
  15. /// </summary>
  16. public class ActivityManager : IActivityManager
  17. {
  18. private readonly IDbContextFactory<JellyfinDbContext> _provider;
  19. /// <summary>
  20. /// Initializes a new instance of the <see cref="ActivityManager"/> class.
  21. /// </summary>
  22. /// <param name="provider">The Jellyfin database provider.</param>
  23. public ActivityManager(IDbContextFactory<JellyfinDbContext> provider)
  24. {
  25. _provider = provider;
  26. }
  27. /// <inheritdoc/>
  28. public event EventHandler<GenericEventArgs<ActivityLogEntry>>? EntryCreated;
  29. /// <inheritdoc/>
  30. public async Task CreateAsync(ActivityLog entry)
  31. {
  32. var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);
  33. await using (dbContext.ConfigureAwait(false))
  34. {
  35. dbContext.ActivityLogs.Add(entry);
  36. await dbContext.SaveChangesAsync().ConfigureAwait(false);
  37. }
  38. EntryCreated?.Invoke(this, new GenericEventArgs<ActivityLogEntry>(ConvertToOldModel(entry)));
  39. }
  40. /// <inheritdoc/>
  41. public async Task<QueryResult<ActivityLogEntry>> GetPagedResultAsync(ActivityLogQuery query)
  42. {
  43. var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);
  44. await using (dbContext.ConfigureAwait(false))
  45. {
  46. var entries = dbContext.ActivityLogs
  47. .OrderByDescending(entry => entry.DateCreated)
  48. .Where(entry => query.MinDate == null || entry.DateCreated >= query.MinDate)
  49. .Where(entry => !query.HasUserId.HasValue || entry.UserId.Equals(default) != query.HasUserId.Value);
  50. return new QueryResult<ActivityLogEntry>(
  51. query.Skip,
  52. await entries.CountAsync().ConfigureAwait(false),
  53. await entries
  54. .Skip(query.Skip ?? 0)
  55. .Take(query.Limit ?? 100)
  56. .Select(entity => new ActivityLogEntry(entity.Name, entity.Type, entity.UserId)
  57. {
  58. Id = entity.Id,
  59. Overview = entity.Overview,
  60. ShortOverview = entity.ShortOverview,
  61. ItemId = entity.ItemId,
  62. Date = entity.DateCreated,
  63. Severity = entity.LogSeverity
  64. })
  65. .ToListAsync()
  66. .ConfigureAwait(false));
  67. }
  68. }
  69. /// <inheritdoc />
  70. public async Task CleanAsync(DateTime startDate)
  71. {
  72. var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);
  73. await using (dbContext.ConfigureAwait(false))
  74. {
  75. await dbContext.ActivityLogs
  76. .Where(entry => entry.DateCreated <= startDate)
  77. .ExecuteDeleteAsync()
  78. .ConfigureAwait(false);
  79. }
  80. }
  81. private static ActivityLogEntry ConvertToOldModel(ActivityLog entry)
  82. {
  83. return new ActivityLogEntry(entry.Name, entry.Type, entry.UserId)
  84. {
  85. Id = entry.Id,
  86. Overview = entry.Overview,
  87. ShortOverview = entry.ShortOverview,
  88. ItemId = entry.ItemId,
  89. Date = entry.DateCreated,
  90. Severity = entry.LogSeverity
  91. };
  92. }
  93. }
  94. }