diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Data/20260316213642_AddSeeker.Designer.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/20260316213642_AddSeeker.Designer.cs
deleted file mode 100644
index fd86ed62..00000000
--- a/code/backend/Cleanuparr.Persistence/Migrations/Data/20260316213642_AddSeeker.Designer.cs
+++ /dev/null
@@ -1,1504 +0,0 @@
-//
-using System;
-using System.Collections.Generic;
-using Cleanuparr.Persistence;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Migrations;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-
-#nullable disable
-
-namespace Cleanuparr.Persistence.Migrations.Data
-{
- [DbContext(typeof(DataContext))]
- [Migration("20260316213642_AddSeeker")]
- partial class AddSeeker
- {
- ///
- protected override void BuildTargetModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder.HasAnnotation("ProductVersion", "10.0.1");
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("FailedImportMaxStrikes")
- .HasColumnType("INTEGER")
- .HasColumnName("failed_import_max_strikes");
-
- b.Property("Type")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("type");
-
- b.HasKey("Id")
- .HasName("pk_arr_configs");
-
- b.ToTable("arr_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("ApiKey")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("api_key");
-
- b.Property("ArrConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("arr_config_id");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.Property("ExternalUrl")
- .HasColumnType("TEXT")
- .HasColumnName("external_url");
-
- b.Property("Name")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.Property("Url")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("url");
-
- b.Property("Version")
- .HasColumnType("REAL")
- .HasColumnName("version");
-
- b.HasKey("Id")
- .HasName("pk_arr_instances");
-
- b.HasIndex("ArrConfigId")
- .HasDatabaseName("ix_arr_instances_arr_config_id");
-
- b.ToTable("arr_instances", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.BlacklistSync.BlacklistSyncConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("BlacklistPath")
- .HasColumnType("TEXT")
- .HasColumnName("blacklist_path");
-
- b.Property("CronExpression")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("cron_expression");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.HasKey("Id")
- .HasName("pk_blacklist_sync_configs");
-
- b.ToTable("blacklist_sync_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.DownloadCleanerConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("CronExpression")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("cron_expression");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.PrimitiveCollection("IgnoredDownloads")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("ignored_downloads");
-
- b.PrimitiveCollection("UnlinkedCategories")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("unlinked_categories");
-
- b.Property("UnlinkedEnabled")
- .HasColumnType("INTEGER")
- .HasColumnName("unlinked_enabled");
-
- b.PrimitiveCollection("UnlinkedIgnoredRootDirs")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("unlinked_ignored_root_dirs");
-
- b.Property("UnlinkedTargetCategory")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("unlinked_target_category");
-
- b.Property("UnlinkedUseTag")
- .HasColumnType("INTEGER")
- .HasColumnName("unlinked_use_tag");
-
- b.Property("UseAdvancedScheduling")
- .HasColumnType("INTEGER")
- .HasColumnName("use_advanced_scheduling");
-
- b.HasKey("Id")
- .HasName("pk_download_cleaner_configs");
-
- b.ToTable("download_cleaner_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.SeedingRule", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("DeleteSourceFiles")
- .HasColumnType("INTEGER")
- .HasColumnName("delete_source_files");
-
- b.Property("DownloadCleanerConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("download_cleaner_config_id");
-
- b.Property("MaxRatio")
- .HasColumnType("REAL")
- .HasColumnName("max_ratio");
-
- b.Property("MaxSeedTime")
- .HasColumnType("REAL")
- .HasColumnName("max_seed_time");
-
- b.Property("MinSeedTime")
- .HasColumnType("REAL")
- .HasColumnName("min_seed_time");
-
- b.Property("Name")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.Property("PrivacyType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("privacy_type");
-
- b.HasKey("Id")
- .HasName("pk_seeding_rules");
-
- b.HasIndex("DownloadCleanerConfigId")
- .HasDatabaseName("ix_seeding_rules_download_cleaner_config_id");
-
- b.ToTable("seeding_rules", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadClientConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.Property("ExternalUrl")
- .HasColumnType("TEXT")
- .HasColumnName("external_url");
-
- b.Property("Host")
- .HasColumnType("TEXT")
- .HasColumnName("host");
-
- b.Property("Name")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.Property("Password")
- .HasColumnType("TEXT")
- .HasColumnName("password");
-
- b.Property("Type")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("type");
-
- b.Property("TypeName")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("type_name");
-
- b.Property("UrlBase")
- .HasColumnType("TEXT")
- .HasColumnName("url_base");
-
- b.Property("Username")
- .HasColumnType("TEXT")
- .HasColumnName("username");
-
- b.HasKey("Id")
- .HasName("pk_download_clients");
-
- b.ToTable("download_clients", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.General.GeneralConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("DisplaySupportBanner")
- .HasColumnType("INTEGER")
- .HasColumnName("display_support_banner");
-
- b.Property("DryRun")
- .HasColumnType("INTEGER")
- .HasColumnName("dry_run");
-
- b.Property("EncryptionKey")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("encryption_key");
-
- b.Property("HttpCertificateValidation")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("http_certificate_validation");
-
- b.Property("HttpMaxRetries")
- .HasColumnType("INTEGER")
- .HasColumnName("http_max_retries");
-
- b.Property("HttpTimeout")
- .HasColumnType("INTEGER")
- .HasColumnName("http_timeout");
-
- b.PrimitiveCollection("IgnoredDownloads")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("ignored_downloads");
-
- b.Property("StatusCheckEnabled")
- .HasColumnType("INTEGER")
- .HasColumnName("status_check_enabled");
-
- b.Property("StrikeInactivityWindowHours")
- .HasColumnType("INTEGER")
- .HasColumnName("strike_inactivity_window_hours");
-
- b.ComplexProperty(typeof(Dictionary), "Auth", "Cleanuparr.Persistence.Models.Configuration.General.GeneralConfig.Auth#AuthConfig", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("DisableAuthForLocalAddresses")
- .HasColumnType("INTEGER")
- .HasColumnName("auth_disable_auth_for_local_addresses");
-
- b1.Property("TrustForwardedHeaders")
- .HasColumnType("INTEGER")
- .HasColumnName("auth_trust_forwarded_headers");
-
- b1.Property("TrustedNetworks")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("auth_trusted_networks");
- });
-
- b.ComplexProperty(typeof(Dictionary), "Log", "Cleanuparr.Persistence.Models.Configuration.General.GeneralConfig.Log#LoggingConfig", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("ArchiveEnabled")
- .HasColumnType("INTEGER")
- .HasColumnName("log_archive_enabled");
-
- b1.Property("ArchiveRetainedCount")
- .HasColumnType("INTEGER")
- .HasColumnName("log_archive_retained_count");
-
- b1.Property("ArchiveTimeLimitHours")
- .HasColumnType("INTEGER")
- .HasColumnName("log_archive_time_limit_hours");
-
- b1.Property("Level")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("log_level");
-
- b1.Property("RetainedFileCount")
- .HasColumnType("INTEGER")
- .HasColumnName("log_retained_file_count");
-
- b1.Property("RollingSizeMB")
- .HasColumnType("INTEGER")
- .HasColumnName("log_rolling_size_mb");
-
- b1.Property("TimeLimitHours")
- .HasColumnType("INTEGER")
- .HasColumnName("log_time_limit_hours");
- });
-
- b.HasKey("Id")
- .HasName("pk_general_configs");
-
- b.ToTable("general_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("CronExpression")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("cron_expression");
-
- b.Property("DeletePrivate")
- .HasColumnType("INTEGER")
- .HasColumnName("delete_private");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.Property("IgnorePrivate")
- .HasColumnType("INTEGER")
- .HasColumnName("ignore_private");
-
- b.PrimitiveCollection("IgnoredDownloads")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("ignored_downloads");
-
- b.Property("ProcessNoContentId")
- .HasColumnType("INTEGER")
- .HasColumnName("process_no_content_id");
-
- b.Property("UseAdvancedScheduling")
- .HasColumnType("INTEGER")
- .HasColumnName("use_advanced_scheduling");
-
- b.ComplexProperty(typeof(Dictionary), "Lidarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Lidarr#BlocklistSettings", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("BlocklistPath")
- .HasColumnType("TEXT")
- .HasColumnName("lidarr_blocklist_path");
-
- b1.Property("BlocklistType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("lidarr_blocklist_type");
-
- b1.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("lidarr_enabled");
- });
-
- b.ComplexProperty(typeof(Dictionary), "Radarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Radarr#BlocklistSettings", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("BlocklistPath")
- .HasColumnType("TEXT")
- .HasColumnName("radarr_blocklist_path");
-
- b1.Property("BlocklistType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("radarr_blocklist_type");
-
- b1.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("radarr_enabled");
- });
-
- b.ComplexProperty(typeof(Dictionary), "Readarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Readarr#BlocklistSettings", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("BlocklistPath")
- .HasColumnType("TEXT")
- .HasColumnName("readarr_blocklist_path");
-
- b1.Property("BlocklistType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("readarr_blocklist_type");
-
- b1.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("readarr_enabled");
- });
-
- b.ComplexProperty(typeof(Dictionary), "Sonarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Sonarr#BlocklistSettings", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("BlocklistPath")
- .HasColumnType("TEXT")
- .HasColumnName("sonarr_blocklist_path");
-
- b1.Property("BlocklistType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("sonarr_blocklist_type");
-
- b1.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("sonarr_enabled");
- });
-
- b.ComplexProperty(typeof(Dictionary), "Whisparr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Whisparr#BlocklistSettings", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("BlocklistPath")
- .HasColumnType("TEXT")
- .HasColumnName("whisparr_blocklist_path");
-
- b1.Property("BlocklistType")
- .HasColumnType("INTEGER")
- .HasColumnName("whisparr_blocklist_type");
-
- b1.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("whisparr_enabled");
- });
-
- b.HasKey("Id")
- .HasName("pk_content_blocker_configs");
-
- b.ToTable("content_blocker_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.AppriseConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("Key")
- .IsRequired()
- .HasMaxLength(255)
- .HasColumnType("TEXT")
- .HasColumnName("key");
-
- b.Property("Mode")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("mode");
-
- b.Property("NotificationConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("notification_config_id");
-
- b.Property("ServiceUrls")
- .HasMaxLength(4000)
- .HasColumnType("TEXT")
- .HasColumnName("service_urls");
-
- b.Property("Tags")
- .HasMaxLength(255)
- .HasColumnType("TEXT")
- .HasColumnName("tags");
-
- b.Property("Url")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT")
- .HasColumnName("url");
-
- b.HasKey("Id")
- .HasName("pk_apprise_configs");
-
- b.HasIndex("NotificationConfigId")
- .IsUnique()
- .HasDatabaseName("ix_apprise_configs_notification_config_id");
-
- b.ToTable("apprise_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.DiscordConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("AvatarUrl")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT")
- .HasColumnName("avatar_url");
-
- b.Property("NotificationConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("notification_config_id");
-
- b.Property("Username")
- .IsRequired()
- .HasMaxLength(80)
- .HasColumnType("TEXT")
- .HasColumnName("username");
-
- b.Property("WebhookUrl")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT")
- .HasColumnName("webhook_url");
-
- b.HasKey("Id")
- .HasName("pk_discord_configs");
-
- b.HasIndex("NotificationConfigId")
- .IsUnique()
- .HasDatabaseName("ix_discord_configs_notification_config_id");
-
- b.ToTable("discord_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.GotifyConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("ApplicationToken")
- .IsRequired()
- .HasMaxLength(200)
- .HasColumnType("TEXT")
- .HasColumnName("application_token");
-
- b.Property("NotificationConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("notification_config_id");
-
- b.Property("Priority")
- .HasColumnType("INTEGER")
- .HasColumnName("priority");
-
- b.Property("ServerUrl")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT")
- .HasColumnName("server_url");
-
- b.HasKey("Id")
- .HasName("pk_gotify_configs");
-
- b.HasIndex("NotificationConfigId")
- .IsUnique()
- .HasDatabaseName("ix_gotify_configs_notification_config_id");
-
- b.ToTable("gotify_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotifiarrConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("ApiKey")
- .IsRequired()
- .HasMaxLength(255)
- .HasColumnType("TEXT")
- .HasColumnName("api_key");
-
- b.Property("ChannelId")
- .IsRequired()
- .HasMaxLength(50)
- .HasColumnType("TEXT")
- .HasColumnName("channel_id");
-
- b.Property("NotificationConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("notification_config_id");
-
- b.HasKey("Id")
- .HasName("pk_notifiarr_configs");
-
- b.HasIndex("NotificationConfigId")
- .IsUnique()
- .HasDatabaseName("ix_notifiarr_configs_notification_config_id");
-
- b.ToTable("notifiarr_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("CreatedAt")
- .HasColumnType("TEXT")
- .HasColumnName("created_at");
-
- b.Property("IsEnabled")
- .HasColumnType("INTEGER")
- .HasColumnName("is_enabled");
-
- b.Property("Name")
- .IsRequired()
- .HasMaxLength(100)
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.Property("OnCategoryChanged")
- .HasColumnType("INTEGER")
- .HasColumnName("on_category_changed");
-
- b.Property("OnDownloadCleaned")
- .HasColumnType("INTEGER")
- .HasColumnName("on_download_cleaned");
-
- b.Property("OnFailedImportStrike")
- .HasColumnType("INTEGER")
- .HasColumnName("on_failed_import_strike");
-
- b.Property("OnQueueItemDeleted")
- .HasColumnType("INTEGER")
- .HasColumnName("on_queue_item_deleted");
-
- b.Property("OnSearchTriggered")
- .HasColumnType("INTEGER")
- .HasColumnName("on_search_triggered");
-
- b.Property("OnSlowStrike")
- .HasColumnType("INTEGER")
- .HasColumnName("on_slow_strike");
-
- b.Property("OnStalledStrike")
- .HasColumnType("INTEGER")
- .HasColumnName("on_stalled_strike");
-
- b.Property("Type")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("type");
-
- b.Property("UpdatedAt")
- .HasColumnType("TEXT")
- .HasColumnName("updated_at");
-
- b.HasKey("Id")
- .HasName("pk_notification_configs");
-
- b.HasIndex("Name")
- .IsUnique()
- .HasDatabaseName("ix_notification_configs_name");
-
- b.ToTable("notification_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NtfyConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("AccessToken")
- .HasMaxLength(500)
- .HasColumnType("TEXT")
- .HasColumnName("access_token");
-
- b.Property("AuthenticationType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("authentication_type");
-
- b.Property("NotificationConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("notification_config_id");
-
- b.Property("Password")
- .HasMaxLength(255)
- .HasColumnType("TEXT")
- .HasColumnName("password");
-
- b.Property("Priority")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("priority");
-
- b.Property("ServerUrl")
- .IsRequired()
- .HasMaxLength(500)
- .HasColumnType("TEXT")
- .HasColumnName("server_url");
-
- b.PrimitiveCollection("Tags")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("tags");
-
- b.PrimitiveCollection("Topics")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("topics");
-
- b.Property("Username")
- .HasMaxLength(255)
- .HasColumnType("TEXT")
- .HasColumnName("username");
-
- b.HasKey("Id")
- .HasName("pk_ntfy_configs");
-
- b.HasIndex("NotificationConfigId")
- .IsUnique()
- .HasDatabaseName("ix_ntfy_configs_notification_config_id");
-
- b.ToTable("ntfy_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.PushoverConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("ApiToken")
- .IsRequired()
- .HasMaxLength(50)
- .HasColumnType("TEXT")
- .HasColumnName("api_token");
-
- b.Property("Devices")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("devices");
-
- b.Property("Expire")
- .HasColumnType("INTEGER")
- .HasColumnName("expire");
-
- b.Property("NotificationConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("notification_config_id");
-
- b.Property("Priority")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("priority");
-
- b.Property("Retry")
- .HasColumnType("INTEGER")
- .HasColumnName("retry");
-
- b.Property("Sound")
- .HasMaxLength(50)
- .HasColumnType("TEXT")
- .HasColumnName("sound");
-
- b.Property("Tags")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("tags");
-
- b.Property("UserKey")
- .IsRequired()
- .HasMaxLength(50)
- .HasColumnType("TEXT")
- .HasColumnName("user_key");
-
- b.HasKey("Id")
- .HasName("pk_pushover_configs");
-
- b.HasIndex("NotificationConfigId")
- .IsUnique()
- .HasDatabaseName("ix_pushover_configs_notification_config_id");
-
- b.ToTable("pushover_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.TelegramConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("BotToken")
- .IsRequired()
- .HasMaxLength(255)
- .HasColumnType("TEXT")
- .HasColumnName("bot_token");
-
- b.Property("ChatId")
- .IsRequired()
- .HasMaxLength(100)
- .HasColumnType("TEXT")
- .HasColumnName("chat_id");
-
- b.Property("NotificationConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("notification_config_id");
-
- b.Property("SendSilently")
- .HasColumnType("INTEGER")
- .HasColumnName("send_silently");
-
- b.Property("TopicId")
- .HasMaxLength(100)
- .HasColumnType("TEXT")
- .HasColumnName("topic_id");
-
- b.HasKey("Id")
- .HasName("pk_telegram_configs");
-
- b.HasIndex("NotificationConfigId")
- .IsUnique()
- .HasDatabaseName("ix_telegram_configs_notification_config_id");
-
- b.ToTable("telegram_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("CronExpression")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("cron_expression");
-
- b.Property("DownloadingMetadataMaxStrikes")
- .HasColumnType("INTEGER")
- .HasColumnName("downloading_metadata_max_strikes");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.PrimitiveCollection("IgnoredDownloads")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("ignored_downloads");
-
- b.Property("ProcessNoContentId")
- .HasColumnType("INTEGER")
- .HasColumnName("process_no_content_id");
-
- b.Property("UseAdvancedScheduling")
- .HasColumnType("INTEGER")
- .HasColumnName("use_advanced_scheduling");
-
- b.ComplexProperty(typeof(Dictionary), "FailedImport", "Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig.FailedImport#FailedImportConfig", b1 =>
- {
- b1.IsRequired();
-
- b1.Property("DeletePrivate")
- .HasColumnType("INTEGER")
- .HasColumnName("failed_import_delete_private");
-
- b1.Property("IgnorePrivate")
- .HasColumnType("INTEGER")
- .HasColumnName("failed_import_ignore_private");
-
- b1.Property("MaxStrikes")
- .HasColumnType("INTEGER")
- .HasColumnName("failed_import_max_strikes");
-
- b1.Property("PatternMode")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("failed_import_pattern_mode");
-
- b1.PrimitiveCollection("Patterns")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("failed_import_patterns");
-
- b1.Property("SkipIfNotFoundInClient")
- .HasColumnType("INTEGER")
- .HasColumnName("failed_import_skip_if_not_found_in_client");
- });
-
- b.HasKey("Id")
- .HasName("pk_queue_cleaner_configs");
-
- b.ToTable("queue_cleaner_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.SlowRule", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("DeletePrivateTorrentsFromClient")
- .HasColumnType("INTEGER")
- .HasColumnName("delete_private_torrents_from_client");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.Property("IgnoreAboveSize")
- .HasColumnType("TEXT")
- .HasColumnName("ignore_above_size");
-
- b.Property("MaxCompletionPercentage")
- .HasColumnType("INTEGER")
- .HasColumnName("max_completion_percentage");
-
- b.Property("MaxStrikes")
- .HasColumnType("INTEGER")
- .HasColumnName("max_strikes");
-
- b.Property("MaxTimeHours")
- .HasColumnType("REAL")
- .HasColumnName("max_time_hours");
-
- b.Property("MinCompletionPercentage")
- .HasColumnType("INTEGER")
- .HasColumnName("min_completion_percentage");
-
- b.Property("MinSpeed")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("min_speed");
-
- b.Property("Name")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.Property("PrivacyType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("privacy_type");
-
- b.Property("QueueCleanerConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("queue_cleaner_config_id");
-
- b.Property("ResetStrikesOnProgress")
- .HasColumnType("INTEGER")
- .HasColumnName("reset_strikes_on_progress");
-
- b.HasKey("Id")
- .HasName("pk_slow_rules");
-
- b.HasIndex("QueueCleanerConfigId")
- .HasDatabaseName("ix_slow_rules_queue_cleaner_config_id");
-
- b.ToTable("slow_rules", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.StallRule", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("DeletePrivateTorrentsFromClient")
- .HasColumnType("INTEGER")
- .HasColumnName("delete_private_torrents_from_client");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.Property("MaxCompletionPercentage")
- .HasColumnType("INTEGER")
- .HasColumnName("max_completion_percentage");
-
- b.Property("MaxStrikes")
- .HasColumnType("INTEGER")
- .HasColumnName("max_strikes");
-
- b.Property("MinCompletionPercentage")
- .HasColumnType("INTEGER")
- .HasColumnName("min_completion_percentage");
-
- b.Property("MinimumProgress")
- .HasColumnType("TEXT")
- .HasColumnName("minimum_progress");
-
- b.Property("Name")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("name");
-
- b.Property("PrivacyType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("privacy_type");
-
- b.Property("QueueCleanerConfigId")
- .HasColumnType("TEXT")
- .HasColumnName("queue_cleaner_config_id");
-
- b.Property("ResetStrikesOnProgress")
- .HasColumnType("INTEGER")
- .HasColumnName("reset_strikes_on_progress");
-
- b.HasKey("Id")
- .HasName("pk_stall_rules");
-
- b.HasIndex("QueueCleanerConfigId")
- .HasDatabaseName("ix_stall_rules_queue_cleaner_config_id");
-
- b.ToTable("stall_rules", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Seeker.SeekerConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("MonitoredOnly")
- .HasColumnType("INTEGER")
- .HasColumnName("monitored_only");
-
- b.Property("ProactiveSearchEnabled")
- .HasColumnType("INTEGER")
- .HasColumnName("proactive_search_enabled");
-
- b.Property("SearchEnabled")
- .HasColumnType("INTEGER")
- .HasColumnName("search_enabled");
-
- b.Property("SearchInterval")
- .HasColumnType("INTEGER")
- .HasColumnName("search_interval");
-
- b.Property("SelectionStrategy")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("selection_strategy");
-
- b.Property("SonarrSearchType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("sonarr_search_type");
-
- b.Property("UseCutoff")
- .HasColumnType("INTEGER")
- .HasColumnName("use_cutoff");
-
- b.Property("UseRoundRobin")
- .HasColumnType("INTEGER")
- .HasColumnName("use_round_robin");
-
- b.HasKey("Id")
- .HasName("pk_seeker_configs");
-
- b.ToTable("seeker_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Seeker.SeekerInstanceConfig", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("ArrInstanceId")
- .HasColumnType("TEXT")
- .HasColumnName("arr_instance_id");
-
- b.Property("Enabled")
- .HasColumnType("INTEGER")
- .HasColumnName("enabled");
-
- b.Property("LastProcessedAt")
- .HasColumnType("TEXT")
- .HasColumnName("last_processed_at");
-
- b.PrimitiveCollection("SkipTags")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("skip_tags");
-
- b.HasKey("Id")
- .HasName("pk_seeker_instance_configs");
-
- b.HasIndex("ArrInstanceId")
- .IsUnique()
- .HasDatabaseName("ix_seeker_instance_configs_arr_instance_id");
-
- b.ToTable("seeker_instance_configs", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.State.BlacklistSyncHistory", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("DownloadClientId")
- .HasColumnType("TEXT")
- .HasColumnName("download_client_id");
-
- b.Property("Hash")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("hash");
-
- b.HasKey("Id")
- .HasName("pk_blacklist_sync_history");
-
- b.HasIndex("DownloadClientId")
- .HasDatabaseName("ix_blacklist_sync_history_download_client_id");
-
- b.HasIndex("Hash")
- .HasDatabaseName("ix_blacklist_sync_history_hash");
-
- b.HasIndex("Hash", "DownloadClientId")
- .IsUnique()
- .HasDatabaseName("ix_blacklist_sync_history_hash_download_client_id");
-
- b.ToTable("blacklist_sync_history", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.State.SearchQueueItem", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("ArrInstanceId")
- .HasColumnType("TEXT")
- .HasColumnName("arr_instance_id");
-
- b.Property("CreatedAt")
- .HasColumnType("TEXT")
- .HasColumnName("created_at");
-
- b.Property("ItemId")
- .HasColumnType("INTEGER")
- .HasColumnName("item_id");
-
- b.Property("SearchType")
- .HasColumnType("TEXT")
- .HasColumnName("search_type");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER")
- .HasColumnName("series_id");
-
- b.Property("Title")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("title");
-
- b.HasKey("Id")
- .HasName("pk_search_queue");
-
- b.HasIndex("ArrInstanceId")
- .HasDatabaseName("ix_search_queue_arr_instance_id");
-
- b.ToTable("search_queue", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.State.SeekerHistory", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("TEXT")
- .HasColumnName("id");
-
- b.Property("ArrInstanceId")
- .HasColumnType("TEXT")
- .HasColumnName("arr_instance_id");
-
- b.Property("EpisodeId")
- .HasColumnType("INTEGER")
- .HasColumnName("episode_id");
-
- b.Property("ExternalItemId")
- .HasColumnType("INTEGER")
- .HasColumnName("external_item_id");
-
- b.Property("ItemType")
- .IsRequired()
- .HasColumnType("TEXT")
- .HasColumnName("item_type");
-
- b.Property("LastSearchedAt")
- .HasColumnType("TEXT")
- .HasColumnName("last_searched_at");
-
- b.Property("SeasonNumber")
- .HasColumnType("INTEGER")
- .HasColumnName("season_number");
-
- b.HasKey("Id")
- .HasName("pk_seeker_history");
-
- b.HasIndex("ArrInstanceId", "ExternalItemId", "ItemType", "SeasonNumber", "EpisodeId")
- .IsUnique()
- .HasDatabaseName("ix_seeker_history_arr_instance_id_external_item_id_item_type_season_number_episode_id");
-
- b.ToTable("seeker_history", (string)null);
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrConfig", "ArrConfig")
- .WithMany("Instances")
- .HasForeignKey("ArrConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_arr_instances_arr_configs_arr_config_id");
-
- b.Navigation("ArrConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.SeedingRule", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.DownloadCleanerConfig", "DownloadCleanerConfig")
- .WithMany("Categories")
- .HasForeignKey("DownloadCleanerConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_seeding_rules_download_cleaner_configs_download_cleaner_config_id");
-
- b.Navigation("DownloadCleanerConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.AppriseConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig")
- .WithOne("AppriseConfiguration")
- .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.AppriseConfig", "NotificationConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_apprise_configs_notification_configs_notification_config_id");
-
- b.Navigation("NotificationConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.DiscordConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig")
- .WithOne("DiscordConfiguration")
- .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.DiscordConfig", "NotificationConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_discord_configs_notification_configs_notification_config_id");
-
- b.Navigation("NotificationConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.GotifyConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig")
- .WithOne("GotifyConfiguration")
- .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.GotifyConfig", "NotificationConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_gotify_configs_notification_configs_notification_config_id");
-
- b.Navigation("NotificationConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotifiarrConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig")
- .WithOne("NotifiarrConfiguration")
- .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.NotifiarrConfig", "NotificationConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_notifiarr_configs_notification_configs_notification_config_id");
-
- b.Navigation("NotificationConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NtfyConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig")
- .WithOne("NtfyConfiguration")
- .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.NtfyConfig", "NotificationConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_ntfy_configs_notification_configs_notification_config_id");
-
- b.Navigation("NotificationConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.PushoverConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig")
- .WithOne("PushoverConfiguration")
- .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.PushoverConfig", "NotificationConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_pushover_configs_notification_configs_notification_config_id");
-
- b.Navigation("NotificationConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.TelegramConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig")
- .WithOne("TelegramConfiguration")
- .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.TelegramConfig", "NotificationConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_telegram_configs_notification_configs_notification_config_id");
-
- b.Navigation("NotificationConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.SlowRule", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig", "QueueCleanerConfig")
- .WithMany("SlowRules")
- .HasForeignKey("QueueCleanerConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_slow_rules_queue_cleaner_configs_queue_cleaner_config_id");
-
- b.Navigation("QueueCleanerConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.StallRule", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig", "QueueCleanerConfig")
- .WithMany("StallRules")
- .HasForeignKey("QueueCleanerConfigId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_stall_rules_queue_cleaner_configs_queue_cleaner_config_id");
-
- b.Navigation("QueueCleanerConfig");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Seeker.SeekerInstanceConfig", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance")
- .WithMany()
- .HasForeignKey("ArrInstanceId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_seeker_instance_configs_arr_instances_arr_instance_id");
-
- b.Navigation("ArrInstance");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.State.BlacklistSyncHistory", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.DownloadClientConfig", "DownloadClient")
- .WithMany()
- .HasForeignKey("DownloadClientId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_blacklist_sync_history_download_clients_download_client_id");
-
- b.Navigation("DownloadClient");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.State.SearchQueueItem", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance")
- .WithMany()
- .HasForeignKey("ArrInstanceId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_search_queue_arr_instances_arr_instance_id");
-
- b.Navigation("ArrInstance");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.State.SeekerHistory", b =>
- {
- b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance")
- .WithMany()
- .HasForeignKey("ArrInstanceId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired()
- .HasConstraintName("fk_seeker_history_arr_instances_arr_instance_id");
-
- b.Navigation("ArrInstance");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrConfig", b =>
- {
- b.Navigation("Instances");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.DownloadCleanerConfig", b =>
- {
- b.Navigation("Categories");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", b =>
- {
- b.Navigation("AppriseConfiguration");
-
- b.Navigation("DiscordConfiguration");
-
- b.Navigation("GotifyConfiguration");
-
- b.Navigation("NotifiarrConfiguration");
-
- b.Navigation("NtfyConfiguration");
-
- b.Navigation("PushoverConfiguration");
-
- b.Navigation("TelegramConfiguration");
- });
-
- modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig", b =>
- {
- b.Navigation("SlowRules");
-
- b.Navigation("StallRules");
- });
-#pragma warning restore 612, 618
- }
- }
-}
diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Data/20260316213642_AddSeeker.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/20260316213642_AddSeeker.cs
deleted file mode 100644
index f6e83004..00000000
--- a/code/backend/Cleanuparr.Persistence/Migrations/Data/20260316213642_AddSeeker.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using System;
-using Microsoft.EntityFrameworkCore.Migrations;
-
-#nullable disable
-
-namespace Cleanuparr.Persistence.Migrations.Data
-{
- ///
- public partial class AddSeeker : Migration
- {
- ///
- protected override void Up(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.AddColumn(
- name: "on_search_triggered",
- table: "notification_configs",
- type: "INTEGER",
- nullable: false,
- defaultValue: false);
-
- migrationBuilder.CreateTable(
- name: "search_queue",
- columns: table => new
- {
- id = table.Column(type: "TEXT", nullable: false),
- arr_instance_id = table.Column(type: "TEXT", nullable: false),
- item_id = table.Column(type: "INTEGER", nullable: false),
- series_id = table.Column(type: "INTEGER", nullable: true),
- search_type = table.Column(type: "TEXT", nullable: true),
- title = table.Column(type: "TEXT", nullable: false),
- created_at = table.Column(type: "TEXT", nullable: false)
- },
- constraints: table =>
- {
- table.PrimaryKey("pk_search_queue", x => x.id);
- table.ForeignKey(
- name: "fk_search_queue_arr_instances_arr_instance_id",
- column: x => x.arr_instance_id,
- principalTable: "arr_instances",
- principalColumn: "id",
- onDelete: ReferentialAction.Cascade);
- });
-
- migrationBuilder.CreateTable(
- name: "seeker_configs",
- columns: table => new
- {
- id = table.Column(type: "TEXT", nullable: false),
- search_enabled = table.Column(type: "INTEGER", nullable: false),
- search_interval = table.Column(type: "INTEGER", nullable: false),
- proactive_search_enabled = table.Column(type: "INTEGER", nullable: false),
- selection_strategy = table.Column(type: "TEXT", nullable: false),
- monitored_only = table.Column(type: "INTEGER", nullable: false),
- use_cutoff = table.Column(type: "INTEGER", nullable: false),
- use_round_robin = table.Column(type: "INTEGER", nullable: false),
- sonarr_search_type = table.Column(type: "TEXT", nullable: false)
- },
- constraints: table =>
- {
- table.PrimaryKey("pk_seeker_configs", x => x.id);
- });
-
- // Migrate old data
- migrationBuilder.InsertData(
- table: "seeker_configs",
- columns: new[] { "id", "search_enabled", "search_interval", "proactive_search_enabled", "selection_strategy", "monitored_only", "use_cutoff", "use_round_robin", "sonarr_search_type" },
- values: new object[] { Guid.NewGuid(), true, 3, false, "balancedweighted", true, false, true, "Season" });
-
- migrationBuilder.Sql(@"
- UPDATE seeker_configs SET search_enabled = (
- SELECT COALESCE(g.search_enabled, 1) FROM general_configs g LIMIT 1
- )");
-
- migrationBuilder.CreateTable(
- name: "seeker_history",
- columns: table => new
- {
- id = table.Column(type: "TEXT", nullable: false),
- arr_instance_id = table.Column(type: "TEXT", nullable: false),
- external_item_id = table.Column(type: "INTEGER", nullable: false),
- item_type = table.Column(type: "TEXT", nullable: false),
- season_number = table.Column(type: "INTEGER", nullable: false),
- episode_id = table.Column(type: "INTEGER", nullable: false),
- last_searched_at = table.Column(type: "TEXT", nullable: false)
- },
- constraints: table =>
- {
- table.PrimaryKey("pk_seeker_history", x => x.id);
- table.ForeignKey(
- name: "fk_seeker_history_arr_instances_arr_instance_id",
- column: x => x.arr_instance_id,
- principalTable: "arr_instances",
- principalColumn: "id",
- onDelete: ReferentialAction.Cascade);
- });
-
- migrationBuilder.CreateTable(
- name: "seeker_instance_configs",
- columns: table => new
- {
- id = table.Column(type: "TEXT", nullable: false),
- arr_instance_id = table.Column(type: "TEXT", nullable: false),
- enabled = table.Column(type: "INTEGER", nullable: false),
- skip_tags = table.Column(type: "TEXT", nullable: false),
- last_processed_at = table.Column(type: "TEXT", nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("pk_seeker_instance_configs", x => x.id);
- table.ForeignKey(
- name: "fk_seeker_instance_configs_arr_instances_arr_instance_id",
- column: x => x.arr_instance_id,
- principalTable: "arr_instances",
- principalColumn: "id",
- onDelete: ReferentialAction.Cascade);
- });
-
- migrationBuilder.DropColumn(
- name: "search_delay",
- table: "general_configs");
-
- migrationBuilder.DropColumn(
- name: "search_enabled",
- table: "general_configs");
-
- migrationBuilder.CreateIndex(
- name: "ix_search_queue_arr_instance_id",
- table: "search_queue",
- column: "arr_instance_id");
-
- migrationBuilder.CreateIndex(
- name: "ix_seeker_history_arr_instance_id_external_item_id_item_type_season_number_episode_id",
- table: "seeker_history",
- columns: new[] { "arr_instance_id", "external_item_id", "item_type", "season_number", "episode_id" },
- unique: true);
-
- migrationBuilder.CreateIndex(
- name: "ix_seeker_instance_configs_arr_instance_id",
- table: "seeker_instance_configs",
- column: "arr_instance_id",
- unique: true);
- }
-
- ///
- protected override void Down(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.DropTable(
- name: "search_queue");
-
- migrationBuilder.DropTable(
- name: "seeker_configs");
-
- migrationBuilder.DropTable(
- name: "seeker_history");
-
- migrationBuilder.DropTable(
- name: "seeker_instance_configs");
-
- migrationBuilder.DropColumn(
- name: "on_search_triggered",
- table: "notification_configs");
-
- migrationBuilder.AddColumn(
- name: "search_delay",
- table: "general_configs",
- type: "INTEGER",
- nullable: false,
- defaultValue: (ushort)0);
-
- migrationBuilder.AddColumn(
- name: "search_enabled",
- table: "general_configs",
- type: "INTEGER",
- nullable: false,
- defaultValue: false);
- }
- }
-}
diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs
index c57affa6..bd5101e4 100644
--- a/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs
+++ b/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs
@@ -303,6 +303,14 @@ namespace Cleanuparr.Persistence.Migrations.Data
.HasColumnType("TEXT")
.HasColumnName("ignored_downloads");
+ b.Property("SearchDelay")
+ .HasColumnType("INTEGER")
+ .HasColumnName("search_delay");
+
+ b.Property