Add migration 950 with track_distributions, track_distribution_status_history, and external_streaming_royalties tables for F501-F510. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
93 lines
3.7 KiB
SQL
93 lines
3.7 KiB
SQL
-- v0.12.2: Distribution vers Plateformes (F501-F510)
|
|
-- Track distribution to Spotify, Apple Music, Deezer via distributor partner
|
|
|
|
-- Track distribution submissions
|
|
CREATE TABLE IF NOT EXISTS track_distributions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
track_id UUID NOT NULL REFERENCES tracks(id) ON DELETE CASCADE,
|
|
creator_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
-- Distributor info
|
|
distributor VARCHAR(50) NOT NULL DEFAULT 'distrokid',
|
|
submission_id VARCHAR(255) NOT NULL UNIQUE,
|
|
submission_upc VARCHAR(50),
|
|
submission_isrc VARCHAR(50),
|
|
|
|
-- Metadata snapshot at submission time
|
|
metadata JSONB NOT NULL DEFAULT '{}',
|
|
cover_file_path VARCHAR(512),
|
|
|
|
-- Overall status
|
|
overall_status VARCHAR(50) NOT NULL DEFAULT 'submitted',
|
|
|
|
-- Platform-specific status (JSON)
|
|
-- e.g. {"spotify": {"status":"live","url":"...","live_date":"...","error":null}}
|
|
platform_statuses JSONB NOT NULL DEFAULT '{}',
|
|
|
|
-- Timestamps
|
|
submitted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
first_live_at TIMESTAMPTZ,
|
|
last_status_check_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_track_distributions_track ON track_distributions(track_id);
|
|
CREATE INDEX IF NOT EXISTS idx_track_distributions_creator ON track_distributions(creator_id);
|
|
CREATE INDEX IF NOT EXISTS idx_track_distributions_status ON track_distributions(overall_status);
|
|
CREATE INDEX IF NOT EXISTS idx_track_distributions_submitted ON track_distributions(submitted_at DESC);
|
|
|
|
-- Distribution status change history (audit trail)
|
|
CREATE TABLE IF NOT EXISTS track_distribution_status_history (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
distribution_id UUID NOT NULL REFERENCES track_distributions(id) ON DELETE CASCADE,
|
|
platform VARCHAR(50) NOT NULL,
|
|
old_status VARCHAR(50),
|
|
new_status VARCHAR(50) NOT NULL,
|
|
note TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_dist_status_history_dist ON track_distribution_status_history(distribution_id);
|
|
|
|
-- External streaming royalties (monthly imports from distributors)
|
|
CREATE TABLE IF NOT EXISTS external_streaming_royalties (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
track_id UUID NOT NULL REFERENCES tracks(id) ON DELETE CASCADE,
|
|
creator_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
|
|
-- Reporting period
|
|
reporting_period_start DATE NOT NULL,
|
|
reporting_period_end DATE NOT NULL,
|
|
|
|
-- Platform
|
|
platform VARCHAR(50) NOT NULL,
|
|
|
|
-- Metrics
|
|
total_streams BIGINT NOT NULL DEFAULT 0,
|
|
total_revenue_cents BIGINT NOT NULL DEFAULT 0,
|
|
currency VARCHAR(3) NOT NULL DEFAULT 'USD',
|
|
|
|
-- Breakdown (optional JSON)
|
|
streams_breakdown JSONB,
|
|
|
|
-- Distributor info
|
|
distributor VARCHAR(50) NOT NULL DEFAULT 'distrokid',
|
|
distributor_report_id VARCHAR(255),
|
|
|
|
-- Import status
|
|
import_status VARCHAR(50) NOT NULL DEFAULT 'pending',
|
|
import_error TEXT,
|
|
imported_at TIMESTAMPTZ,
|
|
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
|
|
CONSTRAINT chk_streams_non_negative CHECK (total_streams >= 0),
|
|
CONSTRAINT chk_revenue_non_negative CHECK (total_revenue_cents >= 0),
|
|
CONSTRAINT uq_royalty_period_platform UNIQUE (track_id, platform, reporting_period_start)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_ext_royalties_creator_period ON external_streaming_royalties(creator_id, reporting_period_start DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_ext_royalties_track ON external_streaming_royalties(track_id);
|
|
CREATE INDEX IF NOT EXISTS idx_ext_royalties_platform ON external_streaming_royalties(platform);
|