using System; using System.Collections.Generic; using System.Linq; using Jellyfin.Database.Implementations; using Jellyfin.Database.Implementations.Entities; using MediaBrowser.Controller; using Microsoft.EntityFrameworkCore; namespace Jellyfin.Server.Implementations.Users; /// /// Manages the storage and retrieval of display preferences through Entity Framework. /// public sealed class DisplayPreferencesManager : IDisplayPreferencesManager { private readonly IDbContextFactory _dbContextFactory; /// /// Initializes a new instance of the class. /// /// The database context factory. public DisplayPreferencesManager(IDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; } /// public DisplayPreferences GetDisplayPreferences(Guid userId, Guid itemId, string client) { using var dbContext = _dbContextFactory.CreateDbContext(); var prefs = dbContext.DisplayPreferences .Include(pref => pref.HomeSections) .FirstOrDefault(pref => pref.UserId.Equals(userId) && pref.Client == client && pref.ItemId.Equals(itemId)); if (prefs is null) { prefs = new DisplayPreferences(userId, itemId, client); dbContext.DisplayPreferences.Add(prefs); dbContext.SaveChanges(); } return prefs; } /// public ItemDisplayPreferences GetItemDisplayPreferences(Guid userId, Guid itemId, string client) { using var dbContext = _dbContextFactory.CreateDbContext(); var prefs = dbContext.ItemDisplayPreferences .FirstOrDefault(pref => pref.UserId.Equals(userId) && pref.ItemId.Equals(itemId) && pref.Client == client); if (prefs is null) { prefs = new ItemDisplayPreferences(userId, Guid.Empty, client); dbContext.ItemDisplayPreferences.Add(prefs); dbContext.SaveChanges(); } return prefs; } /// public IList ListItemDisplayPreferences(Guid userId, string client) { using var dbContext = _dbContextFactory.CreateDbContext(); return dbContext.ItemDisplayPreferences .Where(prefs => prefs.UserId.Equals(userId) && !prefs.ItemId.Equals(default) && prefs.Client == client) .ToList(); } /// public Dictionary ListCustomItemDisplayPreferences(Guid userId, Guid itemId, string client) { using var dbContext = _dbContextFactory.CreateDbContext(); return dbContext.CustomItemDisplayPreferences .Where(prefs => prefs.UserId.Equals(userId) && prefs.ItemId.Equals(itemId) && prefs.Client == client) .ToDictionary(prefs => prefs.Key, prefs => prefs.Value); } /// public void SetCustomItemDisplayPreferences(Guid userId, Guid itemId, string client, Dictionary customPreferences) { using var dbContext = _dbContextFactory.CreateDbContext(); dbContext.CustomItemDisplayPreferences.Where(prefs => prefs.UserId.Equals(userId) && prefs.ItemId.Equals(itemId) && prefs.Client == client) .ExecuteDelete(); foreach (var (key, value) in customPreferences) { dbContext.CustomItemDisplayPreferences .Add(new CustomItemDisplayPreferences(userId, itemId, client, key, value)); } dbContext.SaveChanges(); } /// public void UpdateDisplayPreferences(DisplayPreferences displayPreferences) { using var dbContext = _dbContextFactory.CreateDbContext(); dbContext.DisplayPreferences.Attach(displayPreferences).State = EntityState.Modified; dbContext.SaveChanges(); } /// public void UpdateItemDisplayPreferences(ItemDisplayPreferences itemDisplayPreferences) { using var dbContext = _dbContextFactory.CreateDbContext(); dbContext.ItemDisplayPreferences.Attach(itemDisplayPreferences).State = EntityState.Modified; dbContext.SaveChanges(); } }