mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-09 03:04:24 -04:00
Merge pull request #9108 from barronpm/efcore-cleanup
This commit is contained in:
commit
875359d457
@ -649,7 +649,7 @@ namespace Emby.Server.Implementations
|
|||||||
/// <returns>A task representing the service initialization operation.</returns>
|
/// <returns>A task representing the service initialization operation.</returns>
|
||||||
public async Task InitializeServices()
|
public async Task InitializeServices()
|
||||||
{
|
{
|
||||||
var jellyfinDb = await Resolve<IDbContextFactory<JellyfinDb>>().CreateDbContextAsync().ConfigureAwait(false);
|
var jellyfinDb = await Resolve<IDbContextFactory<JellyfinDbContext>>().CreateDbContextAsync().ConfigureAwait(false);
|
||||||
await using (jellyfinDb.ConfigureAwait(false))
|
await using (jellyfinDb.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
if ((await jellyfinDb.Database.GetPendingMigrationsAsync().ConfigureAwait(false)).Any())
|
if ((await jellyfinDb.Database.GetPendingMigrationsAsync().ConfigureAwait(false)).Any())
|
||||||
|
@ -17,7 +17,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
|
|||||||
{
|
{
|
||||||
private readonly ILogger<OptimizeDatabaseTask> _logger;
|
private readonly ILogger<OptimizeDatabaseTask> _logger;
|
||||||
private readonly ILocalizationManager _localization;
|
private readonly ILocalizationManager _localization;
|
||||||
private readonly IDbContextFactory<JellyfinDb> _provider;
|
private readonly IDbContextFactory<JellyfinDbContext> _provider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="OptimizeDatabaseTask" /> class.
|
/// Initializes a new instance of the <see cref="OptimizeDatabaseTask" /> class.
|
||||||
@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
|
|||||||
public OptimizeDatabaseTask(
|
public OptimizeDatabaseTask(
|
||||||
ILogger<OptimizeDatabaseTask> logger,
|
ILogger<OptimizeDatabaseTask> logger,
|
||||||
ILocalizationManager localization,
|
ILocalizationManager localization,
|
||||||
IDbContextFactory<JellyfinDb> provider)
|
IDbContextFactory<JellyfinDbContext> provider)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_localization = localization;
|
_localization = localization;
|
||||||
|
@ -15,13 +15,13 @@ namespace Jellyfin.Server.Implementations.Activity
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ActivityManager : IActivityManager
|
public class ActivityManager : IActivityManager
|
||||||
{
|
{
|
||||||
private readonly IDbContextFactory<JellyfinDb> _provider;
|
private readonly IDbContextFactory<JellyfinDbContext> _provider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ActivityManager"/> class.
|
/// Initializes a new instance of the <see cref="ActivityManager"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="provider">The Jellyfin database provider.</param>
|
/// <param name="provider">The Jellyfin database provider.</param>
|
||||||
public ActivityManager(IDbContextFactory<JellyfinDb> provider)
|
public ActivityManager(IDbContextFactory<JellyfinDbContext> provider)
|
||||||
{
|
{
|
||||||
_provider = provider;
|
_provider = provider;
|
||||||
}
|
}
|
||||||
@ -48,18 +48,10 @@ namespace Jellyfin.Server.Implementations.Activity
|
|||||||
var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);
|
var dbContext = await _provider.CreateDbContextAsync().ConfigureAwait(false);
|
||||||
await using (dbContext.ConfigureAwait(false))
|
await using (dbContext.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
IQueryable<ActivityLog> entries = dbContext.ActivityLogs
|
var entries = dbContext.ActivityLogs
|
||||||
.OrderByDescending(entry => entry.DateCreated);
|
.OrderByDescending(entry => entry.DateCreated)
|
||||||
|
.Where(entry => query.MinDate == null || entry.DateCreated >= query.MinDate)
|
||||||
if (query.MinDate.HasValue)
|
.Where(entry => !query.HasUserId.HasValue || entry.UserId.Equals(default) != query.HasUserId.Value);
|
||||||
{
|
|
||||||
entries = entries.Where(entry => entry.DateCreated >= query.MinDate);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (query.HasUserId.HasValue)
|
|
||||||
{
|
|
||||||
entries = entries.Where(entry => (!entry.UserId.Equals(default)) == query.HasUserId.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new QueryResult<ActivityLogEntry>(
|
return new QueryResult<ActivityLogEntry>(
|
||||||
query.Skip,
|
query.Skip,
|
||||||
@ -67,8 +59,16 @@ namespace Jellyfin.Server.Implementations.Activity
|
|||||||
await entries
|
await entries
|
||||||
.Skip(query.Skip ?? 0)
|
.Skip(query.Skip ?? 0)
|
||||||
.Take(query.Limit ?? 100)
|
.Take(query.Limit ?? 100)
|
||||||
.AsAsyncEnumerable()
|
.Select(entity => new ActivityLogEntry(entity.Name, entity.Type, entity.UserId)
|
||||||
.Select(ConvertToOldModel)
|
{
|
||||||
|
Id = entity.Id,
|
||||||
|
Overview = entity.Overview,
|
||||||
|
ShortOverview = entity.ShortOverview,
|
||||||
|
ItemId = entity.ItemId,
|
||||||
|
Date = entity.DateCreated,
|
||||||
|
Severity = entity.LogSeverity
|
||||||
|
})
|
||||||
|
.AsQueryable()
|
||||||
.ToListAsync()
|
.ToListAsync()
|
||||||
.ConfigureAwait(false));
|
.ConfigureAwait(false));
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ namespace Jellyfin.Server.Implementations.Devices
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class DeviceManager : IDeviceManager
|
public class DeviceManager : IDeviceManager
|
||||||
{
|
{
|
||||||
private readonly IDbContextFactory<JellyfinDb> _dbProvider;
|
private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly ConcurrentDictionary<string, ClientCapabilities> _capabilitiesMap = new();
|
private readonly ConcurrentDictionary<string, ClientCapabilities> _capabilitiesMap = new();
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ namespace Jellyfin.Server.Implementations.Devices
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dbProvider">The database provider.</param>
|
/// <param name="dbProvider">The database provider.</param>
|
||||||
/// <param name="userManager">The user manager.</param>
|
/// <param name="userManager">The user manager.</param>
|
||||||
public DeviceManager(IDbContextFactory<JellyfinDb> dbProvider, IUserManager userManager)
|
public DeviceManager(IDbContextFactory<JellyfinDbContext> dbProvider, IUserManager userManager)
|
||||||
{
|
{
|
||||||
_dbProvider = dbProvider;
|
_dbProvider = dbProvider;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
@ -54,7 +54,7 @@ namespace Jellyfin.Server.Implementations.Devices
|
|||||||
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
|
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
|
||||||
await using (dbContext.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)
|
if (deviceOptions is null)
|
||||||
{
|
{
|
||||||
deviceOptions = new DeviceOptions(deviceId);
|
deviceOptions = new DeviceOptions(deviceId);
|
||||||
@ -132,22 +132,11 @@ namespace Jellyfin.Server.Implementations.Devices
|
|||||||
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
|
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
|
||||||
await using (dbContext.ConfigureAwait(false))
|
await using (dbContext.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
var devices = dbContext.Devices.AsQueryable();
|
var devices = dbContext.Devices
|
||||||
|
.OrderBy(d => d.Id)
|
||||||
if (query.UserId.HasValue)
|
.Where(device => !query.UserId.HasValue || device.UserId.Equals(query.UserId.Value))
|
||||||
{
|
.Where(device => query.DeviceId == null || device.DeviceId == query.DeviceId)
|
||||||
devices = devices.Where(device => device.UserId.Equals(query.UserId.Value));
|
.Where(device => query.AccessToken == null || device.AccessToken == query.AccessToken);
|
||||||
}
|
|
||||||
|
|
||||||
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 count = await devices.CountAsync().ConfigureAwait(false);
|
var count = await devices.CountAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
@ -179,11 +168,10 @@ namespace Jellyfin.Server.Implementations.Devices
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<QueryResult<DeviceInfo>> GetDevicesForUser(Guid? userId, bool? supportsSync)
|
public async Task<QueryResult<DeviceInfo>> GetDevicesForUser(Guid? userId, bool? supportsSync)
|
||||||
{
|
{
|
||||||
IAsyncEnumerable<Device> sessions;
|
|
||||||
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
|
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
|
||||||
await using (dbContext.ConfigureAwait(false))
|
await using (dbContext.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
sessions = dbContext.Devices
|
IAsyncEnumerable<Device> sessions = dbContext.Devices
|
||||||
.Include(d => d.User)
|
.Include(d => d.User)
|
||||||
.OrderByDescending(d => d.DateLastActivity)
|
.OrderByDescending(d => d.DateLastActivity)
|
||||||
.ThenBy(d => d.DeviceId)
|
.ThenBy(d => d.DeviceId)
|
||||||
|
@ -4,7 +4,6 @@ using EFCoreSecondLevelCacheInterceptor;
|
|||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Extensions;
|
namespace Jellyfin.Server.Implementations.Extensions;
|
||||||
|
|
||||||
@ -29,13 +28,11 @@ public static class ServiceCollectionExtensions
|
|||||||
.SkipCachingResults(result =>
|
.SkipCachingResults(result =>
|
||||||
result.Value is null || (result.Value is EFTableRows rows && rows.RowsCount == 0)));
|
result.Value is null || (result.Value is EFTableRows rows && rows.RowsCount == 0)));
|
||||||
|
|
||||||
serviceCollection.AddPooledDbContextFactory<JellyfinDb>((serviceProvider, opt) =>
|
serviceCollection.AddPooledDbContextFactory<JellyfinDbContext>((serviceProvider, opt) =>
|
||||||
{
|
{
|
||||||
var applicationPaths = serviceProvider.GetRequiredService<IApplicationPaths>();
|
var applicationPaths = serviceProvider.GetRequiredService<IApplicationPaths>();
|
||||||
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
|
|
||||||
opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}")
|
opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}")
|
||||||
.AddInterceptors(serviceProvider.GetRequiredService<SecondLevelCacheInterceptor>())
|
.AddInterceptors(serviceProvider.GetRequiredService<SecondLevelCacheInterceptor>());
|
||||||
.UseLoggerFactory(loggerFactory);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
|
@ -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
|
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public class JellyfinDb : DbContext
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="JellyfinDb"/> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="options">The database context options.</param>
|
|
||||||
public JellyfinDb(DbContextOptions<JellyfinDb> options) : base(options)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the default connection string.
|
|
||||||
/// </summary>
|
|
||||||
public static string ConnectionString { get; set; } = @"Data Source=jellyfin.db";
|
|
||||||
|
|
||||||
public virtual DbSet<AccessSchedule> AccessSchedules { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<ActivityLog> ActivityLogs { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<ApiKey> ApiKeys { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Device> Devices { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<DeviceOptions> DeviceOptions { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<DisplayPreferences> DisplayPreferences { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<ImageInfo> ImageInfos { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<ItemDisplayPreferences> ItemDisplayPreferences { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<CustomItemDisplayPreferences> CustomItemDisplayPreferences { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Permission> Permissions { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Preference> Preferences { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<User> Users { get; set; }
|
|
||||||
|
|
||||||
/*public virtual DbSet<Artwork> Artwork { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Book> Books { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<BookMetadata> BookMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Chapter> Chapters { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Collection> Collections { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<CollectionItem> CollectionItems { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Company> Companies { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<CompanyMetadata> CompanyMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<CustomItem> CustomItems { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<CustomItemMetadata> CustomItemMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Episode> Episodes { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<EpisodeMetadata> EpisodeMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Genre> Genres { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Group> Groups { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Library> Libraries { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<LibraryItem> LibraryItems { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<LibraryRoot> LibraryRoot { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<MediaFile> MediaFiles { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<MediaFileStream> MediaFileStream { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Metadata> Metadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<MetadataProvider> MetadataProviders { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<MetadataProviderId> MetadataProviderIds { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Movie> Movies { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<MovieMetadata> MovieMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<MusicAlbum> MusicAlbums { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<MusicAlbumMetadata> MusicAlbumMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Person> People { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<PersonRole> PersonRoles { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Photo> Photo { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<PhotoMetadata> PhotoMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<ProviderMapping> ProviderMappings { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Rating> Ratings { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Repository for global::Jellyfin.Data.Entities.RatingSource - This is the entity to
|
|
||||||
/// store review ratings, not age ratings.
|
|
||||||
/// </summary>
|
|
||||||
public virtual DbSet<RatingSource> RatingSources { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Release> Releases { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Season> Seasons { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<SeasonMetadata> SeasonMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Series> Series { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<SeriesMetadata> SeriesMetadata { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<Track> Tracks { get; set; }
|
|
||||||
|
|
||||||
public virtual DbSet<TrackMetadata> TrackMetadata { get; set; }*/
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public override int SaveChanges()
|
|
||||||
{
|
|
||||||
foreach (var saveEntity in ChangeTracker.Entries()
|
|
||||||
.Where(e => e.State == EntityState.Modified)
|
|
||||||
.Select(entry => entry.Entity)
|
|
||||||
.OfType<IHasConcurrencyToken>())
|
|
||||||
{
|
|
||||||
saveEntity.OnSavingChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.SaveChanges();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
||||||
{
|
|
||||||
modelBuilder.SetDefaultDateTimeKind(DateTimeKind.Utc);
|
|
||||||
base.OnModelCreating(modelBuilder);
|
|
||||||
modelBuilder.HasDefaultSchema("jellyfin");
|
|
||||||
|
|
||||||
// Configuration for each entity is in it's own class inside 'ModelConfiguration'.
|
|
||||||
modelBuilder.ApplyConfigurationsFromAssembly(typeof(JellyfinDb).Assembly);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
188
Jellyfin.Server.Implementations/JellyfinDbContext.cs
Normal file
188
Jellyfin.Server.Implementations/JellyfinDbContext.cs
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public class JellyfinDbContext : DbContext
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="JellyfinDbContext"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="options">The database context options.</param>
|
||||||
|
public JellyfinDbContext(DbContextOptions<JellyfinDbContext> options) : base(options)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the access schedules.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<AccessSchedule> AccessSchedules => Set<AccessSchedule>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the activity logs.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<ActivityLog> ActivityLogs => Set<ActivityLog>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the API keys.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<ApiKey> ApiKeys => Set<ApiKey>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the devices.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<Device> Devices => Set<Device>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the device options.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<DeviceOptions> DeviceOptions => Set<DeviceOptions>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the display preferences.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<DisplayPreferences> DisplayPreferences => Set<DisplayPreferences>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the image infos.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<ImageInfo> ImageInfos => Set<ImageInfo>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the item display preferences.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<ItemDisplayPreferences> ItemDisplayPreferences => Set<ItemDisplayPreferences>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the custom item display preferences.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<CustomItemDisplayPreferences> CustomItemDisplayPreferences => Set<CustomItemDisplayPreferences>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the permissions.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<Permission> Permissions => Set<Permission>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the preferences.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<Preference> Preferences => Set<Preference>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="DbSet{TEntity}"/> containing the users.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<User> Users => Set<User>();
|
||||||
|
|
||||||
|
/*public DbSet<Artwork> Artwork => Set<Artwork>();
|
||||||
|
|
||||||
|
public DbSet<Book> Books => Set<Book>();
|
||||||
|
|
||||||
|
public DbSet<BookMetadata> BookMetadata => Set<BookMetadata>();
|
||||||
|
|
||||||
|
public DbSet<Chapter> Chapters => Set<Chapter>();
|
||||||
|
|
||||||
|
public DbSet<Collection> Collections => Set<Collection>();
|
||||||
|
|
||||||
|
public DbSet<CollectionItem> CollectionItems => Set<CollectionItem>();
|
||||||
|
|
||||||
|
public DbSet<Company> Companies => Set<Company>();
|
||||||
|
|
||||||
|
public DbSet<CompanyMetadata> CompanyMetadata => Set<CompanyMetadata>();
|
||||||
|
|
||||||
|
public DbSet<CustomItem> CustomItems => Set<CustomItem>();
|
||||||
|
|
||||||
|
public DbSet<CustomItemMetadata> CustomItemMetadata => Set<CustomItemMetadata>();
|
||||||
|
|
||||||
|
public DbSet<Episode> Episodes => Set<Episode>();
|
||||||
|
|
||||||
|
public DbSet<EpisodeMetadata> EpisodeMetadata => Set<EpisodeMetadata>();
|
||||||
|
|
||||||
|
public DbSet<Genre> Genres => Set<Genre>();
|
||||||
|
|
||||||
|
public DbSet<Group> Groups => Set<Groups>();
|
||||||
|
|
||||||
|
public DbSet<Library> Libraries => Set<Library>();
|
||||||
|
|
||||||
|
public DbSet<LibraryItem> LibraryItems => Set<LibraryItems>();
|
||||||
|
|
||||||
|
public DbSet<LibraryRoot> LibraryRoot => Set<LibraryRoot>();
|
||||||
|
|
||||||
|
public DbSet<MediaFile> MediaFiles => Set<MediaFiles>();
|
||||||
|
|
||||||
|
public DbSet<MediaFileStream> MediaFileStream => Set<MediaFileStream>();
|
||||||
|
|
||||||
|
public DbSet<Metadata> Metadata => Set<Metadata>();
|
||||||
|
|
||||||
|
public DbSet<MetadataProvider> MetadataProviders => Set<MetadataProvider>();
|
||||||
|
|
||||||
|
public DbSet<MetadataProviderId> MetadataProviderIds => Set<MetadataProviderId>();
|
||||||
|
|
||||||
|
public DbSet<Movie> Movies => Set<Movie>();
|
||||||
|
|
||||||
|
public DbSet<MovieMetadata> MovieMetadata => Set<MovieMetadata>();
|
||||||
|
|
||||||
|
public DbSet<MusicAlbum> MusicAlbums => Set<MusicAlbum>();
|
||||||
|
|
||||||
|
public DbSet<MusicAlbumMetadata> MusicAlbumMetadata => Set<MusicAlbumMetadata>();
|
||||||
|
|
||||||
|
public DbSet<Person> People => Set<Person>();
|
||||||
|
|
||||||
|
public DbSet<PersonRole> PersonRoles => Set<PersonRole>();
|
||||||
|
|
||||||
|
public DbSet<Photo> Photo => Set<Photo>();
|
||||||
|
|
||||||
|
public DbSet<PhotoMetadata> PhotoMetadata => Set<PhotoMetadata>();
|
||||||
|
|
||||||
|
public DbSet<ProviderMapping> ProviderMappings => Set<ProviderMapping>();
|
||||||
|
|
||||||
|
public DbSet<Rating> Ratings => Set<Rating>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Repository for global::Jellyfin.Data.Entities.RatingSource - This is the entity to
|
||||||
|
/// store review ratings, not age ratings.
|
||||||
|
/// </summary>
|
||||||
|
public DbSet<RatingSource> RatingSources => Set<RatingSource>();
|
||||||
|
|
||||||
|
public DbSet<Release> Releases => Set<Release>();
|
||||||
|
|
||||||
|
public DbSet<Season> Seasons => Set<Season>();
|
||||||
|
|
||||||
|
public DbSet<SeasonMetadata> SeasonMetadata => Set<SeasonMetadata>();
|
||||||
|
|
||||||
|
public DbSet<Series> Series => Set<Series>();
|
||||||
|
|
||||||
|
public DbSet<SeriesMetadata> SeriesMetadata => Set<SeriesMetadata();
|
||||||
|
|
||||||
|
public DbSet<Track> Tracks => Set<Track>();
|
||||||
|
|
||||||
|
public DbSet<TrackMetadata> TrackMetadata => Set<TrackMetadata>();*/
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override int SaveChanges()
|
||||||
|
{
|
||||||
|
foreach (var saveEntity in ChangeTracker.Entries()
|
||||||
|
.Where(e => e.State == EntityState.Modified)
|
||||||
|
.Select(entry => entry.Entity)
|
||||||
|
.OfType<IHasConcurrencyToken>())
|
||||||
|
{
|
||||||
|
saveEntity.OnSavingChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.SaveChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
modelBuilder.SetDefaultDateTimeKind(DateTimeKind.Utc);
|
||||||
|
base.OnModelCreating(modelBuilder);
|
||||||
|
|
||||||
|
// Configuration for each entity is in it's own class inside 'ModelConfiguration'.
|
||||||
|
modelBuilder.ApplyConfigurationsFromAssembly(typeof(JellyfinDbContext).Assembly);
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20200514181226_AddActivityLog")]
|
[Migration("20200514181226_AddActivityLog")]
|
||||||
partial class AddActivityLog
|
partial class AddActivityLog
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20200613202153_AddUsers")]
|
[Migration("20200613202153_AddUsers")]
|
||||||
partial class AddUsers
|
partial class AddUsers
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20200728005145_AddDisplayPreferences")]
|
[Migration("20200728005145_AddDisplayPreferences")]
|
||||||
partial class AddDisplayPreferences
|
partial class AddDisplayPreferences
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20200905220533_FixDisplayPreferencesIndex")]
|
[Migration("20200905220533_FixDisplayPreferencesIndex")]
|
||||||
partial class FixDisplayPreferencesIndex
|
partial class FixDisplayPreferencesIndex
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20201004171403_AddMaxActiveSessions")]
|
[Migration("20201004171403_AddMaxActiveSessions")]
|
||||||
partial class AddMaxActiveSessions
|
partial class AddMaxActiveSessions
|
||||||
{
|
{
|
||||||
|
@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20201204223655_AddCustomDisplayPreferences")]
|
[Migration("20201204223655_AddCustomDisplayPreferences")]
|
||||||
partial class AddCustomDisplayPreferences
|
partial class AddCustomDisplayPreferences
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20210320181425_AddIndexesAndCollations")]
|
[Migration("20210320181425_AddIndexesAndCollations")]
|
||||||
partial class AddIndexesAndCollations
|
partial class AddIndexesAndCollations
|
||||||
{
|
{
|
||||||
|
@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20210407110544_NullableCustomPrefValue")]
|
[Migration("20210407110544_NullableCustomPrefValue")]
|
||||||
partial class NullableCustomPrefValue
|
partial class NullableCustomPrefValue
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20210814002109_AddDevices")]
|
[Migration("20210814002109_AddDevices")]
|
||||||
partial class AddDevices
|
partial class AddDevices
|
||||||
{
|
{
|
||||||
|
@ -12,7 +12,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
[Migration("20221022080052_AddIndexActivityLogsDateCreated")]
|
[Migration("20221022080052_AddIndexActivityLogsDateCreated")]
|
||||||
partial class AddIndexActivityLogsDateCreated
|
partial class AddIndexActivityLogsDateCreated
|
||||||
{
|
{
|
||||||
|
@ -4,17 +4,17 @@ using Microsoft.EntityFrameworkCore.Design;
|
|||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The design time factory for <see cref="JellyfinDb"/>.
|
/// The design time factory for <see cref="JellyfinDbContext"/>.
|
||||||
/// This is only used for the creation of migrations and not during runtime.
|
/// This is only used for the creation of migrations and not during runtime.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class DesignTimeJellyfinDbFactory : IDesignTimeDbContextFactory<JellyfinDb>
|
internal class DesignTimeJellyfinDbFactory : IDesignTimeDbContextFactory<JellyfinDbContext>
|
||||||
{
|
{
|
||||||
public JellyfinDb CreateDbContext(string[] args)
|
public JellyfinDbContext CreateDbContext(string[] args)
|
||||||
{
|
{
|
||||||
var optionsBuilder = new DbContextOptionsBuilder<JellyfinDb>();
|
var optionsBuilder = new DbContextOptionsBuilder<JellyfinDbContext>();
|
||||||
optionsBuilder.UseSqlite("Data Source=jellyfin.db");
|
optionsBuilder.UseSqlite("Data Source=jellyfin.db");
|
||||||
|
|
||||||
return new JellyfinDb(optionsBuilder.Options);
|
return new JellyfinDbContext(optionsBuilder.Options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
|
|
||||||
namespace Jellyfin.Server.Implementations.Migrations
|
namespace Jellyfin.Server.Implementations.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(JellyfinDb))]
|
[DbContext(typeof(JellyfinDbContext))]
|
||||||
partial class JellyfinDbModelSnapshot : ModelSnapshot
|
partial class JellyfinDbModelSnapshot : ModelSnapshot
|
||||||
{
|
{
|
||||||
protected override void BuildModel(ModelBuilder modelBuilder)
|
protected override void BuildModel(ModelBuilder modelBuilder)
|
||||||
|
@ -10,13 +10,13 @@ namespace Jellyfin.Server.Implementations.Security
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public class AuthenticationManager : IAuthenticationManager
|
public class AuthenticationManager : IAuthenticationManager
|
||||||
{
|
{
|
||||||
private readonly IDbContextFactory<JellyfinDb> _dbProvider;
|
private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="AuthenticationManager"/> class.
|
/// Initializes a new instance of the <see cref="AuthenticationManager"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dbProvider">The database provider.</param>
|
/// <param name="dbProvider">The database provider.</param>
|
||||||
public AuthenticationManager(IDbContextFactory<JellyfinDb> dbProvider)
|
public AuthenticationManager(IDbContextFactory<JellyfinDbContext> dbProvider)
|
||||||
{
|
{
|
||||||
_dbProvider = dbProvider;
|
_dbProvider = dbProvider;
|
||||||
}
|
}
|
||||||
@ -40,7 +40,6 @@ namespace Jellyfin.Server.Implementations.Security
|
|||||||
await using (dbContext.ConfigureAwait(false))
|
await using (dbContext.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
return await dbContext.ApiKeys
|
return await dbContext.ApiKeys
|
||||||
.AsAsyncEnumerable()
|
|
||||||
.Select(key => new AuthenticationInfo
|
.Select(key => new AuthenticationInfo
|
||||||
{
|
{
|
||||||
AppName = key.Name,
|
AppName = key.Name,
|
||||||
@ -60,7 +59,6 @@ namespace Jellyfin.Server.Implementations.Security
|
|||||||
await using (dbContext.ConfigureAwait(false))
|
await using (dbContext.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
var key = await dbContext.ApiKeys
|
var key = await dbContext.ApiKeys
|
||||||
.AsQueryable()
|
|
||||||
.Where(apiKey => apiKey.AccessToken == accessToken)
|
.Where(apiKey => apiKey.AccessToken == accessToken)
|
||||||
.FirstOrDefaultAsync()
|
.FirstOrDefaultAsync()
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
@ -16,12 +16,12 @@ namespace Jellyfin.Server.Implementations.Security
|
|||||||
{
|
{
|
||||||
public class AuthorizationContext : IAuthorizationContext
|
public class AuthorizationContext : IAuthorizationContext
|
||||||
{
|
{
|
||||||
private readonly IDbContextFactory<JellyfinDb> _jellyfinDbProvider;
|
private readonly IDbContextFactory<JellyfinDbContext> _jellyfinDbProvider;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly IServerApplicationHost _serverApplicationHost;
|
private readonly IServerApplicationHost _serverApplicationHost;
|
||||||
|
|
||||||
public AuthorizationContext(
|
public AuthorizationContext(
|
||||||
IDbContextFactory<JellyfinDb> jellyfinDb,
|
IDbContextFactory<JellyfinDbContext> jellyfinDb,
|
||||||
IUserManager userManager,
|
IUserManager userManager,
|
||||||
IServerApplicationHost serverApplicationHost)
|
IServerApplicationHost serverApplicationHost)
|
||||||
{
|
{
|
||||||
|
@ -15,13 +15,13 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class DisplayPreferencesManager : IDisplayPreferencesManager
|
public class DisplayPreferencesManager : IDisplayPreferencesManager
|
||||||
{
|
{
|
||||||
private readonly JellyfinDb _dbContext;
|
private readonly JellyfinDbContext _dbContext;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="DisplayPreferencesManager"/> class.
|
/// Initializes a new instance of the <see cref="DisplayPreferencesManager"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dbContextFactory">The database context factory.</param>
|
/// <param name="dbContextFactory">The database context factory.</param>
|
||||||
public DisplayPreferencesManager(IDbContextFactory<JellyfinDb> dbContextFactory)
|
public DisplayPreferencesManager(IDbContextFactory<JellyfinDbContext> dbContextFactory)
|
||||||
{
|
{
|
||||||
_dbContext = dbContextFactory.CreateDbContext();
|
_dbContext = dbContextFactory.CreateDbContext();
|
||||||
}
|
}
|
||||||
@ -62,7 +62,6 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
public IList<ItemDisplayPreferences> ListItemDisplayPreferences(Guid userId, string client)
|
public IList<ItemDisplayPreferences> ListItemDisplayPreferences(Guid userId, string client)
|
||||||
{
|
{
|
||||||
return _dbContext.ItemDisplayPreferences
|
return _dbContext.ItemDisplayPreferences
|
||||||
.AsQueryable()
|
|
||||||
.Where(prefs => prefs.UserId.Equals(userId) && !prefs.ItemId.Equals(default) && string.Equals(prefs.Client, client))
|
.Where(prefs => prefs.UserId.Equals(userId) && !prefs.ItemId.Equals(default) && string.Equals(prefs.Client, client))
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
@ -71,7 +70,6 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
public Dictionary<string, string?> ListCustomItemDisplayPreferences(Guid userId, Guid itemId, string client)
|
public Dictionary<string, string?> ListCustomItemDisplayPreferences(Guid userId, Guid itemId, string client)
|
||||||
{
|
{
|
||||||
return _dbContext.CustomItemDisplayPreferences
|
return _dbContext.CustomItemDisplayPreferences
|
||||||
.AsQueryable()
|
|
||||||
.Where(prefs => prefs.UserId.Equals(userId)
|
.Where(prefs => prefs.UserId.Equals(userId)
|
||||||
&& prefs.ItemId.Equals(itemId)
|
&& prefs.ItemId.Equals(itemId)
|
||||||
&& string.Equals(prefs.Client, client))
|
&& string.Equals(prefs.Client, client))
|
||||||
@ -82,7 +80,6 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
public void SetCustomItemDisplayPreferences(Guid userId, Guid itemId, string client, Dictionary<string, string?> customPreferences)
|
public void SetCustomItemDisplayPreferences(Guid userId, Guid itemId, string client, Dictionary<string, string?> customPreferences)
|
||||||
{
|
{
|
||||||
var existingPrefs = _dbContext.CustomItemDisplayPreferences
|
var existingPrefs = _dbContext.CustomItemDisplayPreferences
|
||||||
.AsQueryable()
|
|
||||||
.Where(prefs => prefs.UserId.Equals(userId)
|
.Where(prefs => prefs.UserId.Equals(userId)
|
||||||
&& prefs.ItemId.Equals(itemId)
|
&& prefs.ItemId.Equals(itemId)
|
||||||
&& string.Equals(prefs.Client, client));
|
&& string.Equals(prefs.Client, client));
|
||||||
|
@ -33,7 +33,7 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class UserManager : IUserManager
|
public class UserManager : IUserManager
|
||||||
{
|
{
|
||||||
private readonly IDbContextFactory<JellyfinDb> _dbProvider;
|
private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
|
||||||
private readonly IEventManager _eventManager;
|
private readonly IEventManager _eventManager;
|
||||||
private readonly ICryptoProvider _cryptoProvider;
|
private readonly ICryptoProvider _cryptoProvider;
|
||||||
private readonly INetworkManager _networkManager;
|
private readonly INetworkManager _networkManager;
|
||||||
@ -59,7 +59,7 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
/// <param name="imageProcessor">The image processor.</param>
|
/// <param name="imageProcessor">The image processor.</param>
|
||||||
/// <param name="logger">The logger.</param>
|
/// <param name="logger">The logger.</param>
|
||||||
public UserManager(
|
public UserManager(
|
||||||
IDbContextFactory<JellyfinDb> dbProvider,
|
IDbContextFactory<JellyfinDbContext> dbProvider,
|
||||||
IEventManager eventManager,
|
IEventManager eventManager,
|
||||||
ICryptoProvider cryptoProvider,
|
ICryptoProvider cryptoProvider,
|
||||||
INetworkManager networkManager,
|
INetworkManager networkManager,
|
||||||
@ -85,6 +85,7 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
_users = new ConcurrentDictionary<Guid, User>();
|
_users = new ConcurrentDictionary<Guid, User>();
|
||||||
using var dbContext = _dbProvider.CreateDbContext();
|
using var dbContext = _dbProvider.CreateDbContext();
|
||||||
foreach (var user in dbContext.Users
|
foreach (var user in dbContext.Users
|
||||||
|
.AsSplitQuery()
|
||||||
.Include(user => user.Permissions)
|
.Include(user => user.Permissions)
|
||||||
.Include(user => user.Preferences)
|
.Include(user => user.Preferences)
|
||||||
.Include(user => user.AccessSchedules)
|
.Include(user => user.AccessSchedules)
|
||||||
@ -143,7 +144,6 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
await using (dbContext.ConfigureAwait(false))
|
await using (dbContext.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
if (await dbContext.Users
|
if (await dbContext.Users
|
||||||
.AsQueryable()
|
|
||||||
.AnyAsync(u => u.Username == newName && !u.Id.Equals(user.Id))
|
.AnyAsync(u => u.Username == newName && !u.Id.Equals(user.Id))
|
||||||
.ConfigureAwait(false))
|
.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
@ -172,7 +172,7 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task<User> CreateUserInternalAsync(string name, JellyfinDb dbContext)
|
internal async Task<User> CreateUserInternalAsync(string name, JellyfinDbContext dbContext)
|
||||||
{
|
{
|
||||||
// TODO: Remove after user item data is migrated.
|
// TODO: Remove after user item data is migrated.
|
||||||
var max = await dbContext.Users.AsQueryable().AnyAsync().ConfigureAwait(false)
|
var max = await dbContext.Users.AsQueryable().AnyAsync().ConfigureAwait(false)
|
||||||
@ -886,7 +886,7 @@ namespace Jellyfin.Server.Implementations.Users
|
|||||||
await UpdateUserAsync(user).ConfigureAwait(false);
|
await UpdateUserAsync(user).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateUserInternalAsync(JellyfinDb dbContext, User user)
|
private async Task UpdateUserInternalAsync(JellyfinDbContext dbContext, User user)
|
||||||
{
|
{
|
||||||
dbContext.Users.Update(user);
|
dbContext.Users.Update(user);
|
||||||
_users[user.Id] = user;
|
_users[user.Id] = user;
|
||||||
|
@ -107,7 +107,7 @@ namespace Jellyfin.Server
|
|||||||
yield return typeof(CoreAppHost).Assembly;
|
yield return typeof(CoreAppHost).Assembly;
|
||||||
|
|
||||||
// Jellyfin.Server.Implementations
|
// Jellyfin.Server.Implementations
|
||||||
yield return typeof(JellyfinDb).Assembly;
|
yield return typeof(JellyfinDbContext).Assembly;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -19,7 +19,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
private const string DbFilename = "activitylog.db";
|
private const string DbFilename = "activitylog.db";
|
||||||
|
|
||||||
private readonly ILogger<MigrateActivityLogDb> _logger;
|
private readonly ILogger<MigrateActivityLogDb> _logger;
|
||||||
private readonly IDbContextFactory<JellyfinDb> _provider;
|
private readonly IDbContextFactory<JellyfinDbContext> _provider;
|
||||||
private readonly IServerApplicationPaths _paths;
|
private readonly IServerApplicationPaths _paths;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -28,7 +28,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
/// <param name="logger">The logger.</param>
|
/// <param name="logger">The logger.</param>
|
||||||
/// <param name="paths">The server application paths.</param>
|
/// <param name="paths">The server application paths.</param>
|
||||||
/// <param name="provider">The database provider.</param>
|
/// <param name="provider">The database provider.</param>
|
||||||
public MigrateActivityLogDb(ILogger<MigrateActivityLogDb> logger, IServerApplicationPaths paths, IDbContextFactory<JellyfinDb> provider)
|
public MigrateActivityLogDb(ILogger<MigrateActivityLogDb> logger, IServerApplicationPaths paths, IDbContextFactory<JellyfinDbContext> provider)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_provider = provider;
|
_provider = provider;
|
||||||
|
@ -20,7 +20,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
private const string DbFilename = "authentication.db";
|
private const string DbFilename = "authentication.db";
|
||||||
|
|
||||||
private readonly ILogger<MigrateAuthenticationDb> _logger;
|
private readonly ILogger<MigrateAuthenticationDb> _logger;
|
||||||
private readonly IDbContextFactory<JellyfinDb> _dbProvider;
|
private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
|
||||||
private readonly IServerApplicationPaths _appPaths;
|
private readonly IServerApplicationPaths _appPaths;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
/// <param name="userManager">The user manager.</param>
|
/// <param name="userManager">The user manager.</param>
|
||||||
public MigrateAuthenticationDb(
|
public MigrateAuthenticationDb(
|
||||||
ILogger<MigrateAuthenticationDb> logger,
|
ILogger<MigrateAuthenticationDb> logger,
|
||||||
IDbContextFactory<JellyfinDb> dbProvider,
|
IDbContextFactory<JellyfinDbContext> dbProvider,
|
||||||
IServerApplicationPaths appPaths,
|
IServerApplicationPaths appPaths,
|
||||||
IUserManager userManager)
|
IUserManager userManager)
|
||||||
{
|
{
|
||||||
|
@ -25,7 +25,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
|
|
||||||
private readonly ILogger<MigrateDisplayPreferencesDb> _logger;
|
private readonly ILogger<MigrateDisplayPreferencesDb> _logger;
|
||||||
private readonly IServerApplicationPaths _paths;
|
private readonly IServerApplicationPaths _paths;
|
||||||
private readonly IDbContextFactory<JellyfinDb> _provider;
|
private readonly IDbContextFactory<JellyfinDbContext> _provider;
|
||||||
private readonly JsonSerializerOptions _jsonOptions;
|
private readonly JsonSerializerOptions _jsonOptions;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
public MigrateDisplayPreferencesDb(
|
public MigrateDisplayPreferencesDb(
|
||||||
ILogger<MigrateDisplayPreferencesDb> logger,
|
ILogger<MigrateDisplayPreferencesDb> logger,
|
||||||
IServerApplicationPaths paths,
|
IServerApplicationPaths paths,
|
||||||
IDbContextFactory<JellyfinDb> provider,
|
IDbContextFactory<JellyfinDbContext> provider,
|
||||||
IUserManager userManager)
|
IUserManager userManager)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
@ -27,7 +27,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
|
|
||||||
private readonly ILogger<MigrateUserDb> _logger;
|
private readonly ILogger<MigrateUserDb> _logger;
|
||||||
private readonly IServerApplicationPaths _paths;
|
private readonly IServerApplicationPaths _paths;
|
||||||
private readonly IDbContextFactory<JellyfinDb> _provider;
|
private readonly IDbContextFactory<JellyfinDbContext> _provider;
|
||||||
private readonly IXmlSerializer _xmlSerializer;
|
private readonly IXmlSerializer _xmlSerializer;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -40,7 +40,7 @@ namespace Jellyfin.Server.Migrations.Routines
|
|||||||
public MigrateUserDb(
|
public MigrateUserDb(
|
||||||
ILogger<MigrateUserDb> logger,
|
ILogger<MigrateUserDb> logger,
|
||||||
IServerApplicationPaths paths,
|
IServerApplicationPaths paths,
|
||||||
IDbContextFactory<JellyfinDb> provider,
|
IDbContextFactory<JellyfinDbContext> provider,
|
||||||
IXmlSerializer xmlSerializer)
|
IXmlSerializer xmlSerializer)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
@ -247,7 +247,7 @@ namespace Jellyfin.Server
|
|||||||
{
|
{
|
||||||
_logger.LogInformation("Running query planner optimizations in the database... This might take a while");
|
_logger.LogInformation("Running query planner optimizations in the database... This might take a while");
|
||||||
// Run before disposing the application
|
// Run before disposing the application
|
||||||
var context = await appHost.ServiceProvider.GetRequiredService<IDbContextFactory<JellyfinDb>>().CreateDbContextAsync().ConfigureAwait(false);
|
var context = await appHost.ServiceProvider.GetRequiredService<IDbContextFactory<JellyfinDbContext>>().CreateDbContextAsync().ConfigureAwait(false);
|
||||||
await using (context.ConfigureAwait(false))
|
await using (context.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
if (context.Database.IsSqlite())
|
if (context.Database.IsSqlite())
|
||||||
|
@ -119,7 +119,7 @@ namespace Jellyfin.Server
|
|||||||
.ConfigurePrimaryHttpMessageHandler(defaultHttpClientHandlerDelegate);
|
.ConfigurePrimaryHttpMessageHandler(defaultHttpClientHandlerDelegate);
|
||||||
|
|
||||||
services.AddHealthChecks()
|
services.AddHealthChecks()
|
||||||
.AddCheck<DbContextFactoryHealthCheck<JellyfinDb>>(nameof(JellyfinDb));
|
.AddCheck<DbContextFactoryHealthCheck<JellyfinDbContext>>(nameof(JellyfinDbContext));
|
||||||
|
|
||||||
services.AddHlsPlaylistGenerator();
|
services.AddHlsPlaylistGenerator();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user