2026-06-06 23:51:30 -04:00
|
|
|
-- +goose Up
|
|
|
|
|
-- +goose StatementBegin
|
2026-05-22 20:26:11 -04:00
|
|
|
-- Add encrypted admin token to history import sources.
|
|
|
|
|
-- The token is encrypted at rest (AES-256-GCM) and never returned in API responses.
|
|
|
|
|
ALTER TABLE history_import_sources
|
|
|
|
|
ADD COLUMN encrypted_admin_token text;
|
|
|
|
|
|
|
|
|
|
-- Persistent user mappings: (source_server_user) → (silo_user + profile).
|
|
|
|
|
-- Created by admins to enable recurring, admin-initiated history imports.
|
|
|
|
|
CREATE TABLE history_import_user_mappings (
|
|
|
|
|
id integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
|
|
|
source_id integer NOT NULL REFERENCES history_import_sources(id) ON DELETE RESTRICT,
|
|
|
|
|
external_user_id text NOT NULL,
|
|
|
|
|
external_user_name text NOT NULL DEFAULT '',
|
|
|
|
|
silo_user_id integer NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
|
silo_profile_id text NOT NULL,
|
|
|
|
|
last_imported_at timestamptz,
|
|
|
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
|
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
|
|
|
CONSTRAINT history_import_user_mappings_unique
|
|
|
|
|
UNIQUE (source_id, external_user_id),
|
|
|
|
|
CONSTRAINT history_import_user_mappings_profile_fkey
|
|
|
|
|
FOREIGN KEY (silo_user_id, silo_profile_id)
|
|
|
|
|
REFERENCES user_profiles(user_id, id) ON DELETE CASCADE
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_history_import_user_mappings_source
|
|
|
|
|
ON history_import_user_mappings (source_id);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_history_import_user_mappings_user
|
|
|
|
|
ON history_import_user_mappings (silo_user_id);
|
|
|
|
|
|
|
|
|
|
-- Link runs to mappings (nullable; null = self-service run, non-null = admin-initiated).
|
|
|
|
|
ALTER TABLE history_import_runs
|
|
|
|
|
ADD COLUMN mapping_id integer REFERENCES history_import_user_mappings(id) ON DELETE SET NULL;
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_history_import_runs_mapping
|
|
|
|
|
ON history_import_runs (mapping_id)
|
|
|
|
|
WHERE mapping_id IS NOT NULL;
|
|
|
|
|
|
|
|
|
|
-- Expand allowed connection_mode values to include admin_token.
|
|
|
|
|
ALTER TABLE history_import_runs
|
|
|
|
|
DROP CONSTRAINT history_import_runs_connection_mode_check,
|
|
|
|
|
ADD CONSTRAINT history_import_runs_connection_mode_check
|
|
|
|
|
CHECK (connection_mode IN ('connect', 'predefined', 'custom', 'plex_oauth', 'admin_token'));
|
2026-06-06 23:51:30 -04:00
|
|
|
-- +goose StatementEnd
|
|
|
|
|
|
|
|
|
|
-- +goose Down
|
|
|
|
|
-- +goose StatementBegin
|
|
|
|
|
ALTER TABLE history_import_runs
|
|
|
|
|
DROP CONSTRAINT history_import_runs_connection_mode_check,
|
|
|
|
|
ADD CONSTRAINT history_import_runs_connection_mode_check
|
|
|
|
|
CHECK (connection_mode IN ('connect', 'predefined', 'custom', 'plex_oauth'));
|
|
|
|
|
|
|
|
|
|
DROP INDEX IF EXISTS idx_history_import_runs_mapping;
|
|
|
|
|
|
|
|
|
|
ALTER TABLE history_import_runs
|
|
|
|
|
DROP COLUMN IF EXISTS mapping_id;
|
|
|
|
|
|
|
|
|
|
DROP INDEX IF EXISTS idx_history_import_user_mappings_user;
|
|
|
|
|
DROP INDEX IF EXISTS idx_history_import_user_mappings_source;
|
|
|
|
|
|
|
|
|
|
DROP TABLE IF EXISTS history_import_user_mappings;
|
|
|
|
|
|
|
|
|
|
ALTER TABLE history_import_sources
|
|
|
|
|
DROP COLUMN IF EXISTS encrypted_admin_token;
|
|
|
|
|
-- +goose StatementEnd
|