Files

53 lines
2.5 KiB
SQL
Raw Permalink Normal View History

-- +goose Up
-- Register built-in host metadata providers as data (#216, Phase A).
--
-- Chain rows require a real plugin_installations id (FK + composite PK), so
-- built-ins are represented by one reserved installation row of kind
-- 'builtin' plus ordinary plugin_capabilities rows. The install_path is a
-- guaranteed-nonexistent sentinel: InstallationStore.Delete removes the
-- install directory on disk, so the sentinel must never resolve to a real
-- directory (the store additionally rejects deleting builtin rows).
--
-- Statement order matters: the partial unique index must exist before any
-- ON CONFLICT targets it, and the installation insert uses
-- INSERT ... SELECT ... WHERE NOT EXISTS because plugin_id had no unique
-- constraint before this migration.
ALTER TABLE plugin_installations
ADD COLUMN kind TEXT NOT NULL DEFAULT 'plugin'
CONSTRAINT plugin_installations_kind_check CHECK (kind IN ('plugin', 'builtin'));
CREATE UNIQUE INDEX idx_plugin_installations_builtin_plugin_id
ON plugin_installations (plugin_id)
WHERE kind = 'builtin';
INSERT INTO plugin_installations (plugin_id, version, install_path, enabled, update_policy, kind)
SELECT 'silo.builtin', '0', '/nonexistent/silo-builtin', true, 'manual', 'builtin'
WHERE NOT EXISTS (
SELECT 1 FROM plugin_installations WHERE plugin_id = 'silo.builtin'
);
-- The NFO provider: seeded disabled everywhere (default_enabled=false), at
-- declared priority 1 for movie/series when an admin enables it.
INSERT INTO plugin_capabilities (plugin_installation_id, capability_type, capability_id, metadata)
SELECT pi.id, 'metadata_provider.v1', 'nfo',
'{"display_name":"NFO Files","default_priority":{"movie":1,"series":1},"default_enabled":false}'::jsonb
FROM plugin_installations pi
WHERE pi.plugin_id = 'silo.builtin' AND pi.kind = 'builtin'
ON CONFLICT DO NOTHING;
-- +goose Down
-- Rolling back deletes the reserved installation row; library_provider_chains
-- rows referencing it cascade, so any admin-configured NFO chain placement is
-- lost on rollback (accepted and documented).
DELETE FROM plugin_capabilities pc
USING plugin_installations pi
WHERE pc.plugin_installation_id = pi.id
AND pi.plugin_id = 'silo.builtin' AND pi.kind = 'builtin'
AND pc.capability_type = 'metadata_provider.v1' AND pc.capability_id = 'nfo';
DELETE FROM plugin_installations WHERE plugin_id = 'silo.builtin' AND kind = 'builtin';
DROP INDEX IF EXISTS idx_plugin_installations_builtin_plugin_id;
ALTER TABLE plugin_installations DROP COLUMN kind;