aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server.Implementations/Item
diff options
context:
space:
mode:
authorJPVenson <github@jpb.email>2024-10-11 11:11:15 +0000
committerJPVenson <github@jpb.email>2024-10-11 11:11:15 +0000
commitb73985e04f76924ec91692890687461bcfdb4e11 (patch)
tree4b309b212d86e03e9d74d9a2025a520018d7eb7f /Jellyfin.Server.Implementations/Item
parentf397fc5b98468a370fb51696df608dfbb2f14213 (diff)
Expanded People architecture and fixed migration
Diffstat (limited to 'Jellyfin.Server.Implementations/Item')
-rw-r--r--Jellyfin.Server.Implementations/Item/BaseItemRepository.cs9
-rw-r--r--Jellyfin.Server.Implementations/Item/PeopleRepository.cs47
2 files changed, 37 insertions, 19 deletions
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index 208bb41987..36d976a436 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -81,7 +81,8 @@ public sealed class BaseItemRepository(
using var context = dbProvider.CreateDbContext();
using var transaction = context.Database.BeginTransaction();
- context.Peoples.Where(e => e.ItemId == id).ExecuteDelete();
+ context.PeopleBaseItemMap.Where(e => e.ItemId == id).ExecuteDelete();
+ context.Peoples.Where(e => e.BaseItems!.Count == 0).ExecuteDelete();
context.Chapters.Where(e => e.ItemId == id).ExecuteDelete();
context.MediaStreamInfos.Where(e => e.ItemId == id).ExecuteDelete();
context.AncestorIds.Where(e => e.ItemId == id).ExecuteDelete();
@@ -602,13 +603,13 @@ public sealed class BaseItemRepository(
{
baseQuery = baseQuery
.Where(e =>
- context.Peoples.Where(w => context.BaseItems.Where(r => filter.PersonIds.Contains(r.Id)).Any(f => f.Name == w.Name))
+ context.PeopleBaseItemMap.Where(w => context.BaseItems.Where(r => filter.PersonIds.Contains(r.Id)).Any(f => f.Name == w.People.Name))
.Any(f => f.ItemId == e.Id));
}
if (!string.IsNullOrWhiteSpace(filter.Person))
{
- baseQuery = baseQuery.Where(e => e.Peoples!.Any(f => f.Name == filter.Person));
+ baseQuery = baseQuery.Where(e => e.Peoples!.Any(f => f.People.Name == filter.Person));
}
if (!string.IsNullOrWhiteSpace(filter.MinSortName))
@@ -934,7 +935,7 @@ public sealed class BaseItemRepository(
if (filter.IsDeadPerson.HasValue && filter.IsDeadPerson.Value)
{
baseQuery = baseQuery
- .Where(e => !e.Peoples!.Any(f => f.Name == e.Name));
+ .Where(e => !e.Peoples!.Any(f => f.People.Name == e.Name));
}
if (filter.Years.Length == 1)
diff --git a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
index 57f0503b9e..dee87f48f9 100644
--- a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
@@ -10,6 +10,7 @@ using MediaBrowser.Controller.Persistence;
using Microsoft.EntityFrameworkCore;
namespace Jellyfin.Server.Implementations.Item;
+#pragma warning disable RS0030 // Do not use banned APIs
/// <summary>
/// Manager for handling people.
@@ -28,7 +29,7 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider) :
using var context = _dbProvider.CreateDbContext();
var dbQuery = TranslateQuery(context.Peoples.AsNoTracking(), context, filter);
- dbQuery = dbQuery.OrderBy(e => e.ListOrder);
+ // dbQuery = dbQuery.OrderBy(e => e.ListOrder);
if (filter.Limit > 0)
{
dbQuery = dbQuery.Take(filter.Limit);
@@ -43,7 +44,7 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider) :
using var context = _dbProvider.CreateDbContext();
var dbQuery = TranslateQuery(context.Peoples.AsNoTracking(), context, filter);
- dbQuery = dbQuery.OrderBy(e => e.ListOrder);
+ // dbQuery = dbQuery.OrderBy(e => e.ListOrder);
if (filter.Limit > 0)
{
dbQuery = dbQuery.Take(filter.Limit);
@@ -58,7 +59,29 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider) :
using var context = _dbProvider.CreateDbContext();
using var transaction = context.Database.BeginTransaction();
- context.Peoples.Where(e => e.ItemId.Equals(itemId)).ExecuteDelete();
+ context.PeopleBaseItemMap.Where(e => e.ItemId == itemId).ExecuteDelete();
+ foreach (var item in people)
+ {
+ var personEntity = Map(item);
+ var existingEntity = context.Peoples.FirstOrDefault(e => e.Id == personEntity.Id);
+ if (existingEntity is null)
+ {
+ context.Peoples.Add(personEntity);
+ existingEntity = personEntity;
+ }
+
+ context.PeopleBaseItemMap.Add(new PeopleBaseItemMap()
+ {
+ Item = null!,
+ ItemId = itemId,
+ People = existingEntity,
+ PeopleId = existingEntity.Id,
+ ListOrder = item.SortOrder,
+ SortOrder = item.SortOrder,
+ Role = item.Role
+ });
+ }
+
context.Peoples.AddRange(people.Select(Map));
context.SaveChanges();
transaction.Commit();
@@ -68,10 +91,8 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider) :
{
var personInfo = new PersonInfo()
{
- ItemId = people.ItemId,
+ Id = people.Id,
Name = people.Name,
- Role = people.Role,
- SortOrder = people.SortOrder,
};
if (Enum.TryParse<PersonKind>(people.PersonType, out var kind))
{
@@ -85,13 +106,9 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider) :
{
var personInfo = new People()
{
- ItemId = people.ItemId,
Name = people.Name,
- Role = people.Role,
- SortOrder = people.SortOrder,
PersonType = people.Type.ToString(),
- Item = null!,
- ListOrder = people.SortOrder
+ Id = people.Id,
};
return personInfo;
@@ -108,12 +125,12 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider) :
if (!filter.ItemId.IsEmpty())
{
- query = query.Where(e => e.ItemId.Equals(filter.ItemId));
+ query = query.Where(e => e.BaseItems!.Any(w => w.ItemId.Equals(filter.ItemId)));
}
if (!filter.AppearsInItemId.IsEmpty())
{
- query = query.Where(e => context.Peoples.Where(f => f.ItemId.Equals(filter.AppearsInItemId)).Select(e => e.Name).Contains(e.Name));
+ query = query.Where(e => e.BaseItems!.Any(w => w.ItemId.Equals(filter.AppearsInItemId)));
}
var queryPersonTypes = filter.PersonTypes.Where(IsValidPersonType).ToList();
@@ -129,9 +146,9 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider) :
query = query.Where(e => !queryPersonTypes.Contains(e.PersonType));
}
- if (filter.MaxListOrder.HasValue)
+ if (filter.MaxListOrder.HasValue && !filter.ItemId.IsEmpty())
{
- query = query.Where(e => e.ListOrder <= filter.MaxListOrder.Value);
+ query = query.Where(e => e.BaseItems!.First(w => w.ItemId == filter.ItemId).ListOrder <= filter.MaxListOrder.Value);
}
if (!string.IsNullOrWhiteSpace(filter.NameContains))