* docs: design spec for multi-instance Sonarr/Radarr request routing Seerr-style multi-instance arr management inside Silo's request system: many instances per kind, HD/4K default routing, entitlement-driven dual-quality fan-out, per-instance anime overrides (keyword 210024), and a one-to-many media_request_targets model. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: implementation plan for multi-instance arr request routing Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(requests): migration for multi-instance arr routing Adds migration 169 to convert request_integrations from a one-row-per-kind table keyed on `kind` to a multi-instance table keyed on `id`, with HD/4K defaults, anime overrides, and a new one-to-many media_request_targets table for per-quality fulfillment tracking. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(requests): instance, target, and dual-quality types Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(requests): id-based integration CRUD Replace upsert-by-kind (UpsertIntegration/UpsertIntegrations) with GetIntegration, CreateIntegration, UpdateIntegration, DeleteIntegration, and ClearDefault. Rewrites scanIntegration and integrationColumns to cover all new multi-instance columns (id, name, is_4k, is_default, is_default_4k, anime_* fields). Updates the Store interface accordingly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(requests): target persistence and aggregate status * feat(tmdb): expose keyword ids and original language on detail * feat(requests): Seerr-exact anime detection (keyword 210024) * feat(requests): quality/anime routing engine Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(requests): force_dual_quality setting Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(requests): multi-target fulfillment, reconcile, retry, and instance CRUD Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(api): request integration CRUD endpoints, targets in responses, entitlement wiring Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(web): multi-instance request integration types and CRUD hooks Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(web): multi-instance arr manager, dual-quality toggle, per-target queue Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(web): UX review fixes for arr manager (delete confirm, switch hints, test feedback, dirty + target status) * fix(requests): address code-review findings (test-connection by id, HD-only default ceiling, retryable partial failure, idempotent submit, transactional defaults, presence/target reconcile, auto-approve gate) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix: address CodeRabbit review (anime override fallback, non-null slices, save gate, a11y, DeleteTarget not-found) - routing: anime fields only override standard root/profile/tags when set, so enabling anime with blank fields reuses standard values instead of clearing them into an invalid submission - api: normalize nil Tags/AnimeTags to [] so they serialize as arrays not null - web: require an API key before saving a NEW instance; add aria-expanded/ aria-controls to the anime-overrides disclosure toggle - repo: DeleteTarget returns ErrNotFound when no row was deleted Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(requests): address PR review findings --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Quick <31828688+Quick104@users.noreply.github.com>
43 lines
1.8 KiB
SQL
43 lines
1.8 KiB
SQL
-- Restore per-fulfillment columns on media_requests.
|
|
ALTER TABLE public.media_requests
|
|
ADD COLUMN IF NOT EXISTS integration_kind text NOT NULL DEFAULT '',
|
|
ADD COLUMN IF NOT EXISTS external_id text NOT NULL DEFAULT '',
|
|
ADD COLUMN IF NOT EXISTS external_status text NOT NULL DEFAULT '';
|
|
|
|
-- Copy back the 1080p target's fulfillment fields (lossy: 4K/anime targets dropped).
|
|
UPDATE public.media_requests mr
|
|
SET integration_kind = t.integration_kind,
|
|
external_id = t.external_id,
|
|
external_status = t.external_status
|
|
FROM public.media_request_targets t
|
|
WHERE t.request_id = mr.id AND t.quality = '1080p';
|
|
|
|
ALTER TABLE public.media_requests DROP COLUMN IF EXISTS is_anime;
|
|
|
|
DROP TABLE IF EXISTS public.media_request_targets;
|
|
|
|
-- Collapse request_integrations back to kind-PK (lossy: keep one default per kind).
|
|
DELETE FROM public.request_integrations a
|
|
USING public.request_integrations b
|
|
WHERE a.kind = b.kind AND a.id <> b.id AND b.is_default AND NOT a.is_default;
|
|
-- If a kind has no default, keep an arbitrary row and drop the rest.
|
|
DELETE FROM public.request_integrations a
|
|
USING public.request_integrations b
|
|
WHERE a.kind = b.kind AND a.ctid < b.ctid;
|
|
|
|
DROP INDEX IF EXISTS idx_request_integrations_default_per_kind;
|
|
DROP INDEX IF EXISTS idx_request_integrations_default4k_per_kind;
|
|
|
|
ALTER TABLE public.request_integrations DROP CONSTRAINT request_integrations_pkey;
|
|
ALTER TABLE public.request_integrations ADD PRIMARY KEY (kind);
|
|
ALTER TABLE public.request_integrations
|
|
DROP COLUMN IF EXISTS id,
|
|
DROP COLUMN IF EXISTS name,
|
|
DROP COLUMN IF EXISTS is_4k,
|
|
DROP COLUMN IF EXISTS is_default,
|
|
DROP COLUMN IF EXISTS is_default_4k,
|
|
DROP COLUMN IF EXISTS anime_enabled,
|
|
DROP COLUMN IF EXISTS anime_quality_profile_id,
|
|
DROP COLUMN IF EXISTS anime_root_folder,
|
|
DROP COLUMN IF EXISTS anime_tags;
|