Wer einen Server für andere betreibt, erfährt von Fehlern zuletzt: dass die deutsche Tonspur nach einer halben Stunde aussetzt, merkt der, der den Film sieht, und nicht der, der ihn eingeräumt hat. Bisher gab es dafür keinen Weg ausser dem Zuruf im Wohnzimmer. Gemeldet wird an einem Film, einer Serie, einer einzelnen Staffel und einer einzelnen Folge: Art (Bild, Ton, Untertitel, Angaben, Sonstiges), eine freiwillige Stelle wie 0:34:12 und der Kommentar. Pflicht ist nur der Kommentar — die beiden anderen machen aus einer Liste von Sätzen etwas, das man sortieren und nachstellen kann. **Eine Staffel gibt es als Zeile nicht**, und das prägt den Entwurf. Sie ist Serie plus Nummer, so wie überall sonst in diesem Server; die Meldung trägt deshalb drei Fremdschlüssel und daneben eine Staffelnummer. Dass die Nummer auf eine Staffel zeigt, die es gibt, prüft der Endpunkt beim Schreiben — die Datenbank kann es nicht, es gibt nichts, worauf sie zeigen könnte. **Die Rechteprüfung steht nirgends.** Wer einen Titel nicht sehen darf, findet ihn beim Melden nicht — das erledigt der Freigabefilter, ohne ein einziges `Where`. Elegant und genau deshalb leicht zu zerstören, darum steht dafür ein Test da. **Die eigene Liste überlebt fremde Entscheidungen.** Titel werden nachgeschlagen, nicht verbunden: zieht ein Administrator einen Titel zurück, nachdem jemand ihn gemeldet hat, bleibt die Meldung beim Melder stehen — nur ohne Namen. Ein Join hätte sie verschwinden lassen, und das wäre jemandes eigene Eingabe, weggenommen wegen einer fremden Entscheidung. `IgnoreQueryFilters` wäre die bequeme Abkürzung und gäbe den Namen eines unveröffentlichten Titels über einen Weg heraus, an den beim nächsten Mal niemand denkt. **Erledigt heisst abgehakt, nicht gelöscht**, als Zeitpunkt und nicht als Haken — wie `PublishAt` und `ChangedSince`. Daneben steht „Wieder öffnen"; ein Fehlgriff wäre sonst endgültig. Das Archiv wird erst auf Zuruf geholt: es wächst nur, und für den seltenen Blick dauernd zu zahlen lohnt nicht. **Der Abschnitt steht neben der Prüfliste, nicht darin.** Die versteckt sich, sobald nichts auf Freigabe wartet — das ist der Normalfall, und die Meldungen verschwänden mit ihr. Umgekehrt bleibt der Meldungsabschnitt stehen, auch wenn nichts drinsteht: ein Kanal, der sich versteckt, solange ihn niemand benutzt hat, bringt niemandem bei, dass es ihn gibt. Die Zahl an der Leiste holt sich nur, wer sie nicht ohnehin hat: steht „Zu prüfen" offen, meldet der Abschnitt sie selbst und nach jedem Abhaken. Nebenbei zwei Dinge am Dialog, die hier auffielen. Es gab **kein mehrzeiliges Feld** — und das Einsammeln der Werte hätte ein `<textarea>` still verschluckt: es ist kein `HTMLInputElement` und wäre ins Auffangnetz für Auswahlfelder gelaufen, also als `undefined` hinausgegangen. Der Server hätte „ohne Beschreibung" geantwortet, auf einem Dialog, in dem sichtbar etwas steht. Und `dialog()` meldete sich als einziger nicht beim Seitenwechsel an: ein Dialog von der Detailseite überlebte den Zurück-Knopf und stand danach über der Mediathek. Neun Testfälle auf dem Server, zwölf Läufe. Für den Web-Client gibt es in diesem Projekt keine Tests; dort ist von Hand geprüft. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1076 lines
36 KiB
C#
1076 lines
36 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using Flaro.Data;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
|
|
#nullable disable
|
|
|
|
namespace Flaro.Data.Migrations
|
|
{
|
|
[DbContext(typeof(FlaroContext))]
|
|
partial class FlaroContextModelSnapshot : ModelSnapshot
|
|
{
|
|
protected override void BuildModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder.HasAnnotation("ProductVersion", "10.0.12");
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.AuthCode", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("ApprovedByUserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Code")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("ConsumedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("DeviceId")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("DeviceName")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("ExpiresAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("HandleFingerprint")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Code");
|
|
|
|
b.HasIndex("HandleFingerprint")
|
|
.IsUnique();
|
|
|
|
b.ToTable("AuthCodes");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.DeviceToken", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("DeviceId")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("DeviceName")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("LastSeenAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("RevokedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("TokenFingerprint")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TokenFingerprint")
|
|
.IsUnique();
|
|
|
|
b.HasIndex("UserId");
|
|
|
|
b.ToTable("DeviceTokens");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Libraries.Library", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Kind")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Path")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("ReviewNewItems")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.ToTable("Libraries");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Credit", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Character")
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int>("Order")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("PersonId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Role")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("PersonId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.ToTable("Credits");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Episode", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("AddedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("EpisodeNumber")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("MetadataLanguage")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("PublishAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("SeasonNumber")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("StillImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("SeriesId", "SeasonNumber", "EpisodeNumber")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Episodes");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Genre", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT")
|
|
.UseCollation("NOCASE");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Name")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Genres");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.GenreLink", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("GenreId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.HasIndex("GenreId", "MovieId")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.HasIndex("GenreId", "SeriesId")
|
|
.IsUnique()
|
|
.HasFilter("\"SeriesId\" IS NOT NULL");
|
|
|
|
b.ToTable("GenreLinks");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.ItemTranslation", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("FetchedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Language")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Tagline")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId", "Language")
|
|
.IsUnique()
|
|
.HasFilter("\"EpisodeId\" IS NOT NULL");
|
|
|
|
b.HasIndex("MovieId", "Language")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.HasIndex("SeriesId", "Language")
|
|
.IsUnique()
|
|
.HasFilter("\"SeriesId\" IS NOT NULL");
|
|
|
|
b.ToTable("Translations");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaFile", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("BitRate")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Container")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("Duration")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("LibraryId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("MissingSince")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("ModifiedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Path")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("ProbedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("SeenAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("SizeBytes")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("VersionLabel")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("LibraryId", "Path")
|
|
.IsUnique();
|
|
|
|
b.ToTable("MediaFiles");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaStream", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("Channels")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Codec")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("Height")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("Index")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("IsDefault")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("IsForced")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Kind")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Language")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("MediaFileId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("Width")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MediaFileId", "Index")
|
|
.IsUnique();
|
|
|
|
b.ToTable("MediaStreams");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Meldung", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Art")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("ErledigtAm")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("ErledigtVon")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("GemeldetAm")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Kommentar")
|
|
.IsRequired()
|
|
.HasMaxLength(2000)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("SeasonNumber")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("Stelle")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.HasIndex("ErledigtAm", "GemeldetAm");
|
|
|
|
b.HasIndex("UserId", "GemeldetAm");
|
|
|
|
b.ToTable("Meldungen");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Movie", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("AddedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("BackdropImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("BackdropPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("ChangedSince")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("ContentRating")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("ImdbId")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("LibraryId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("LogoImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("LogoPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("MatchLocked")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("MetadataLanguage")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("OriginalTitle")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("ParsedTitle")
|
|
.IsRequired()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("ParsedYear")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("PosterImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("PosterPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("PublishAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<double?>("Rating")
|
|
.HasColumnType("REAL");
|
|
|
|
b.Property<int?>("RuntimeMinutes")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("SortTitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("SortTitleValue")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Tagline")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("TitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("TmdbId")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("Year")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("LibraryId", "MetadataLanguage");
|
|
|
|
b.HasIndex("LibraryId", "SortTitleValue");
|
|
|
|
b.HasIndex("LibraryId", "TmdbId")
|
|
.IsUnique()
|
|
.HasFilter("\"TmdbId\" IS NOT NULL");
|
|
|
|
b.ToTable("Movies");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Person", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Image")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int>("TmdbId")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TmdbId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("People");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Series", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("AddedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("BackdropImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("BackdropPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("ChangedSince")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("ContentRating")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("ImdbId")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("LibraryId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("LogoImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("LogoPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("MatchLocked")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("MetadataLanguage")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("OriginalTitle")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("ParsedTitle")
|
|
.IsRequired()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("ParsedYear")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("PosterImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("PosterPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("PublishAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<double?>("Rating")
|
|
.HasColumnType("REAL");
|
|
|
|
b.Property<int?>("RuntimeMinutes")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("SortTitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("SortTitleValue")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Tagline")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("TitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("TmdbId")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("Year")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("LibraryId", "MetadataLanguage");
|
|
|
|
b.HasIndex("LibraryId", "SortTitleValue");
|
|
|
|
b.HasIndex("LibraryId", "TmdbId")
|
|
.IsUnique()
|
|
.HasFilter("\"TmdbId\" IS NOT NULL");
|
|
|
|
b.ToTable("Series");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.Sehtag", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<double>("Sekunden")
|
|
.HasColumnType("REAL");
|
|
|
|
b.Property<int>("Tag")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("UserId", "Tag");
|
|
|
|
b.HasIndex("UserId", "Tag", "EpisodeId")
|
|
.IsUnique()
|
|
.HasFilter("\"EpisodeId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "Tag", "MovieId")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.ToTable("Sehtage");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.UserItemState", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("Dismissed")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("Favourite")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("InProgress")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("LastPlayedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int>("PlayCount")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("Position")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("Rating")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("Runtime")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("UpdatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("Watched")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.HasIndex("UserId", "EpisodeId")
|
|
.IsUnique()
|
|
.HasFilter("\"EpisodeId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "MovieId")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "SeriesId")
|
|
.IsUnique()
|
|
.HasFilter("\"SeriesId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "InProgress", "UpdatedAt");
|
|
|
|
b.ToTable("UserItemStates");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.ServerSetting", b =>
|
|
{
|
|
b.Property<string>("Key")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Value")
|
|
.IsRequired()
|
|
.HasMaxLength(4096)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Key");
|
|
|
|
b.ToTable("Settings");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Users.User", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("AvatarImage")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("IsAdministrator")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Language")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("PasswordHash")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("UserName")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT")
|
|
.UseCollation("NOCASE");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("UserName")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Users");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.DeviceToken", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Credit", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Person", null)
|
|
.WithMany()
|
|
.HasForeignKey("PersonId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Episode", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.GenreLink", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Genre", null)
|
|
.WithMany()
|
|
.HasForeignKey("GenreId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaFile", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Libraries.Library", null)
|
|
.WithMany()
|
|
.HasForeignKey("LibraryId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaStream", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.MediaFile", null)
|
|
.WithMany()
|
|
.HasForeignKey("MediaFileId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Meldung", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Episode", null)
|
|
.WithMany()
|
|
.HasForeignKey("EpisodeId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Movie", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Libraries.Library", null)
|
|
.WithMany()
|
|
.HasForeignKey("LibraryId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Series", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Libraries.Library", null)
|
|
.WithMany()
|
|
.HasForeignKey("LibraryId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.Sehtag", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Episode", null)
|
|
.WithMany()
|
|
.HasForeignKey("EpisodeId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.UserItemState", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Episode", null)
|
|
.WithMany()
|
|
.HasForeignKey("EpisodeId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|