-- Nullable organization/team scope columns are schema reservations only. V1 -- keeps every object user-scoped and exposes no organization API. ALTER TABLE balance_accounts ADD COLUMN IF NOT EXISTS organization_id UUID; ALTER TABLE balance_accounts ADD COLUMN IF NOT EXISTS object_scope TEXT NOT NULL DEFAULT 'user'; ALTER TABLE generation_tasks ADD COLUMN IF NOT EXISTS organization_id UUID; ALTER TABLE generation_tasks ADD COLUMN IF NOT EXISTS workspace_owner_id UUID; ALTER TABLE generation_tasks ADD COLUMN IF NOT EXISTS object_scope TEXT NOT NULL DEFAULT 'user'; ALTER TABLE upload_objects ADD COLUMN IF NOT EXISTS organization_id UUID; ALTER TABLE upload_objects ADD COLUMN IF NOT EXISTS workspace_owner_id UUID; ALTER TABLE upload_objects ADD COLUMN IF NOT EXISTS object_scope TEXT NOT NULL DEFAULT 'user'; ALTER TABLE assets ADD COLUMN IF NOT EXISTS organization_id UUID; ALTER TABLE assets ADD COLUMN IF NOT EXISTS workspace_owner_id UUID; ALTER TABLE assets ADD COLUMN IF NOT EXISTS object_scope TEXT NOT NULL DEFAULT 'user'; ALTER TABLE stored_objects ADD COLUMN IF NOT EXISTS organization_id TEXT; ALTER TABLE stored_objects ADD COLUMN IF NOT EXISTS workspace_owner_id TEXT; ALTER TABLE stored_objects ADD COLUMN IF NOT EXISTS object_scope TEXT NOT NULL DEFAULT 'user'; DO $$ DECLARE table_name TEXT; BEGIN FOR table_name IN SELECT unnest(ARRAY['balance_accounts', 'generation_tasks', 'upload_objects', 'assets', 'stored_objects']) LOOP EXECUTE format('ALTER TABLE %I DROP CONSTRAINT IF EXISTS %I_object_scope_check', table_name, table_name); EXECUTE format('ALTER TABLE %I ADD CONSTRAINT %I_object_scope_check CHECK (object_scope IN (''user'', ''organization''))', table_name, table_name); END LOOP; END $$;