using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Jellyfin.Database.Providers.Sqlite.Migrations
{
///
public partial class AddLinkedChildrenTable : Migration
{
///
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "LinkedChildren",
columns: table => new
{
ParentId = table.Column(type: "TEXT", nullable: false),
ChildId = table.Column(type: "TEXT", nullable: false),
ChildType = table.Column(type: "INTEGER", nullable: false),
SortOrder = table.Column(type: "INTEGER", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_LinkedChildren", x => new { x.ParentId, x.ChildId });
table.ForeignKey(
name: "FK_LinkedChildren_BaseItems_ChildId",
column: x => x.ChildId,
principalTable: "BaseItems",
principalColumn: "Id");
table.ForeignKey(
name: "FK_LinkedChildren_BaseItems_ParentId",
column: x => x.ParentId,
principalTable: "BaseItems",
principalColumn: "Id");
});
migrationBuilder.CreateIndex(
name: "IX_LinkedChildren_ChildId",
table: "LinkedChildren",
column: "ChildId");
migrationBuilder.CreateIndex(
name: "IX_LinkedChildren_ChildId_ChildType",
table: "LinkedChildren",
columns: new[] { "ChildId", "ChildType" });
migrationBuilder.CreateIndex(
name: "IX_LinkedChildren_ParentId",
table: "LinkedChildren",
column: "ParentId");
migrationBuilder.CreateIndex(
name: "IX_LinkedChildren_ParentId_ChildType",
table: "LinkedChildren",
columns: new[] { "ParentId", "ChildType" });
migrationBuilder.CreateIndex(
name: "IX_LinkedChildren_ParentId_SortOrder",
table: "LinkedChildren",
columns: new[] { "ParentId", "SortOrder" });
}
///
protected override void Down(MigrationBuilder migrationBuilder)
{
// Re-populate LinkedChildren data back into the JSON Data column before dropping the table
migrationBuilder.Sql(
@"UPDATE BaseItems
SET Data = CASE
WHEN Data IS NULL OR Data = '' THEN
json_object('LinkedChildren', (
SELECT json_group_array(
json_object(
'Path', Child.Path,
'Type', CASE LC.ChildType
WHEN 0 THEN 'Manual'
WHEN 1 THEN 'Shortcut'
ELSE 'Manual'
END,
'ItemId', LOWER(REPLACE(LC.ChildId, '-', ''))
)
)
FROM LinkedChildren LC
INNER JOIN BaseItems Child ON LC.ChildId = Child.Id
WHERE LC.ParentId = BaseItems.Id
ORDER BY LC.SortOrder
))
ELSE
json_set(
Data,
'$.LinkedChildren',
(
SELECT json_group_array(
json_object(
'Path', Child.Path,
'Type', CASE LC.ChildType
WHEN 0 THEN 'Manual'
WHEN 1 THEN 'Shortcut'
ELSE 'Manual'
END,
'ItemId', LOWER(REPLACE(LC.ChildId, '-', ''))
)
)
FROM LinkedChildren LC
INNER JOIN BaseItems Child ON LC.ChildId = Child.Id
WHERE LC.ParentId = BaseItems.Id
ORDER BY LC.SortOrder
)
)
END
WHERE EXISTS (
SELECT 1
FROM LinkedChildren LC
WHERE LC.ParentId = BaseItems.Id
)");
migrationBuilder.DropTable(
name: "LinkedChildren");
migrationBuilder.Sql(
@"DELETE FROM __EFMigrationsHistory
WHERE MigrationId = '20260113120000_MigrateLinkedChildren'");
}
}
}