diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index 3db48e42f2..c187966111 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -649,7 +649,7 @@ namespace Emby.Server.Implementations
/// A task representing the service initialization operation.
public async Task InitializeServices()
{
- var jellyfinDb = await Resolve>().CreateDbContextAsync().ConfigureAwait(false);
+ var jellyfinDb = await Resolve>().CreateDbContextAsync().ConfigureAwait(false);
await using (jellyfinDb.ConfigureAwait(false))
{
if ((await jellyfinDb.Database.GetPendingMigrationsAsync().ConfigureAwait(false)).Any())
diff --git a/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs b/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs
index 1efacd8562..1f3cb9b63f 100644
--- a/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs
+++ b/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs
@@ -17,7 +17,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
{
private readonly ILogger _logger;
private readonly ILocalizationManager _localization;
- private readonly IDbContextFactory _provider;
+ private readonly IDbContextFactory _provider;
///
/// Initializes a new instance of the class.
@@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
public OptimizeDatabaseTask(
ILogger logger,
ILocalizationManager localization,
- IDbContextFactory provider)
+ IDbContextFactory provider)
{
_logger = logger;
_localization = localization;
diff --git a/Jellyfin.Server.Implementations/Activity/ActivityManager.cs b/Jellyfin.Server.Implementations/Activity/ActivityManager.cs
index 9d6ca6aabe..ce1c54cbb2 100644
--- a/Jellyfin.Server.Implementations/Activity/ActivityManager.cs
+++ b/Jellyfin.Server.Implementations/Activity/ActivityManager.cs
@@ -15,13 +15,13 @@ namespace Jellyfin.Server.Implementations.Activity
///
public class ActivityManager : IActivityManager
{
- private readonly IDbContextFactory _provider;
+ private readonly IDbContextFactory _provider;
///
/// Initializes a new instance of the class.
///
/// The Jellyfin database provider.
- public ActivityManager(IDbContextFactory provider)
+ public ActivityManager(IDbContextFactory provider)
{
_provider = provider;
}
@@ -48,18 +48,10 @@ namespace Jellyfin.Server.Implementations.Activity
var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);
await using (dbContext.ConfigureAwait(false))
{
- IQueryable entries = dbContext.ActivityLogs
- .OrderByDescending(entry => entry.DateCreated);
-
- if (query.MinDate.HasValue)
- {
- entries = entries.Where(entry => entry.DateCreated >= query.MinDate);
- }
-
- if (query.HasUserId.HasValue)
- {
- entries = entries.Where(entry => (!entry.UserId.Equals(default)) == query.HasUserId.Value);
- }
+ var entries = dbContext.ActivityLogs
+ .OrderByDescending(entry => entry.DateCreated)
+ .Where(entry => query.MinDate == null || entry.DateCreated >= query.MinDate)
+ .Where(entry => !query.HasUserId.HasValue || entry.UserId.Equals(default) != query.HasUserId.Value);
return new QueryResult(
query.Skip,
@@ -67,8 +59,16 @@ namespace Jellyfin.Server.Implementations.Activity
await entries
.Skip(query.Skip ?? 0)
.Take(query.Limit ?? 100)
- .AsAsyncEnumerable()
- .Select(ConvertToOldModel)
+ .Select(entity => new ActivityLogEntry(entity.Name, entity.Type, entity.UserId)
+ {
+ Id = entity.Id,
+ Overview = entity.Overview,
+ ShortOverview = entity.ShortOverview,
+ ItemId = entity.ItemId,
+ Date = entity.DateCreated,
+ Severity = entity.LogSeverity
+ })
+ .AsQueryable()
.ToListAsync()
.ConfigureAwait(false));
}
diff --git a/Jellyfin.Server.Implementations/Devices/DeviceManager.cs b/Jellyfin.Server.Implementations/Devices/DeviceManager.cs
index 15ac5c668a..8b15d6823d 100644
--- a/Jellyfin.Server.Implementations/Devices/DeviceManager.cs
+++ b/Jellyfin.Server.Implementations/Devices/DeviceManager.cs
@@ -23,7 +23,7 @@ namespace Jellyfin.Server.Implementations.Devices
///
public class DeviceManager : IDeviceManager
{
- private readonly IDbContextFactory _dbProvider;
+ private readonly IDbContextFactory _dbProvider;
private readonly IUserManager _userManager;
private readonly ConcurrentDictionary _capabilitiesMap = new();
@@ -32,7 +32,7 @@ namespace Jellyfin.Server.Implementations.Devices
///
/// The database provider.
/// The user manager.
- public DeviceManager(IDbContextFactory dbProvider, IUserManager userManager)
+ public DeviceManager(IDbContextFactory dbProvider, IUserManager userManager)
{
_dbProvider = dbProvider;
_userManager = userManager;
@@ -54,7 +54,7 @@ namespace Jellyfin.Server.Implementations.Devices
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
await using (dbContext.ConfigureAwait(false))
{
- deviceOptions = await dbContext.DeviceOptions.AsQueryable().FirstOrDefaultAsync(dev => dev.DeviceId == deviceId).ConfigureAwait(false);
+ deviceOptions = await dbContext.DeviceOptions.FirstOrDefaultAsync(dev => dev.DeviceId == deviceId).ConfigureAwait(false);
if (deviceOptions is null)
{
deviceOptions = new DeviceOptions(deviceId);
@@ -132,22 +132,11 @@ namespace Jellyfin.Server.Implementations.Devices
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
await using (dbContext.ConfigureAwait(false))
{
- var devices = dbContext.Devices.AsQueryable();
-
- if (query.UserId.HasValue)
- {
- devices = devices.Where(device => device.UserId.Equals(query.UserId.Value));
- }
-
- if (query.DeviceId is not null)
- {
- devices = devices.Where(device => device.DeviceId == query.DeviceId);
- }
-
- if (query.AccessToken is not null)
- {
- devices = devices.Where(device => device.AccessToken == query.AccessToken);
- }
+ var devices = dbContext.Devices
+ .OrderBy(d => d.Id)
+ .Where(device => !query.UserId.HasValue || device.UserId.Equals(query.UserId.Value))
+ .Where(device => query.DeviceId == null || device.DeviceId == query.DeviceId)
+ .Where(device => query.AccessToken == null || device.AccessToken == query.AccessToken);
var count = await devices.CountAsync().ConfigureAwait(false);
@@ -179,11 +168,10 @@ namespace Jellyfin.Server.Implementations.Devices
///
public async Task> GetDevicesForUser(Guid? userId, bool? supportsSync)
{
- IAsyncEnumerable sessions;
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
await using (dbContext.ConfigureAwait(false))
{
- sessions = dbContext.Devices
+ IAsyncEnumerable sessions = dbContext.Devices
.Include(d => d.User)
.OrderByDescending(d => d.DateLastActivity)
.ThenBy(d => d.DeviceId)
diff --git a/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs b/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs
index 05c6229316..bb8d4dd14f 100644
--- a/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs
+++ b/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs
@@ -4,7 +4,6 @@ using EFCoreSecondLevelCacheInterceptor;
using MediaBrowser.Common.Configuration;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
namespace Jellyfin.Server.Implementations.Extensions;
@@ -29,13 +28,11 @@ public static class ServiceCollectionExtensions
.SkipCachingResults(result =>
result.Value is null || (result.Value is EFTableRows rows && rows.RowsCount == 0)));
- serviceCollection.AddPooledDbContextFactory((serviceProvider, opt) =>
+ serviceCollection.AddPooledDbContextFactory((serviceProvider, opt) =>
{
var applicationPaths = serviceProvider.GetRequiredService();
- var loggerFactory = serviceProvider.GetRequiredService();
opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}")
- .AddInterceptors(serviceProvider.GetRequiredService())
- .UseLoggerFactory(loggerFactory);
+ .AddInterceptors(serviceProvider.GetRequiredService());
});
return serviceCollection;
diff --git a/Jellyfin.Server.Implementations/JellyfinDb.cs b/Jellyfin.Server.Implementations/JellyfinDb.cs
deleted file mode 100644
index dc4f53913c..0000000000
--- a/Jellyfin.Server.Implementations/JellyfinDb.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-#nullable disable
-#pragma warning disable CS1591
-
-using System;
-using System.Linq;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Entities.Security;
-using Jellyfin.Data.Interfaces;
-using Microsoft.EntityFrameworkCore;
-
-namespace Jellyfin.Server.Implementations
-{
- ///
- public class JellyfinDb : DbContext
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The database context options.
- public JellyfinDb(DbContextOptions options) : base(options)
- {
- }
-
- ///
- /// Gets or sets the default connection string.
- ///
- public static string ConnectionString { get; set; } = @"Data Source=jellyfin.db";
-
- public virtual DbSet AccessSchedules { get; set; }
-
- public virtual DbSet ActivityLogs { get; set; }
-
- public virtual DbSet ApiKeys { get; set; }
-
- public virtual DbSet Devices { get; set; }
-
- public virtual DbSet DeviceOptions { get; set; }
-
- public virtual DbSet DisplayPreferences { get; set; }
-
- public virtual DbSet ImageInfos { get; set; }
-
- public virtual DbSet ItemDisplayPreferences { get; set; }
-
- public virtual DbSet CustomItemDisplayPreferences { get; set; }
-
- public virtual DbSet Permissions { get; set; }
-
- public virtual DbSet Preferences { get; set; }
-
- public virtual DbSet Users { get; set; }
-
- /*public virtual DbSet Artwork { get; set; }
-
- public virtual DbSet Books { get; set; }
-
- public virtual DbSet BookMetadata { get; set; }
-
- public virtual DbSet Chapters { get; set; }
-
- public virtual DbSet Collections { get; set; }
-
- public virtual DbSet CollectionItems { get; set; }
-
- public virtual DbSet Companies { get; set; }
-
- public virtual DbSet CompanyMetadata { get; set; }
-
- public virtual DbSet CustomItems { get; set; }
-
- public virtual DbSet CustomItemMetadata { get; set; }
-
- public virtual DbSet Episodes { get; set; }
-
- public virtual DbSet EpisodeMetadata { get; set; }
-
- public virtual DbSet Genres { get; set; }
-
- public virtual DbSet Groups { get; set; }
-
- public virtual DbSet Libraries { get; set; }
-
- public virtual DbSet LibraryItems { get; set; }
-
- public virtual DbSet LibraryRoot { get; set; }
-
- public virtual DbSet MediaFiles { get; set; }
-
- public virtual DbSet MediaFileStream { get; set; }
-
- public virtual DbSet Metadata { get; set; }
-
- public virtual DbSet MetadataProviders { get; set; }
-
- public virtual DbSet MetadataProviderIds { get; set; }
-
- public virtual DbSet Movies { get; set; }
-
- public virtual DbSet MovieMetadata { get; set; }
-
- public virtual DbSet MusicAlbums { get; set; }
-
- public virtual DbSet MusicAlbumMetadata { get; set; }
-
- public virtual DbSet People { get; set; }
-
- public virtual DbSet PersonRoles { get; set; }
-
- public virtual DbSet Photo { get; set; }
-
- public virtual DbSet PhotoMetadata { get; set; }
-
- public virtual DbSet ProviderMappings { get; set; }
-
- public virtual DbSet Ratings { get; set; }
-
- ///
- /// Repository for global::Jellyfin.Data.Entities.RatingSource - This is the entity to
- /// store review ratings, not age ratings.
- ///
- public virtual DbSet RatingSources { get; set; }
-
- public virtual DbSet Releases { get; set; }
-
- public virtual DbSet Seasons { get; set; }
-
- public virtual DbSet SeasonMetadata { get; set; }
-
- public virtual DbSet Series { get; set; }
-
- public virtual DbSet SeriesMetadata { get; set; }
-
- public virtual DbSet