From dd2f7247f17f2bcad1e4268ed58a36e561fee4b2 Mon Sep 17 00:00:00 2001 From: mkelvers Date: Sun, 17 May 2026 21:15:59 +0200 Subject: [PATCH] feat: add episode availability cache and provider mapping tables --- .../017_add_episode_availability.sql | 27 +++++++ ...move_episode_availability_foreign_keys.sql | 79 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 internal/database/migrations/017_add_episode_availability.sql create mode 100644 internal/database/migrations/018_remove_episode_availability_foreign_keys.sql diff --git a/internal/database/migrations/017_add_episode_availability.sql b/internal/database/migrations/017_add_episode_availability.sql new file mode 100644 index 0000000..617b87d --- /dev/null +++ b/internal/database/migrations/017_add_episode_availability.sql @@ -0,0 +1,27 @@ +-- +goose Up +CREATE TABLE IF NOT EXISTS episode_availability_cache ( + anime_id INTEGER PRIMARY KEY, + data TEXT NOT NULL, + next_refresh_at DATETIME, + retry_until_at DATETIME, + last_attempt_at DATETIME, + last_success_at DATETIME, + failure_count INTEGER NOT NULL DEFAULT 0, + last_error TEXT NOT NULL DEFAULT '', + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS episode_provider_mapping ( + anime_id INTEGER NOT NULL, + provider TEXT NOT NULL, + provider_show_id TEXT NOT NULL, + failed_until DATETIME, + last_error TEXT NOT NULL DEFAULT '', + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (anime_id, provider) +); + +CREATE INDEX IF NOT EXISTS idx_episode_availability_next_refresh +ON episode_availability_cache(next_refresh_at); + +-- +goose Down diff --git a/internal/database/migrations/018_remove_episode_availability_foreign_keys.sql b/internal/database/migrations/018_remove_episode_availability_foreign_keys.sql new file mode 100644 index 0000000..8141730 --- /dev/null +++ b/internal/database/migrations/018_remove_episode_availability_foreign_keys.sql @@ -0,0 +1,79 @@ +-- +goose Up +PRAGMA foreign_keys=OFF; + +ALTER TABLE episode_availability_cache RENAME TO episode_availability_cache_old; + +CREATE TABLE IF NOT EXISTS episode_availability_cache ( + anime_id INTEGER PRIMARY KEY, + data TEXT NOT NULL, + next_refresh_at DATETIME, + retry_until_at DATETIME, + last_attempt_at DATETIME, + last_success_at DATETIME, + failure_count INTEGER NOT NULL DEFAULT 0, + last_error TEXT NOT NULL DEFAULT '', + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +INSERT OR REPLACE INTO episode_availability_cache ( + anime_id, + data, + next_refresh_at, + retry_until_at, + last_attempt_at, + last_success_at, + failure_count, + last_error, + updated_at +) +SELECT + anime_id, + data, + next_refresh_at, + retry_until_at, + last_attempt_at, + last_success_at, + failure_count, + last_error, + updated_at +FROM episode_availability_cache_old; + +DROP TABLE episode_availability_cache_old; + +ALTER TABLE episode_provider_mapping RENAME TO episode_provider_mapping_old; + +CREATE TABLE IF NOT EXISTS episode_provider_mapping ( + anime_id INTEGER NOT NULL, + provider TEXT NOT NULL, + provider_show_id TEXT NOT NULL, + failed_until DATETIME, + last_error TEXT NOT NULL DEFAULT '', + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (anime_id, provider) +); + +INSERT OR REPLACE INTO episode_provider_mapping ( + anime_id, + provider, + provider_show_id, + failed_until, + last_error, + updated_at +) +SELECT + anime_id, + provider, + provider_show_id, + failed_until, + last_error, + updated_at +FROM episode_provider_mapping_old; + +DROP TABLE episode_provider_mapping_old; + +CREATE INDEX IF NOT EXISTS idx_episode_availability_next_refresh +ON episode_availability_cache(next_refresh_at); + +PRAGMA foreign_keys=ON; + +-- +goose Down