mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-19 20:54:20 +01:00
Migrate User DB to EF Core
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#pragma warning disable CS1591
|
||||
#pragma warning disable CS1591
|
||||
#pragma warning disable SA1601
|
||||
|
||||
// <auto-generated />
|
||||
@@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
namespace Jellyfin.Server.Implementations.Migrations
|
||||
{
|
||||
[DbContext(typeof(JellyfinDb))]
|
||||
[Migration("20200504195702_UserSchema")]
|
||||
partial class UserSchema
|
||||
[Migration("20200517002411_AddUsers")]
|
||||
partial class AddUsers
|
||||
{
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
@@ -22,6 +22,31 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.HasDefaultSchema("jellyfin")
|
||||
.HasAnnotation("ProductVersion", "3.1.3");
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.AccessSchedule", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int>("DayOfWeek")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<double>("EndHour")
|
||||
.HasColumnType("REAL");
|
||||
|
||||
b.Property<double>("StartHour")
|
||||
.HasColumnType("REAL");
|
||||
|
||||
b.Property<Guid>("UserId")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("AccessSchedule");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.ActivityLog", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
@@ -65,17 +90,17 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("ActivityLog");
|
||||
b.ToTable("ActivityLogs");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Group", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
b.Property<Guid>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<int?>("Group_Groups_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Group_Groups_Guid")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
@@ -88,9 +113,27 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Group_Groups_Id");
|
||||
b.HasIndex("Group_Groups_Guid");
|
||||
|
||||
b.ToTable("Group");
|
||||
b.ToTable("Groups");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.ImageInfo", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<DateTime>("LastModified")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("Path")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("ImageInfo");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Permission", b =>
|
||||
@@ -102,11 +145,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
b.Property<int>("Kind")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("Permission_GroupPermissions_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Permission_GroupPermissions_Id")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<int?>("Permission_Permissions_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Permission_Permissions_Guid")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<uint>("RowVersion")
|
||||
.IsConcurrencyToken()
|
||||
@@ -119,9 +162,9 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasIndex("Permission_GroupPermissions_Id");
|
||||
|
||||
b.HasIndex("Permission_Permissions_Id");
|
||||
b.HasIndex("Permission_Permissions_Guid");
|
||||
|
||||
b.ToTable("Permission");
|
||||
b.ToTable("Permissions");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Preference", b =>
|
||||
@@ -133,8 +176,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
b.Property<int>("Kind")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("Preference_Preferences_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Preference_Preferences_Guid")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<Guid?>("Preference_Preferences_Id")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<uint>("RowVersion")
|
||||
.IsConcurrencyToken()
|
||||
@@ -147,9 +193,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Preference_Preferences_Guid");
|
||||
|
||||
b.HasIndex("Preference_Preferences_Id");
|
||||
|
||||
b.ToTable("Preference");
|
||||
b.ToTable("Preferences");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.ProviderMapping", b =>
|
||||
@@ -163,8 +211,8 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<int?>("ProviderMapping_ProviderMappings_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("ProviderMapping_ProviderMappings_Id")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("ProviderName")
|
||||
.IsRequired()
|
||||
@@ -189,12 +237,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.User", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
b.Property<Guid>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("AudioLanguagePreference")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
@@ -203,71 +250,86 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
b.Property<bool?>("DisplayCollectionsView")
|
||||
b.Property<bool>("DisplayCollectionsView")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("DisplayMissingEpisodes")
|
||||
b.Property<bool>("DisplayMissingEpisodes")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("EnableNextEpisodeAutoPlay")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("EnableUserPreferenceAccess")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("GroupedFolders")
|
||||
b.Property<string>("EasyPassword")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<bool?>("HidePlayedInLatest")
|
||||
b.Property<bool>("EnableAutoLogin")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableLocalPassword")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableNextEpisodeAutoPlay")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableUserPreferenceAccess")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("HidePlayedInLatest")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<long>("InternalId")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int>("InvalidLoginAttemptCount")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("LatestItemExcludes")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
b.Property<DateTime>("LastActivityDate")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<DateTime>("LastLoginDate")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<int?>("LoginAttemptsBeforeLockout")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("MaxParentalAgeRating")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("MustUpdatePassword")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("MyMediaExcludes")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<string>("OrderedViews")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<string>("Password")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<string>("PasswordResetProviderId")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
b.Property<bool>("PlayDefaultAudioTrack")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("RememberAudioSelections")
|
||||
b.Property<int?>("ProfileImageId")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("RememberSubtitleSelections")
|
||||
b.Property<bool>("RememberAudioSelections")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("RememberSubtitleSelections")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("RemoteClientBitrateLimit")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<uint>("RowVersion")
|
||||
.IsConcurrencyToken()
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("SubtitleLanguagePrefernce")
|
||||
b.Property<string>("SubtitleLanguagePreference")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
b.Property<string>("SubtitleMode")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
b.Property<int>("SubtitleMode")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("Username")
|
||||
.IsRequired()
|
||||
@@ -276,34 +338,45 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("User");
|
||||
b.HasIndex("ProfileImageId");
|
||||
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.AccessSchedule", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("AccessSchedules")
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Group", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("Groups")
|
||||
.HasForeignKey("Group_Groups_Id");
|
||||
.HasForeignKey("Group_Groups_Guid");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Permission", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.Group", null)
|
||||
.WithMany("GroupPermissions")
|
||||
.WithMany("Permissions")
|
||||
.HasForeignKey("Permission_GroupPermissions_Id");
|
||||
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("Permissions")
|
||||
.HasForeignKey("Permission_Permissions_Id");
|
||||
.HasForeignKey("Permission_Permissions_Guid");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Preference", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.Group", null)
|
||||
.WithMany("Preferences")
|
||||
.HasForeignKey("Preference_Preferences_Id");
|
||||
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("Preferences")
|
||||
.HasForeignKey("Preference_Preferences_Guid");
|
||||
|
||||
b.HasOne("Jellyfin.Data.Entities.Group", null)
|
||||
.WithMany("Preferences")
|
||||
.HasForeignKey("Preference_Preferences_Id");
|
||||
});
|
||||
@@ -318,6 +391,13 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.WithMany("ProviderMappings")
|
||||
.HasForeignKey("ProviderMapping_ProviderMappings_Id");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.User", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.ImageInfo", "ProfileImage")
|
||||
.WithMany()
|
||||
.HasForeignKey("ProfileImageId");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
@@ -1,74 +1,125 @@
|
||||
#pragma warning disable CS1591
|
||||
#pragma warning disable CS1591
|
||||
#pragma warning disable SA1601
|
||||
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Migrations
|
||||
{
|
||||
public partial class UserSchema : Migration
|
||||
public partial class AddUsers : Migration
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "User",
|
||||
name: "ImageInfo",
|
||||
schema: "jellyfin",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(nullable: false)
|
||||
.Annotation("Sqlite:Autoincrement", true),
|
||||
Path = table.Column<string>(nullable: false),
|
||||
LastModified = table.Column<DateTime>(nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ImageInfo", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Users",
|
||||
schema: "jellyfin",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(nullable: false),
|
||||
Username = table.Column<string>(maxLength: 255, nullable: false),
|
||||
Password = table.Column<string>(maxLength: 65535, nullable: true),
|
||||
EasyPassword = table.Column<string>(maxLength: 65535, nullable: true),
|
||||
MustUpdatePassword = table.Column<bool>(nullable: false),
|
||||
AudioLanguagePreference = table.Column<string>(maxLength: 255, nullable: false),
|
||||
AudioLanguagePreference = table.Column<string>(maxLength: 255, nullable: true),
|
||||
AuthenticationProviderId = table.Column<string>(maxLength: 255, nullable: false),
|
||||
GroupedFolders = table.Column<string>(maxLength: 65535, nullable: true),
|
||||
PasswordResetProviderId = table.Column<string>(maxLength: 255, nullable: false),
|
||||
InvalidLoginAttemptCount = table.Column<int>(nullable: false),
|
||||
LatestItemExcludes = table.Column<string>(maxLength: 65535, nullable: true),
|
||||
LastActivityDate = table.Column<DateTime>(nullable: false),
|
||||
LastLoginDate = table.Column<DateTime>(nullable: false),
|
||||
LoginAttemptsBeforeLockout = table.Column<int>(nullable: true),
|
||||
MyMediaExcludes = table.Column<string>(maxLength: 65535, nullable: true),
|
||||
OrderedViews = table.Column<string>(maxLength: 65535, nullable: true),
|
||||
SubtitleMode = table.Column<string>(maxLength: 255, nullable: false),
|
||||
SubtitleMode = table.Column<int>(nullable: false),
|
||||
PlayDefaultAudioTrack = table.Column<bool>(nullable: false),
|
||||
SubtitleLanguagePrefernce = table.Column<string>(maxLength: 255, nullable: true),
|
||||
DisplayMissingEpisodes = table.Column<bool>(nullable: true),
|
||||
DisplayCollectionsView = table.Column<bool>(nullable: true),
|
||||
HidePlayedInLatest = table.Column<bool>(nullable: true),
|
||||
RememberAudioSelections = table.Column<bool>(nullable: true),
|
||||
RememberSubtitleSelections = table.Column<bool>(nullable: true),
|
||||
EnableNextEpisodeAutoPlay = table.Column<bool>(nullable: true),
|
||||
EnableUserPreferenceAccess = table.Column<bool>(nullable: true),
|
||||
SubtitleLanguagePreference = table.Column<string>(maxLength: 255, nullable: true),
|
||||
DisplayMissingEpisodes = table.Column<bool>(nullable: false),
|
||||
DisplayCollectionsView = table.Column<bool>(nullable: false),
|
||||
EnableLocalPassword = table.Column<bool>(nullable: false),
|
||||
HidePlayedInLatest = table.Column<bool>(nullable: false),
|
||||
RememberAudioSelections = table.Column<bool>(nullable: false),
|
||||
RememberSubtitleSelections = table.Column<bool>(nullable: false),
|
||||
EnableNextEpisodeAutoPlay = table.Column<bool>(nullable: false),
|
||||
EnableAutoLogin = table.Column<bool>(nullable: false),
|
||||
EnableUserPreferenceAccess = table.Column<bool>(nullable: false),
|
||||
MaxParentalAgeRating = table.Column<int>(nullable: true),
|
||||
RemoteClientBitrateLimit = table.Column<int>(nullable: true),
|
||||
InternalId = table.Column<long>(nullable: false),
|
||||
ProfileImageId = table.Column<int>(nullable: true),
|
||||
RowVersion = table.Column<uint>(nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_User", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Group",
|
||||
schema: "jellyfin",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(nullable: false)
|
||||
.Annotation("Sqlite:Autoincrement", true),
|
||||
Name = table.Column<string>(maxLength: 255, nullable: false),
|
||||
RowVersion = table.Column<uint>(nullable: false),
|
||||
Group_Groups_Id = table.Column<int>(nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Group", x => x.Id);
|
||||
table.PrimaryKey("PK_Users", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Group_User_Group_Groups_Id",
|
||||
column: x => x.Group_Groups_Id,
|
||||
name: "FK_Users_ImageInfo_ProfileImageId",
|
||||
column: x => x.ProfileImageId,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "User",
|
||||
principalTable: "ImageInfo",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Permission",
|
||||
name: "AccessSchedule",
|
||||
schema: "jellyfin",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(nullable: false)
|
||||
.Annotation("Sqlite:Autoincrement", true),
|
||||
UserId = table.Column<Guid>(nullable: false),
|
||||
DayOfWeek = table.Column<int>(nullable: false),
|
||||
StartHour = table.Column<double>(nullable: false),
|
||||
EndHour = table.Column<double>(nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_AccessSchedule", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_AccessSchedule_Users_UserId",
|
||||
column: x => x.UserId,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Groups",
|
||||
schema: "jellyfin",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(nullable: false),
|
||||
Name = table.Column<string>(maxLength: 255, nullable: false),
|
||||
RowVersion = table.Column<uint>(nullable: false),
|
||||
Group_Groups_Guid = table.Column<Guid>(nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Groups", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Groups_Users_Group_Groups_Guid",
|
||||
column: x => x.Group_Groups_Guid,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Permissions",
|
||||
schema: "jellyfin",
|
||||
columns: table => new
|
||||
{
|
||||
@@ -77,30 +128,30 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
Kind = table.Column<int>(nullable: false),
|
||||
Value = table.Column<bool>(nullable: false),
|
||||
RowVersion = table.Column<uint>(nullable: false),
|
||||
Permission_GroupPermissions_Id = table.Column<int>(nullable: true),
|
||||
Permission_Permissions_Id = table.Column<int>(nullable: true)
|
||||
Permission_GroupPermissions_Id = table.Column<Guid>(nullable: true),
|
||||
Permission_Permissions_Guid = table.Column<Guid>(nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Permission", x => x.Id);
|
||||
table.PrimaryKey("PK_Permissions", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Permission_Group_Permission_GroupPermissions_Id",
|
||||
name: "FK_Permissions_Groups_Permission_GroupPermissions_Id",
|
||||
column: x => x.Permission_GroupPermissions_Id,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "Group",
|
||||
principalTable: "Groups",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_Permission_User_Permission_Permissions_Id",
|
||||
column: x => x.Permission_Permissions_Id,
|
||||
name: "FK_Permissions_Users_Permission_Permissions_Guid",
|
||||
column: x => x.Permission_Permissions_Guid,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "User",
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Preference",
|
||||
name: "Preferences",
|
||||
schema: "jellyfin",
|
||||
columns: table => new
|
||||
{
|
||||
@@ -109,23 +160,24 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
Kind = table.Column<int>(nullable: false),
|
||||
Value = table.Column<string>(maxLength: 65535, nullable: false),
|
||||
RowVersion = table.Column<uint>(nullable: false),
|
||||
Preference_Preferences_Id = table.Column<int>(nullable: true)
|
||||
Preference_Preferences_Guid = table.Column<Guid>(nullable: true),
|
||||
Preference_Preferences_Id = table.Column<Guid>(nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Preference", x => x.Id);
|
||||
table.PrimaryKey("PK_Preferences", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_Preference_Group_Preference_Preferences_Id",
|
||||
column: x => x.Preference_Preferences_Id,
|
||||
name: "FK_Preferences_Users_Preference_Preferences_Guid",
|
||||
column: x => x.Preference_Preferences_Guid,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "Group",
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_Preference_User_Preference_Preferences_Id",
|
||||
name: "FK_Preferences_Groups_Preference_Preferences_Id",
|
||||
column: x => x.Preference_Preferences_Id,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "User",
|
||||
principalTable: "Groups",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
@@ -141,49 +193,61 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
ProviderSecrets = table.Column<string>(maxLength: 65535, nullable: false),
|
||||
ProviderData = table.Column<string>(maxLength: 65535, nullable: false),
|
||||
RowVersion = table.Column<uint>(nullable: false),
|
||||
ProviderMapping_ProviderMappings_Id = table.Column<int>(nullable: true)
|
||||
ProviderMapping_ProviderMappings_Id = table.Column<Guid>(nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ProviderMapping", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_ProviderMapping_Group_ProviderMapping_ProviderMappings_Id",
|
||||
name: "FK_ProviderMapping_Groups_ProviderMapping_ProviderMappings_Id",
|
||||
column: x => x.ProviderMapping_ProviderMappings_Id,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "Group",
|
||||
principalTable: "Groups",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_ProviderMapping_User_ProviderMapping_ProviderMappings_Id",
|
||||
name: "FK_ProviderMapping_Users_ProviderMapping_ProviderMappings_Id",
|
||||
column: x => x.ProviderMapping_ProviderMappings_Id,
|
||||
principalSchema: "jellyfin",
|
||||
principalTable: "User",
|
||||
principalTable: "Users",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Group_Group_Groups_Id",
|
||||
name: "IX_AccessSchedule_UserId",
|
||||
schema: "jellyfin",
|
||||
table: "Group",
|
||||
column: "Group_Groups_Id");
|
||||
table: "AccessSchedule",
|
||||
column: "UserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Permission_Permission_GroupPermissions_Id",
|
||||
name: "IX_Groups_Group_Groups_Guid",
|
||||
schema: "jellyfin",
|
||||
table: "Permission",
|
||||
table: "Groups",
|
||||
column: "Group_Groups_Guid");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Permissions_Permission_GroupPermissions_Id",
|
||||
schema: "jellyfin",
|
||||
table: "Permissions",
|
||||
column: "Permission_GroupPermissions_Id");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Permission_Permission_Permissions_Id",
|
||||
name: "IX_Permissions_Permission_Permissions_Guid",
|
||||
schema: "jellyfin",
|
||||
table: "Permission",
|
||||
column: "Permission_Permissions_Id");
|
||||
table: "Permissions",
|
||||
column: "Permission_Permissions_Guid");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Preference_Preference_Preferences_Id",
|
||||
name: "IX_Preferences_Preference_Preferences_Guid",
|
||||
schema: "jellyfin",
|
||||
table: "Preference",
|
||||
table: "Preferences",
|
||||
column: "Preference_Preferences_Guid");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Preferences_Preference_Preferences_Id",
|
||||
schema: "jellyfin",
|
||||
table: "Preferences",
|
||||
column: "Preference_Preferences_Id");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
@@ -191,16 +255,26 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
schema: "jellyfin",
|
||||
table: "ProviderMapping",
|
||||
column: "ProviderMapping_ProviderMappings_Id");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Users_ProfileImageId",
|
||||
schema: "jellyfin",
|
||||
table: "Users",
|
||||
column: "ProfileImageId");
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "Permission",
|
||||
name: "AccessSchedule",
|
||||
schema: "jellyfin");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Preference",
|
||||
name: "Permissions",
|
||||
schema: "jellyfin");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Preferences",
|
||||
schema: "jellyfin");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
@@ -208,11 +282,15 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
schema: "jellyfin");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Group",
|
||||
name: "Groups",
|
||||
schema: "jellyfin");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "User",
|
||||
name: "Users",
|
||||
schema: "jellyfin");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "ImageInfo",
|
||||
schema: "jellyfin");
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Jellyfin.Server.Implementations;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Migrations
|
||||
{
|
||||
@@ -15,6 +17,31 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.HasDefaultSchema("jellyfin")
|
||||
.HasAnnotation("ProductVersion", "3.1.3");
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.AccessSchedule", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int>("DayOfWeek")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<double>("EndHour")
|
||||
.HasColumnType("REAL");
|
||||
|
||||
b.Property<double>("StartHour")
|
||||
.HasColumnType("REAL");
|
||||
|
||||
b.Property<Guid>("UserId")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("UserId");
|
||||
|
||||
b.ToTable("AccessSchedule");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.ActivityLog", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
@@ -63,12 +90,12 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Group", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
b.Property<Guid>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<int?>("Group_Groups_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Group_Groups_Guid")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
@@ -81,9 +108,27 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Group_Groups_Id");
|
||||
b.HasIndex("Group_Groups_Guid");
|
||||
|
||||
b.ToTable("Group");
|
||||
b.ToTable("Groups");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.ImageInfo", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<DateTime>("LastModified")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("Path")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("ImageInfo");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Permission", b =>
|
||||
@@ -95,11 +140,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
b.Property<int>("Kind")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("Permission_GroupPermissions_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Permission_GroupPermissions_Id")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<int?>("Permission_Permissions_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Permission_Permissions_Guid")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<uint>("RowVersion")
|
||||
.IsConcurrencyToken()
|
||||
@@ -112,9 +157,9 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasIndex("Permission_GroupPermissions_Id");
|
||||
|
||||
b.HasIndex("Permission_Permissions_Id");
|
||||
b.HasIndex("Permission_Permissions_Guid");
|
||||
|
||||
b.ToTable("Permission");
|
||||
b.ToTable("Permissions");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Preference", b =>
|
||||
@@ -126,8 +171,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
b.Property<int>("Kind")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("Preference_Preferences_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("Preference_Preferences_Guid")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<Guid?>("Preference_Preferences_Id")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<uint>("RowVersion")
|
||||
.IsConcurrencyToken()
|
||||
@@ -140,9 +188,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("Preference_Preferences_Guid");
|
||||
|
||||
b.HasIndex("Preference_Preferences_Id");
|
||||
|
||||
b.ToTable("Preference");
|
||||
b.ToTable("Preferences");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.ProviderMapping", b =>
|
||||
@@ -156,8 +206,8 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<int?>("ProviderMapping_ProviderMappings_Id")
|
||||
.HasColumnType("INTEGER");
|
||||
b.Property<Guid?>("ProviderMapping_ProviderMappings_Id")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("ProviderName")
|
||||
.IsRequired()
|
||||
@@ -182,12 +232,11 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.User", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
b.Property<Guid>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER");
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<string>("AudioLanguagePreference")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
@@ -196,71 +245,86 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
b.Property<bool?>("DisplayCollectionsView")
|
||||
b.Property<bool>("DisplayCollectionsView")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("DisplayMissingEpisodes")
|
||||
b.Property<bool>("DisplayMissingEpisodes")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("EnableNextEpisodeAutoPlay")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("EnableUserPreferenceAccess")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("GroupedFolders")
|
||||
b.Property<string>("EasyPassword")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<bool?>("HidePlayedInLatest")
|
||||
b.Property<bool>("EnableAutoLogin")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableLocalPassword")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableNextEpisodeAutoPlay")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableUserPreferenceAccess")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("HidePlayedInLatest")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<long>("InternalId")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int>("InvalidLoginAttemptCount")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("LatestItemExcludes")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
b.Property<DateTime>("LastActivityDate")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<DateTime>("LastLoginDate")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<int?>("LoginAttemptsBeforeLockout")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("MaxParentalAgeRating")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("MustUpdatePassword")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("MyMediaExcludes")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<string>("OrderedViews")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<string>("Password")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(65535);
|
||||
|
||||
b.Property<string>("PasswordResetProviderId")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
b.Property<bool>("PlayDefaultAudioTrack")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("RememberAudioSelections")
|
||||
b.Property<int?>("ProfileImageId")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool?>("RememberSubtitleSelections")
|
||||
b.Property<bool>("RememberAudioSelections")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("RememberSubtitleSelections")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int?>("RemoteClientBitrateLimit")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<uint>("RowVersion")
|
||||
.IsConcurrencyToken()
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("SubtitleLanguagePrefernce")
|
||||
b.Property<string>("SubtitleLanguagePreference")
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
|
||||
b.Property<string>("SubtitleMode")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT")
|
||||
.HasMaxLength(255);
|
||||
b.Property<int>("SubtitleMode")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("Username")
|
||||
.IsRequired()
|
||||
@@ -269,34 +333,45 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("User");
|
||||
b.HasIndex("ProfileImageId");
|
||||
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.AccessSchedule", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("AccessSchedules")
|
||||
.HasForeignKey("UserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Group", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("Groups")
|
||||
.HasForeignKey("Group_Groups_Id");
|
||||
.HasForeignKey("Group_Groups_Guid");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Permission", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.Group", null)
|
||||
.WithMany("GroupPermissions")
|
||||
.WithMany("Permissions")
|
||||
.HasForeignKey("Permission_GroupPermissions_Id");
|
||||
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("Permissions")
|
||||
.HasForeignKey("Permission_Permissions_Id");
|
||||
.HasForeignKey("Permission_Permissions_Guid");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.Preference", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.Group", null)
|
||||
.WithMany("Preferences")
|
||||
.HasForeignKey("Preference_Preferences_Id");
|
||||
|
||||
b.HasOne("Jellyfin.Data.Entities.User", null)
|
||||
.WithMany("Preferences")
|
||||
.HasForeignKey("Preference_Preferences_Guid");
|
||||
|
||||
b.HasOne("Jellyfin.Data.Entities.Group", null)
|
||||
.WithMany("Preferences")
|
||||
.HasForeignKey("Preference_Preferences_Id");
|
||||
});
|
||||
@@ -311,6 +386,13 @@ namespace Jellyfin.Server.Implementations.Migrations
|
||||
.WithMany("ProviderMappings")
|
||||
.HasForeignKey("ProviderMapping_ProviderMappings_Id");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jellyfin.Data.Entities.User", b =>
|
||||
{
|
||||
b.HasOne("Jellyfin.Data.Entities.ImageInfo", "ProfileImage")
|
||||
.WithMany()
|
||||
.HasForeignKey("ProfileImageId");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user