Files
blackcanyontickets/supabase/migrations/001_initial_schema.sql
2025-07-08 12:31:31 -06:00

145 lines
4.8 KiB
SQL

-- Enable necessary extensions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Create organizations table
CREATE TABLE organizations (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL,
logo TEXT,
stripe_account_id TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create users table with organization reference
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
email TEXT UNIQUE NOT NULL,
name TEXT,
organization_id UUID REFERENCES organizations(id),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create events table
CREATE TABLE events (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
title TEXT NOT NULL,
slug TEXT NOT NULL,
venue TEXT NOT NULL,
start_time TIMESTAMP WITH TIME ZONE NOT NULL,
description TEXT,
created_by UUID REFERENCES users(id) NOT NULL,
organization_id UUID REFERENCES organizations(id) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(slug, organization_id)
);
-- Create tickets table
CREATE TABLE tickets (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
event_id UUID REFERENCES events(id) NOT NULL,
uuid TEXT UNIQUE NOT NULL DEFAULT uuid_generate_v4()::TEXT,
price DECIMAL(10,2) NOT NULL,
purchaser_email TEXT NOT NULL,
purchaser_name TEXT,
checked_in BOOLEAN DEFAULT FALSE,
scanned_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create payouts table
CREATE TABLE payouts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
event_id UUID REFERENCES events(id) NOT NULL,
gross DECIMAL(10,2) NOT NULL,
fee DECIMAL(10,2) NOT NULL,
net DECIMAL(10,2) NOT NULL,
stripe_transfer_id TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Enable Row Level Security
ALTER TABLE organizations ENABLE ROW LEVEL SECURITY;
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE events ENABLE ROW LEVEL SECURITY;
ALTER TABLE tickets ENABLE ROW LEVEL SECURITY;
ALTER TABLE payouts ENABLE ROW LEVEL SECURITY;
-- RLS Policies for organizations
CREATE POLICY "Users can view their own organization" ON organizations
FOR SELECT USING (id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
));
CREATE POLICY "Users can update their own organization" ON organizations
FOR UPDATE USING (id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
));
-- RLS Policies for users
CREATE POLICY "Users can view their own profile" ON users
FOR SELECT USING (id = auth.uid());
CREATE POLICY "Users can update their own profile" ON users
FOR UPDATE USING (id = auth.uid());
-- RLS Policies for events
CREATE POLICY "Users can view events from their organization" ON events
FOR SELECT USING (organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
));
CREATE POLICY "Users can create events for their organization" ON events
FOR INSERT WITH CHECK (
organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
) AND created_by = auth.uid()
);
CREATE POLICY "Users can update events they created" ON events
FOR UPDATE USING (created_by = auth.uid());
CREATE POLICY "Users can delete events they created" ON events
FOR DELETE USING (created_by = auth.uid());
-- RLS Policies for tickets
CREATE POLICY "Users can view tickets for their organization's events" ON tickets
FOR SELECT USING (event_id IN (
SELECT id FROM events WHERE organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
)
));
CREATE POLICY "Anyone can create tickets" ON tickets
FOR INSERT WITH CHECK (true);
CREATE POLICY "Users can update tickets for their organization's events" ON tickets
FOR UPDATE USING (event_id IN (
SELECT id FROM events WHERE organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
)
));
-- RLS Policies for payouts
CREATE POLICY "Users can view payouts for their organization's events" ON payouts
FOR SELECT USING (event_id IN (
SELECT id FROM events WHERE organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
)
));
CREATE POLICY "Users can create payouts for their organization's events" ON payouts
FOR INSERT WITH CHECK (event_id IN (
SELECT id FROM events WHERE organization_id IN (
SELECT organization_id FROM users WHERE id = auth.uid()
)
));
-- Create indexes for better performance
CREATE INDEX idx_users_organization_id ON users(organization_id);
CREATE INDEX idx_events_organization_id ON events(organization_id);
CREATE INDEX idx_events_created_by ON events(created_by);
CREATE INDEX idx_events_slug ON events(slug);
CREATE INDEX idx_tickets_event_id ON tickets(event_id);
CREATE INDEX idx_tickets_uuid ON tickets(uuid);
CREATE INDEX idx_tickets_purchaser_email ON tickets(purchaser_email);
CREATE INDEX idx_payouts_event_id ON payouts(event_id);