-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsupabase-schema.sql
More file actions
155 lines (128 loc) · 4.32 KB
/
Copy pathsupabase-schema.sql
File metadata and controls
155 lines (128 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
-- baseFM Database Schema
-- Run this in Supabase SQL Editor
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ============================================
-- STREAMS TABLE
-- ============================================
CREATE TABLE streams (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
-- Basic Info
title TEXT NOT NULL,
description TEXT,
dj_name TEXT NOT NULL,
dj_wallet_address TEXT NOT NULL,
-- Streaming
status TEXT NOT NULL DEFAULT 'CREATED' CHECK (status IN ('CREATED', 'PREPARING', 'LIVE', 'ENDING', 'ENDED')),
mux_live_stream_id TEXT,
mux_stream_key TEXT,
mux_playback_id TEXT,
rtmp_url TEXT,
hls_playback_url TEXT,
-- Scheduling
scheduled_start_time TIMESTAMPTZ,
actual_start_time TIMESTAMPTZ,
actual_end_time TIMESTAMPTZ,
-- Token Gating
is_gated BOOLEAN DEFAULT FALSE,
required_token_address TEXT,
required_token_amount NUMERIC,
-- Metadata
cover_image_url TEXT,
genre TEXT,
tags TEXT[],
-- Timestamps
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
-- Constraints
CONSTRAINT valid_wallet_address CHECK (dj_wallet_address ~* '^0x[a-fA-F0-9]{40}$')
);
-- ============================================
-- STREAM ACTIVITY TABLE (for analytics)
-- ============================================
CREATE TABLE stream_activity (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
stream_id UUID NOT NULL REFERENCES streams(id) ON DELETE CASCADE,
event_type TEXT NOT NULL CHECK (event_type IN ('STREAM_STARTED', 'STREAM_ENDED', 'LISTENER_JOINED', 'LISTENER_LEFT')),
metadata JSONB,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================
-- INDEXES
-- ============================================
CREATE INDEX idx_streams_status ON streams(status);
CREATE INDEX idx_streams_dj_wallet ON streams(dj_wallet_address);
CREATE INDEX idx_streams_created_at ON streams(created_at DESC);
CREATE INDEX idx_streams_is_gated ON streams(is_gated);
CREATE INDEX idx_stream_activity_stream_id ON stream_activity(stream_id);
CREATE INDEX idx_stream_activity_created_at ON stream_activity(created_at DESC);
-- ============================================
-- ROW LEVEL SECURITY
-- ============================================
ALTER TABLE streams ENABLE ROW LEVEL SECURITY;
ALTER TABLE stream_activity ENABLE ROW LEVEL SECURITY;
-- Public read access for streams
CREATE POLICY "Public read access" ON streams
FOR SELECT
USING (true);
-- Public insert/update (in production, you'd want more restrictive policies)
CREATE POLICY "Public insert access" ON streams
FOR INSERT
WITH CHECK (true);
CREATE POLICY "Public update access" ON streams
FOR UPDATE
USING (true);
CREATE POLICY "Public delete access" ON streams
FOR DELETE
USING (true);
-- Public access for stream_activity
CREATE POLICY "Public read access" ON stream_activity
FOR SELECT
USING (true);
CREATE POLICY "Public insert access" ON stream_activity
FOR INSERT
WITH CHECK (true);
-- ============================================
-- HELPER FUNCTIONS
-- ============================================
-- Auto-update updated_at timestamp
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
CREATE TRIGGER update_streams_updated_at
BEFORE UPDATE ON streams
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- Get listener count for a stream
CREATE OR REPLACE FUNCTION get_listener_count(stream_uuid UUID)
RETURNS INTEGER AS $$
DECLARE
join_count INTEGER;
leave_count INTEGER;
BEGIN
SELECT COUNT(*) INTO join_count
FROM stream_activity
WHERE stream_id = stream_uuid AND event_type = 'LISTENER_JOINED';
SELECT COUNT(*) INTO leave_count
FROM stream_activity
WHERE stream_id = stream_uuid AND event_type = 'LISTENER_LEFT';
RETURN GREATEST(join_count - leave_count, 0);
END;
$$ LANGUAGE plpgsql;
-- ============================================
-- VIEWS
-- ============================================
-- Live streams view
CREATE VIEW live_streams AS
SELECT * FROM streams
WHERE status = 'LIVE'
ORDER BY actual_start_time DESC;
-- ============================================
-- ENABLE REALTIME
-- ============================================
ALTER PUBLICATION supabase_realtime ADD TABLE streams;
ALTER PUBLICATION supabase_realtime ADD TABLE stream_activity;