From b8d093842e41cc1908a1d5a9e1c14add526d4872 Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Wed, 12 Nov 2025 02:31:58 +0000 Subject: [PATCH] Add service pricing and ecosystem license tracking to Ethos artists cgen-e42e33def43e40dab4363bf7c157e173 --- .../20250211_add_ethos_artist_services.sql | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 supabase/migrations/20250211_add_ethos_artist_services.sql diff --git a/supabase/migrations/20250211_add_ethos_artist_services.sql b/supabase/migrations/20250211_add_ethos_artist_services.sql new file mode 100644 index 00000000..d49a0361 --- /dev/null +++ b/supabase/migrations/20250211_add_ethos_artist_services.sql @@ -0,0 +1,68 @@ +-- Add service pricing and licensing fields to ethos_artist_profiles + +-- Add new columns for service pricing +ALTER TABLE public.ethos_artist_profiles +ADD COLUMN IF NOT EXISTS price_list jsonb DEFAULT '{ + "track_custom": null, + "sfx_pack": null, + "full_score": null, + "day_rate": null, + "contact_for_quote": false +}'::jsonb; + +-- Add ecosystem license acceptance tracking +ALTER TABLE public.ethos_artist_profiles +ADD COLUMN IF NOT EXISTS ecosystem_license_accepted boolean NOT NULL DEFAULT false; + +ALTER TABLE public.ethos_artist_profiles +ADD COLUMN IF NOT EXISTS ecosystem_license_accepted_at timestamptz; + +-- Create index for faster queries on for_hire status +CREATE INDEX IF NOT EXISTS idx_ethos_artist_for_hire ON public.ethos_artist_profiles(for_hire) +WHERE for_hire = true; + +-- Create index for ecosystem license acceptance tracking +CREATE INDEX IF NOT EXISTS idx_ethos_artist_license_accepted ON public.ethos_artist_profiles(ecosystem_license_accepted) +WHERE ecosystem_license_accepted = true; + +-- Add table to track ecosystem license agreements per artist per track +CREATE TABLE IF NOT EXISTS public.ethos_ecosystem_licenses ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + track_id uuid NOT NULL REFERENCES public.ethos_tracks(id) ON DELETE CASCADE, + artist_id uuid NOT NULL REFERENCES public.user_profiles(id) ON DELETE CASCADE, + accepted_at timestamptz NOT NULL DEFAULT now(), + agreement_version text NOT NULL DEFAULT '1.0', -- Track KND-008 version + agreement_text_hash text, -- Hash of agreement text for audit + created_at timestamptz NOT NULL DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_ethos_ecosystem_licenses_artist_id ON public.ethos_ecosystem_licenses(artist_id); +CREATE INDEX IF NOT EXISTS idx_ethos_ecosystem_licenses_track_id ON public.ethos_ecosystem_licenses(track_id); +CREATE UNIQUE INDEX IF NOT EXISTS idx_ethos_ecosystem_licenses_unique ON public.ethos_ecosystem_licenses(track_id, artist_id); + +-- Enable RLS on ecosystem licenses table +ALTER TABLE public.ethos_ecosystem_licenses ENABLE ROW LEVEL SECURITY; + +-- RLS Policies: ethos_ecosystem_licenses +CREATE POLICY "Artists can view their own ecosystem licenses" ON public.ethos_ecosystem_licenses + FOR SELECT USING (auth.uid() = artist_id); + +CREATE POLICY "Admins can view all ecosystem licenses" ON public.ethos_ecosystem_licenses + FOR SELECT USING ( + EXISTS( + SELECT 1 FROM public.user_profiles + WHERE id = auth.uid() AND is_admin = true + ) + ); + +CREATE POLICY "Artists can create ecosystem license records" ON public.ethos_ecosystem_licenses + FOR INSERT WITH CHECK (auth.uid() = artist_id); + +-- Add comments for documentation +COMMENT ON COLUMN public.ethos_artist_profiles.price_list IS 'JSON object with pricing: {track_custom: 500, sfx_pack: 150, full_score: 2000, day_rate: 1500, contact_for_quote: false}'; + +COMMENT ON COLUMN public.ethos_artist_profiles.ecosystem_license_accepted IS 'Whether artist has accepted the KND-008 Ecosystem License agreement'; + +COMMENT ON COLUMN public.ethos_artist_profiles.ecosystem_license_accepted_at IS 'Timestamp when artist accepted the Ecosystem License'; + +COMMENT ON TABLE public.ethos_ecosystem_licenses IS 'Tracks individual ecosystem license acceptances per track for audit and compliance';