diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Data/20260323091600_AddSeeker.Designer.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/20260323091600_AddSeeker.Designer.cs deleted file mode 100644 index 32456cbc..00000000 --- a/code/backend/Cleanuparr.Persistence/Migrations/Data/20260323091600_AddSeeker.Designer.cs +++ /dev/null @@ -1,1732 +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("20260323091600_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("UseCustomFormatScore") - .HasColumnType("INTEGER") - .HasColumnName("use_custom_format_score"); - - 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("ActiveDownloadLimit") - .HasColumnType("INTEGER") - .HasColumnName("active_download_limit"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CurrentRunId") - .HasColumnType("TEXT") - .HasColumnName("current_run_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.Property("TotalEligibleItems") - .HasColumnType("INTEGER") - .HasColumnName("total_eligible_items"); - - 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.CustomFormatScoreEntry", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CurrentScore") - .HasColumnType("INTEGER") - .HasColumnName("current_score"); - - b.Property("CutoffScore") - .HasColumnType("INTEGER") - .HasColumnName("cutoff_score"); - - b.Property("EpisodeId") - .HasColumnType("INTEGER") - .HasColumnName("episode_id"); - - b.Property("ExternalItemId") - .HasColumnType("INTEGER") - .HasColumnName("external_item_id"); - - b.Property("FileId") - .HasColumnType("INTEGER") - .HasColumnName("file_id"); - - b.Property("ItemType") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_type"); - - b.Property("LastSyncedAt") - .HasColumnType("TEXT") - .HasColumnName("last_synced_at"); - - b.Property("QualityProfileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("quality_profile_name"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("pk_custom_format_score_entries"); - - b.HasIndex("ArrInstanceId", "ExternalItemId", "EpisodeId") - .IsUnique() - .HasDatabaseName("ix_custom_format_score_entries_arr_instance_id_external_item_id_episode_id"); - - b.ToTable("custom_format_score_entries", (string)null); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.CustomFormatScoreHistory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CutoffScore") - .HasColumnType("INTEGER") - .HasColumnName("cutoff_score"); - - 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("RecordedAt") - .HasColumnType("TEXT") - .HasColumnName("recorded_at"); - - b.Property("Score") - .HasColumnType("INTEGER") - .HasColumnName("score"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("pk_custom_format_score_history"); - - b.HasIndex("RecordedAt") - .HasDatabaseName("ix_custom_format_score_history_recorded_at"); - - b.HasIndex("ArrInstanceId", "ExternalItemId", "EpisodeId") - .HasDatabaseName("ix_custom_format_score_history_arr_instance_id_external_item_id_episode_id"); - - b.ToTable("custom_format_score_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.SeekerCommandTracker", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CommandId") - .HasColumnType("INTEGER") - .HasColumnName("command_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("EventId") - .HasColumnType("TEXT") - .HasColumnName("event_id"); - - b.Property("ExternalItemId") - .HasColumnType("INTEGER") - .HasColumnName("external_item_id"); - - b.Property("ItemTitle") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_title"); - - b.Property("ItemType") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_type"); - - b.Property("SeasonNumber") - .HasColumnType("INTEGER") - .HasColumnName("season_number"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.HasKey("Id") - .HasName("pk_seeker_command_trackers"); - - b.HasIndex("ArrInstanceId") - .HasDatabaseName("ix_seeker_command_trackers_arr_instance_id"); - - b.ToTable("seeker_command_trackers", (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("ExternalItemId") - .HasColumnType("INTEGER") - .HasColumnName("external_item_id"); - - b.Property("IsDryRun") - .HasColumnType("INTEGER") - .HasColumnName("is_dry_run"); - - b.Property("ItemTitle") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_title"); - - b.Property("ItemType") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_type"); - - b.Property("LastSearchedAt") - .HasColumnType("TEXT") - .HasColumnName("last_searched_at"); - - b.Property("RunId") - .HasColumnType("TEXT") - .HasColumnName("run_id"); - - b.Property("SearchCount") - .HasColumnType("INTEGER") - .HasColumnName("search_count"); - - b.Property("SeasonNumber") - .HasColumnType("INTEGER") - .HasColumnName("season_number"); - - b.HasKey("Id") - .HasName("pk_seeker_history"); - - b.HasIndex("ArrInstanceId", "ExternalItemId", "ItemType", "SeasonNumber", "RunId") - .IsUnique() - .HasDatabaseName("ix_seeker_history_arr_instance_id_external_item_id_item_type_season_number_run_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.CustomFormatScoreEntry", b => - { - b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance") - .WithMany() - .HasForeignKey("ArrInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_custom_format_score_entries_arr_instances_arr_instance_id"); - - b.Navigation("ArrInstance"); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.CustomFormatScoreHistory", b => - { - b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance") - .WithMany() - .HasForeignKey("ArrInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_custom_format_score_history_arr_instances_arr_instance_id"); - - b.Navigation("ArrInstance"); - }); - - 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.SeekerCommandTracker", b => - { - b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance") - .WithMany() - .HasForeignKey("ArrInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_seeker_command_trackers_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/20260323091600_AddSeeker.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/20260323091600_AddSeeker.cs deleted file mode 100644 index 4c4b9afd..00000000 --- a/code/backend/Cleanuparr.Persistence/Migrations/Data/20260323091600_AddSeeker.cs +++ /dev/null @@ -1,292 +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: "custom_format_score_entries", - 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), - episode_id = table.Column(type: "INTEGER", nullable: false), - item_type = table.Column(type: "TEXT", nullable: false), - title = table.Column(type: "TEXT", nullable: false), - file_id = table.Column(type: "INTEGER", nullable: false), - current_score = table.Column(type: "INTEGER", nullable: false), - cutoff_score = table.Column(type: "INTEGER", nullable: false), - quality_profile_name = table.Column(type: "TEXT", nullable: false), - last_synced_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_custom_format_score_entries", x => x.id); - table.ForeignKey( - name: "fk_custom_format_score_entries_arr_instances_arr_instance_id", - column: x => x.arr_instance_id, - principalTable: "arr_instances", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "custom_format_score_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), - episode_id = table.Column(type: "INTEGER", nullable: false), - item_type = table.Column(type: "TEXT", nullable: false), - title = table.Column(type: "TEXT", nullable: false), - score = table.Column(type: "INTEGER", nullable: false), - cutoff_score = table.Column(type: "INTEGER", nullable: false), - recorded_at = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_custom_format_score_history", x => x.id); - table.ForeignKey( - name: "fk_custom_format_score_history_arr_instances_arr_instance_id", - column: x => x.arr_instance_id, - principalTable: "arr_instances", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - - 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_command_trackers", - columns: table => new - { - id = table.Column(type: "TEXT", nullable: false), - arr_instance_id = table.Column(type: "TEXT", nullable: false), - command_id = table.Column(type: "INTEGER", nullable: false), - event_id = table.Column(type: "TEXT", nullable: false), - external_item_id = table.Column(type: "INTEGER", nullable: false), - item_title = table.Column(type: "TEXT", nullable: false), - item_type = table.Column(type: "TEXT", nullable: false), - season_number = table.Column(type: "INTEGER", nullable: false), - created_at = table.Column(type: "TEXT", nullable: false), - status = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("pk_seeker_command_trackers", x => x.id); - table.ForeignKey( - name: "fk_seeker_command_trackers_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_custom_format_score = table.Column(type: "INTEGER", nullable: false), - use_round_robin = table.Column(type: "INTEGER", 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_custom_format_score", "use_round_robin" }, - values: new object[] { Guid.NewGuid(), true, 10, false, "balancedweighted", true, true, true, true }); - - 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), - run_id = table.Column(type: "TEXT", nullable: false), - last_searched_at = table.Column(type: "TEXT", nullable: false), - item_title = table.Column(type: "TEXT", nullable: false), - search_count = table.Column(type: "INTEGER", nullable: false), - is_dry_run = table.Column(type: "INTEGER", 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), - current_run_id = table.Column(type: "TEXT", nullable: false), - total_eligible_items = table.Column(type: "INTEGER", nullable: false), - active_download_limit = table.Column(type: "INTEGER", nullable: false) - }, - 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_custom_format_score_entries_arr_instance_id_external_item_id_episode_id", - table: "custom_format_score_entries", - columns: new[] { "arr_instance_id", "external_item_id", "episode_id" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "ix_custom_format_score_history_arr_instance_id_external_item_id_episode_id", - table: "custom_format_score_history", - columns: new[] { "arr_instance_id", "external_item_id", "episode_id" }); - - migrationBuilder.CreateIndex( - name: "ix_custom_format_score_history_recorded_at", - table: "custom_format_score_history", - column: "recorded_at"); - - migrationBuilder.CreateIndex( - name: "ix_search_queue_arr_instance_id", - table: "search_queue", - column: "arr_instance_id"); - - migrationBuilder.CreateIndex( - name: "ix_seeker_command_trackers_arr_instance_id", - table: "seeker_command_trackers", - column: "arr_instance_id"); - - migrationBuilder.CreateIndex( - name: "ix_seeker_history_arr_instance_id_external_item_id_item_type_season_number_run_id", - table: "seeker_history", - columns: new[] { "arr_instance_id", "external_item_id", "item_type", "season_number", "run_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: "custom_format_score_entries"); - - migrationBuilder.DropTable( - name: "custom_format_score_history"); - - migrationBuilder.DropTable( - name: "search_queue"); - - migrationBuilder.DropTable( - name: "seeker_command_trackers"); - - 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 8ad42c52..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("SearchEnabled") + .HasColumnType("INTEGER") + .HasColumnName("search_enabled"); + b.Property("StatusCheckEnabled") .HasColumnType("INTEGER") .HasColumnName("status_check_enabled"); @@ -695,10 +703,6 @@ namespace Cleanuparr.Persistence.Migrations.Data .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"); @@ -1086,98 +1090,6 @@ namespace Cleanuparr.Persistence.Migrations.Data 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("UseCustomFormatScore") - .HasColumnType("INTEGER") - .HasColumnName("use_custom_format_score"); - - 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("ActiveDownloadLimit") - .HasColumnType("INTEGER") - .HasColumnName("active_download_limit"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CurrentRunId") - .HasColumnType("TEXT") - .HasColumnName("current_run_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.Property("TotalEligibleItems") - .HasColumnType("INTEGER") - .HasColumnName("total_eligible_items"); - - 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") @@ -1210,270 +1122,6 @@ namespace Cleanuparr.Persistence.Migrations.Data b.ToTable("blacklist_sync_history", (string)null); }); - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.CustomFormatScoreEntry", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CurrentScore") - .HasColumnType("INTEGER") - .HasColumnName("current_score"); - - b.Property("CutoffScore") - .HasColumnType("INTEGER") - .HasColumnName("cutoff_score"); - - b.Property("EpisodeId") - .HasColumnType("INTEGER") - .HasColumnName("episode_id"); - - b.Property("ExternalItemId") - .HasColumnType("INTEGER") - .HasColumnName("external_item_id"); - - b.Property("FileId") - .HasColumnType("INTEGER") - .HasColumnName("file_id"); - - b.Property("ItemType") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_type"); - - b.Property("LastSyncedAt") - .HasColumnType("TEXT") - .HasColumnName("last_synced_at"); - - b.Property("QualityProfileName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("quality_profile_name"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("pk_custom_format_score_entries"); - - b.HasIndex("ArrInstanceId", "ExternalItemId", "EpisodeId") - .IsUnique() - .HasDatabaseName("ix_custom_format_score_entries_arr_instance_id_external_item_id_episode_id"); - - b.ToTable("custom_format_score_entries", (string)null); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.CustomFormatScoreHistory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CutoffScore") - .HasColumnType("INTEGER") - .HasColumnName("cutoff_score"); - - 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("RecordedAt") - .HasColumnType("TEXT") - .HasColumnName("recorded_at"); - - b.Property("Score") - .HasColumnType("INTEGER") - .HasColumnName("score"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("pk_custom_format_score_history"); - - b.HasIndex("RecordedAt") - .HasDatabaseName("ix_custom_format_score_history_recorded_at"); - - b.HasIndex("ArrInstanceId", "ExternalItemId", "EpisodeId") - .HasDatabaseName("ix_custom_format_score_history_arr_instance_id_external_item_id_episode_id"); - - b.ToTable("custom_format_score_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.SeekerCommandTracker", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("ArrInstanceId") - .HasColumnType("TEXT") - .HasColumnName("arr_instance_id"); - - b.Property("CommandId") - .HasColumnType("INTEGER") - .HasColumnName("command_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("EventId") - .HasColumnType("TEXT") - .HasColumnName("event_id"); - - b.Property("ExternalItemId") - .HasColumnType("INTEGER") - .HasColumnName("external_item_id"); - - b.Property("ItemTitle") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_title"); - - b.Property("ItemType") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_type"); - - b.Property("SeasonNumber") - .HasColumnType("INTEGER") - .HasColumnName("season_number"); - - b.Property("Status") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.HasKey("Id") - .HasName("pk_seeker_command_trackers"); - - b.HasIndex("ArrInstanceId") - .HasDatabaseName("ix_seeker_command_trackers_arr_instance_id"); - - b.ToTable("seeker_command_trackers", (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("ExternalItemId") - .HasColumnType("INTEGER") - .HasColumnName("external_item_id"); - - b.Property("IsDryRun") - .HasColumnType("INTEGER") - .HasColumnName("is_dry_run"); - - b.Property("ItemTitle") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_title"); - - b.Property("ItemType") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("item_type"); - - b.Property("LastSearchedAt") - .HasColumnType("TEXT") - .HasColumnName("last_searched_at"); - - b.Property("RunId") - .HasColumnType("TEXT") - .HasColumnName("run_id"); - - b.Property("SearchCount") - .HasColumnType("INTEGER") - .HasColumnName("search_count"); - - b.Property("SeasonNumber") - .HasColumnType("INTEGER") - .HasColumnName("season_number"); - - b.HasKey("Id") - .HasName("pk_seeker_history"); - - b.HasIndex("ArrInstanceId", "ExternalItemId", "ItemType", "SeasonNumber", "RunId") - .IsUnique() - .HasDatabaseName("ix_seeker_history_arr_instance_id_external_item_id_item_type_season_number_run_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") @@ -1606,18 +1254,6 @@ namespace Cleanuparr.Persistence.Migrations.Data 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") @@ -1630,66 +1266,6 @@ namespace Cleanuparr.Persistence.Migrations.Data b.Navigation("DownloadClient"); }); - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.CustomFormatScoreEntry", b => - { - b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance") - .WithMany() - .HasForeignKey("ArrInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_custom_format_score_entries_arr_instances_arr_instance_id"); - - b.Navigation("ArrInstance"); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.CustomFormatScoreHistory", b => - { - b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance") - .WithMany() - .HasForeignKey("ArrInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_custom_format_score_history_arr_instances_arr_instance_id"); - - b.Navigation("ArrInstance"); - }); - - 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.SeekerCommandTracker", b => - { - b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", "ArrInstance") - .WithMany() - .HasForeignKey("ArrInstanceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_seeker_command_trackers_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"); diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Events/20260323091607_AddSeeker.Designer.cs b/code/backend/Cleanuparr.Persistence/Migrations/Events/20260323091607_AddSeeker.Designer.cs deleted file mode 100644 index 86ebd994..00000000 --- a/code/backend/Cleanuparr.Persistence/Migrations/Events/20260323091607_AddSeeker.Designer.cs +++ /dev/null @@ -1,405 +0,0 @@ -// -using System; -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.Events -{ - [DbContext(typeof(EventsContext))] - [Migration("20260323091607_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.Events.AppEvent", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CompletedAt") - .HasColumnType("TEXT") - .HasColumnName("completed_at"); - - b.Property("CycleRunId") - .HasColumnType("TEXT") - .HasColumnName("cycle_run_id"); - - b.Property("Data") - .HasColumnType("TEXT") - .HasColumnName("data"); - - b.Property("DownloadClientName") - .HasMaxLength(200) - .HasColumnType("TEXT") - .HasColumnName("download_client_name"); - - b.Property("DownloadClientType") - .HasColumnType("TEXT") - .HasColumnName("download_client_type"); - - b.Property("EventType") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("event_type"); - - b.Property("InstanceType") - .HasColumnType("TEXT") - .HasColumnName("instance_type"); - - b.Property("InstanceUrl") - .HasMaxLength(500) - .HasColumnType("TEXT") - .HasColumnName("instance_url"); - - b.Property("IsDryRun") - .HasColumnType("INTEGER") - .HasColumnName("is_dry_run"); - - b.Property("JobRunId") - .HasColumnType("TEXT") - .HasColumnName("job_run_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("SearchStatus") - .HasColumnType("TEXT") - .HasColumnName("search_status"); - - b.Property("Severity") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("severity"); - - b.Property("StrikeId") - .HasColumnType("TEXT") - .HasColumnName("strike_id"); - - b.Property("Timestamp") - .HasColumnType("TEXT") - .HasColumnName("timestamp"); - - b.Property("TrackingId") - .HasColumnType("TEXT") - .HasColumnName("tracking_id"); - - b.HasKey("Id") - .HasName("pk_events"); - - b.HasIndex("CycleRunId") - .HasDatabaseName("ix_events_cycle_run_id"); - - b.HasIndex("DownloadClientType") - .HasDatabaseName("ix_events_download_client_type"); - - b.HasIndex("EventType") - .HasDatabaseName("ix_events_event_type"); - - b.HasIndex("InstanceType") - .HasDatabaseName("ix_events_instance_type"); - - b.HasIndex("JobRunId") - .HasDatabaseName("ix_events_job_run_id"); - - b.HasIndex("Message") - .HasDatabaseName("ix_events_message"); - - b.HasIndex("Severity") - .HasDatabaseName("ix_events_severity"); - - b.HasIndex("StrikeId") - .HasDatabaseName("ix_events_strike_id"); - - b.HasIndex("Timestamp") - .IsDescending() - .HasDatabaseName("ix_events_timestamp"); - - b.ToTable("events", (string)null); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.Events.ManualEvent", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("Data") - .HasColumnType("TEXT") - .HasColumnName("data"); - - b.Property("DownloadClientName") - .HasMaxLength(200) - .HasColumnType("TEXT") - .HasColumnName("download_client_name"); - - b.Property("DownloadClientType") - .HasColumnType("TEXT") - .HasColumnName("download_client_type"); - - b.Property("InstanceType") - .HasColumnType("TEXT") - .HasColumnName("instance_type"); - - b.Property("InstanceUrl") - .HasMaxLength(500) - .HasColumnType("TEXT") - .HasColumnName("instance_url"); - - b.Property("IsDryRun") - .HasColumnType("INTEGER") - .HasColumnName("is_dry_run"); - - b.Property("IsResolved") - .HasColumnType("INTEGER") - .HasColumnName("is_resolved"); - - b.Property("JobRunId") - .HasColumnType("TEXT") - .HasColumnName("job_run_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("Severity") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("severity"); - - b.Property("Timestamp") - .HasColumnType("TEXT") - .HasColumnName("timestamp"); - - b.HasKey("Id") - .HasName("pk_manual_events"); - - b.HasIndex("InstanceType") - .HasDatabaseName("ix_manual_events_instance_type"); - - b.HasIndex("IsResolved") - .HasDatabaseName("ix_manual_events_is_resolved"); - - b.HasIndex("JobRunId") - .HasDatabaseName("ix_manual_events_job_run_id"); - - b.HasIndex("Message") - .HasDatabaseName("ix_manual_events_message"); - - b.HasIndex("Severity") - .HasDatabaseName("ix_manual_events_severity"); - - b.HasIndex("Timestamp") - .IsDescending() - .HasDatabaseName("ix_manual_events_timestamp"); - - b.ToTable("manual_events", (string)null); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.DownloadItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("DownloadId") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT") - .HasColumnName("download_id"); - - b.Property("IsMarkedForRemoval") - .HasColumnType("INTEGER") - .HasColumnName("is_marked_for_removal"); - - b.Property("IsRemoved") - .HasColumnType("INTEGER") - .HasColumnName("is_removed"); - - b.Property("IsReturning") - .HasColumnType("INTEGER") - .HasColumnName("is_returning"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("pk_download_items"); - - b.HasIndex("DownloadId") - .IsUnique() - .HasDatabaseName("ix_download_items_download_id"); - - b.ToTable("download_items", (string)null); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.JobRun", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CompletedAt") - .HasColumnType("TEXT") - .HasColumnName("completed_at"); - - b.Property("StartedAt") - .HasColumnType("TEXT") - .HasColumnName("started_at"); - - b.Property("Status") - .HasColumnType("TEXT") - .HasColumnName("status"); - - b.Property("Type") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("type"); - - b.HasKey("Id") - .HasName("pk_job_runs"); - - b.HasIndex("StartedAt") - .IsDescending() - .HasDatabaseName("ix_job_runs_started_at"); - - b.HasIndex("Type") - .HasDatabaseName("ix_job_runs_type"); - - b.ToTable("job_runs", (string)null); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.Strike", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("DownloadItemId") - .HasColumnType("TEXT") - .HasColumnName("download_item_id"); - - b.Property("IsDryRun") - .HasColumnType("INTEGER") - .HasColumnName("is_dry_run"); - - b.Property("JobRunId") - .HasColumnType("TEXT") - .HasColumnName("job_run_id"); - - b.Property("LastDownloadedBytes") - .HasColumnType("INTEGER") - .HasColumnName("last_downloaded_bytes"); - - b.Property("Type") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("type"); - - b.HasKey("Id") - .HasName("pk_strikes"); - - b.HasIndex("CreatedAt") - .HasDatabaseName("ix_strikes_created_at"); - - b.HasIndex("JobRunId") - .HasDatabaseName("ix_strikes_job_run_id"); - - b.HasIndex("DownloadItemId", "Type") - .HasDatabaseName("ix_strikes_download_item_id_type"); - - b.ToTable("strikes", (string)null); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.Events.AppEvent", b => - { - b.HasOne("Cleanuparr.Persistence.Models.State.JobRun", "JobRun") - .WithMany("Events") - .HasForeignKey("JobRunId") - .HasConstraintName("fk_events_job_runs_job_run_id"); - - b.HasOne("Cleanuparr.Persistence.Models.State.Strike", "Strike") - .WithMany() - .HasForeignKey("StrikeId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("fk_events_strikes_strike_id"); - - b.Navigation("JobRun"); - - b.Navigation("Strike"); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.Events.ManualEvent", b => - { - b.HasOne("Cleanuparr.Persistence.Models.State.JobRun", "JobRun") - .WithMany("ManualEvents") - .HasForeignKey("JobRunId") - .HasConstraintName("fk_manual_events_job_runs_job_run_id"); - - b.Navigation("JobRun"); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.Strike", b => - { - b.HasOne("Cleanuparr.Persistence.Models.State.DownloadItem", "DownloadItem") - .WithMany("Strikes") - .HasForeignKey("DownloadItemId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_strikes_download_items_download_item_id"); - - b.HasOne("Cleanuparr.Persistence.Models.State.JobRun", "JobRun") - .WithMany("Strikes") - .HasForeignKey("JobRunId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_strikes_job_runs_job_run_id"); - - b.Navigation("DownloadItem"); - - b.Navigation("JobRun"); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.DownloadItem", b => - { - b.Navigation("Strikes"); - }); - - modelBuilder.Entity("Cleanuparr.Persistence.Models.State.JobRun", b => - { - b.Navigation("Events"); - - b.Navigation("ManualEvents"); - - b.Navigation("Strikes"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Events/20260323091607_AddSeeker.cs b/code/backend/Cleanuparr.Persistence/Migrations/Events/20260323091607_AddSeeker.cs deleted file mode 100644 index ab912188..00000000 --- a/code/backend/Cleanuparr.Persistence/Migrations/Events/20260323091607_AddSeeker.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Cleanuparr.Persistence.Migrations.Events -{ - /// - public partial class AddSeeker : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "completed_at", - table: "events", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "cycle_run_id", - table: "events", - type: "TEXT", - nullable: true); - - migrationBuilder.AddColumn( - name: "search_status", - table: "events", - type: "TEXT", - nullable: true); - - migrationBuilder.CreateIndex( - name: "ix_events_cycle_run_id", - table: "events", - column: "cycle_run_id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "ix_events_cycle_run_id", - table: "events"); - - migrationBuilder.DropColumn( - name: "completed_at", - table: "events"); - - migrationBuilder.DropColumn( - name: "cycle_run_id", - table: "events"); - - migrationBuilder.DropColumn( - name: "search_status", - table: "events"); - } - } -} diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Events/EventsContextModelSnapshot.cs b/code/backend/Cleanuparr.Persistence/Migrations/Events/EventsContextModelSnapshot.cs index b97b7700..704ea257 100644 --- a/code/backend/Cleanuparr.Persistence/Migrations/Events/EventsContextModelSnapshot.cs +++ b/code/backend/Cleanuparr.Persistence/Migrations/Events/EventsContextModelSnapshot.cs @@ -24,14 +24,6 @@ namespace Cleanuparr.Persistence.Migrations.Events .HasColumnType("TEXT") .HasColumnName("id"); - b.Property("CompletedAt") - .HasColumnType("TEXT") - .HasColumnName("completed_at"); - - b.Property("CycleRunId") - .HasColumnType("TEXT") - .HasColumnName("cycle_run_id"); - b.Property("Data") .HasColumnType("TEXT") .HasColumnName("data"); @@ -73,10 +65,6 @@ namespace Cleanuparr.Persistence.Migrations.Events .HasColumnType("TEXT") .HasColumnName("message"); - b.Property("SearchStatus") - .HasColumnType("TEXT") - .HasColumnName("search_status"); - b.Property("Severity") .IsRequired() .HasColumnType("TEXT") @@ -97,9 +85,6 @@ namespace Cleanuparr.Persistence.Migrations.Events b.HasKey("Id") .HasName("pk_events"); - b.HasIndex("CycleRunId") - .HasDatabaseName("ix_events_cycle_run_id"); - b.HasIndex("DownloadClientType") .HasDatabaseName("ix_events_download_client_type");