Files
pipu-music/services/api/migrations/00025_upload_release_lookup.sql
mrleo1nid 39bf7d4b70
ci / module boundaries / boundaries (push) Successful in 10s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m30s
ci / api / api (push) Successful in 58s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m1s
ci / db / db (push) Failing after 25s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m36s
ci / ts / ts (packages + web) (push) Failing after 6m3s
feat(uploads): match release groups with MusicBrainz and AcoustID
2026-10-29 20:44:59 +03:00

59 lines
2.5 KiB
PL/PgSQL

-- +goose Up
CREATE TABLE metadata_lookup_cache (
cache_key text PRIMARY KEY,
payload bytea NOT NULL,
expires_at timestamptz NOT NULL
);
CREATE INDEX metadata_lookup_cache_expiry ON metadata_lookup_cache(expires_at);
CREATE TABLE upload_release_groups (
id uuid PRIMARY KEY,
batch_id uuid NOT NULL REFERENCES upload_batches(id) ON DELETE CASCADE,
grouping_key text NOT NULL,
artist text NOT NULL DEFAULT '',
album text NOT NULL DEFAULT '',
cover_path text,
UNIQUE(batch_id,grouping_key)
);
ALTER TABLE upload_files ADD COLUMN release_group_id uuid REFERENCES upload_release_groups(id) ON DELETE SET NULL;
CREATE INDEX upload_files_release_group ON upload_files(release_group_id);
CREATE TABLE upload_release_jobs (
batch_id uuid NOT NULL REFERENCES upload_batches(id) ON DELETE CASCADE,
group_key text NOT NULL DEFAULT '',
state text NOT NULL DEFAULT 'queued' CHECK (state IN ('queued','searching','ready','not_found','needs_input','error')),
request jsonb NOT NULL DEFAULT '{}',
input_hash text NOT NULL DEFAULT '',
candidates jsonb NOT NULL DEFAULT '[]',
audio_results jsonb NOT NULL DEFAULT '[]',
selected_release uuid,
lease uuid,
attempts int NOT NULL DEFAULT 0,
updated_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY(batch_id,group_key)
);
-- +goose StatementBegin
CREATE FUNCTION queue_upload_release_lookup() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
IF NEW.status IN ('pending_review','import_failed','withdrawn') AND
(OLD.status IS DISTINCT FROM NEW.status OR OLD.metadata IS DISTINCT FROM NEW.metadata OR
OLD.tags IS DISTINCT FROM NEW.tags OR OLD.duration_ms IS DISTINCT FROM NEW.duration_ms) THEN
INSERT INTO upload_release_jobs(batch_id,group_key) VALUES (NEW.batch_id,coalesce(NEW.release_group_id::text,''))
ON CONFLICT (batch_id,group_key) DO UPDATE SET state='queued', request='{}', audio_results='[]', lease=NULL, attempts=0,
selected_release=NULL, updated_at=now();
END IF;
RETURN NEW;
END;
$$;
-- +goose StatementEnd
CREATE TRIGGER upload_release_lookup_changed AFTER UPDATE OF status, metadata, tags, duration_ms ON upload_files
FOR EACH ROW EXECUTE FUNCTION queue_upload_release_lookup();
INSERT INTO upload_release_jobs(batch_id)
SELECT DISTINCT batch_id FROM upload_files WHERE status IN ('pending_review','import_failed');
-- +goose Down
DROP TRIGGER upload_release_lookup_changed ON upload_files;
DROP FUNCTION queue_upload_release_lookup();
DROP TABLE upload_release_jobs;
ALTER TABLE upload_files DROP COLUMN release_group_id;
DROP TABLE upload_release_groups;
DROP TABLE metadata_lookup_cache;