- Add Prisma schema with all database models - Creator channels, streams, VOD, clips, monetization - Real-time chat, polls, interactions - Subscriptions, donations, payouts - Social graph (followers), clips, leaderboards - Complete Platform Architecture documentation - API structure and routes documentation - Implementation roadmap (8 phases) - Updated README with platform vision - Install core dependencies: Prisma, Clerk, Stripe, Socket.io Ready for Phase 1 development with database setup.
382 lines
10 KiB
Markdown
382 lines
10 KiB
Markdown
# Database Schema for AeThex LIVE
|
|
|
|
## Users & Authentication
|
|
|
|
```sql
|
|
-- Users table
|
|
CREATE TABLE users (
|
|
id UUID PRIMARY KEY,
|
|
username VARCHAR(255) UNIQUE NOT NULL,
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
display_name VARCHAR(255),
|
|
bio TEXT,
|
|
avatar_url VARCHAR(255),
|
|
banner_url VARCHAR(255),
|
|
is_creator BOOLEAN DEFAULT false,
|
|
verified BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- User settings
|
|
CREATE TABLE user_settings (
|
|
user_id UUID PRIMARY KEY REFERENCES users(id),
|
|
email_notifications BOOLEAN DEFAULT true,
|
|
two_factor_enabled BOOLEAN DEFAULT false,
|
|
privacy_level VARCHAR(50) DEFAULT 'public', -- public, private, friends
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Channels & Streaming
|
|
|
|
```sql
|
|
-- Channels table
|
|
CREATE TABLE channels (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
name VARCHAR(255) NOT NULL,
|
|
slug VARCHAR(255) UNIQUE NOT NULL,
|
|
description TEXT,
|
|
category VARCHAR(100), -- gaming, music, education, etc.
|
|
language VARCHAR(50),
|
|
is_live BOOLEAN DEFAULT false,
|
|
total_views BIGINT DEFAULT 0,
|
|
follower_count INT DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Streams (live sessions)
|
|
CREATE TABLE streams (
|
|
id UUID PRIMARY KEY,
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
title VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
status VARCHAR(50), -- live, ended, scheduled
|
|
stream_key VARCHAR(255) UNIQUE NOT NULL,
|
|
hls_url VARCHAR(255),
|
|
thumbnail_url VARCHAR(255),
|
|
viewer_count INT DEFAULT 0,
|
|
started_at TIMESTAMP,
|
|
ended_at TIMESTAMP,
|
|
duration_seconds INT,
|
|
is_archived BOOLEAN DEFAULT true,
|
|
archive_url VARCHAR(255),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Stream tags
|
|
CREATE TABLE stream_tags (
|
|
stream_id UUID REFERENCES streams(id),
|
|
tag VARCHAR(100),
|
|
PRIMARY KEY (stream_id, tag)
|
|
);
|
|
```
|
|
|
|
## Social Features
|
|
|
|
```sql
|
|
-- Followers/Subscriptions
|
|
CREATE TABLE followers (
|
|
follower_id UUID NOT NULL REFERENCES users(id),
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
follow_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
notification_enabled BOOLEAN DEFAULT true,
|
|
PRIMARY KEY (follower_id, channel_id)
|
|
);
|
|
|
|
-- User follows
|
|
CREATE TABLE user_follows_user (
|
|
follower_id UUID NOT NULL REFERENCES users(id),
|
|
following_id UUID NOT NULL REFERENCES users(id),
|
|
follow_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (follower_id, following_id)
|
|
);
|
|
```
|
|
|
|
## Chat & Moderation
|
|
|
|
```sql
|
|
-- Chat messages
|
|
CREATE TABLE chat_messages (
|
|
id UUID PRIMARY KEY,
|
|
stream_id UUID NOT NULL REFERENCES streams(id),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
message TEXT NOT NULL,
|
|
is_deleted BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Chat bans/moderation
|
|
CREATE TABLE chat_bans (
|
|
id UUID PRIMARY KEY,
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
banned_user_id UUID NOT NULL REFERENCES users(id),
|
|
reason TEXT,
|
|
banned_until TIMESTAMP,
|
|
is_permanent BOOLEAN DEFAULT false,
|
|
created_by UUID NOT NULL REFERENCES users(id),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Moderation queue
|
|
CREATE TABLE moderation_queue (
|
|
id UUID PRIMARY KEY,
|
|
stream_id UUID REFERENCES streams(id),
|
|
message_id UUID REFERENCES chat_messages(id),
|
|
reported_by UUID NOT NULL REFERENCES users(id),
|
|
reason VARCHAR(255),
|
|
status VARCHAR(50) DEFAULT 'pending', -- pending, approved, rejected
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Monetization
|
|
|
|
```sql
|
|
-- Subscriptions
|
|
CREATE TABLE subscriptions (
|
|
id UUID PRIMARY KEY,
|
|
subscriber_id UUID NOT NULL REFERENCES users(id),
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
tier VARCHAR(50), -- basic, premium, vip
|
|
price_cents INT NOT NULL,
|
|
stripe_subscription_id VARCHAR(255),
|
|
status VARCHAR(50), -- active, cancelled, expired
|
|
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
ended_at TIMESTAMP,
|
|
auto_renew BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Donations/Tips
|
|
CREATE TABLE donations (
|
|
id UUID PRIMARY KEY,
|
|
donor_id UUID NOT NULL REFERENCES users(id),
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
stream_id UUID REFERENCES streams(id),
|
|
amount_cents INT NOT NULL,
|
|
currency VARCHAR(3) DEFAULT 'USD',
|
|
message TEXT,
|
|
stripe_charge_id VARCHAR(255),
|
|
status VARCHAR(50) DEFAULT 'completed', -- pending, completed, failed
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Creator payouts
|
|
CREATE TABLE payouts (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
amount_cents INT NOT NULL,
|
|
currency VARCHAR(3) DEFAULT 'USD',
|
|
stripe_payout_id VARCHAR(255),
|
|
status VARCHAR(50) DEFAULT 'pending', -- pending, paid, failed
|
|
period_start DATE,
|
|
period_end DATE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Content
|
|
|
|
```sql
|
|
-- VODs (Video on Demand)
|
|
CREATE TABLE vods (
|
|
id UUID PRIMARY KEY,
|
|
stream_id UUID UNIQUE NOT NULL REFERENCES streams(id),
|
|
title VARCHAR(255),
|
|
description TEXT,
|
|
thumbnail_url VARCHAR(255),
|
|
duration_seconds INT,
|
|
views INT DEFAULT 0,
|
|
is_public BOOLEAN DEFAULT true,
|
|
processing_status VARCHAR(50) DEFAULT 'processing', -- processing, ready, failed
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Clips
|
|
CREATE TABLE clips (
|
|
id UUID PRIMARY KEY,
|
|
vod_id UUID REFERENCES vods(id),
|
|
stream_id UUID REFERENCES streams(id),
|
|
creator_id UUID NOT NULL REFERENCES users(id),
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
title VARCHAR(255) NOT NULL,
|
|
slug VARCHAR(255) UNIQUE NOT NULL,
|
|
description TEXT,
|
|
thumbnail_url VARCHAR(255),
|
|
video_url VARCHAR(255),
|
|
start_seconds INT,
|
|
duration_seconds INT,
|
|
views INT DEFAULT 0,
|
|
likes INT DEFAULT 0,
|
|
is_public BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Clip reactions
|
|
CREATE TABLE clip_likes (
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
clip_id UUID NOT NULL REFERENCES clips(id),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (user_id, clip_id)
|
|
);
|
|
```
|
|
|
|
## Interactions & Engagement
|
|
|
|
```sql
|
|
-- Live polls
|
|
CREATE TABLE polls (
|
|
id UUID PRIMARY KEY,
|
|
stream_id UUID NOT NULL REFERENCES streams(id),
|
|
question VARCHAR(255) NOT NULL,
|
|
duration_seconds INT,
|
|
status VARCHAR(50) DEFAULT 'active', -- active, ended
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
ended_at TIMESTAMP
|
|
);
|
|
|
|
-- Poll options
|
|
CREATE TABLE poll_options (
|
|
id UUID PRIMARY KEY,
|
|
poll_id UUID NOT NULL REFERENCES polls(id),
|
|
option VARCHAR(255) NOT NULL,
|
|
vote_count INT DEFAULT 0
|
|
);
|
|
|
|
-- Poll votes
|
|
CREATE TABLE poll_votes (
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
poll_option_id UUID NOT NULL REFERENCES poll_options(id),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (user_id, poll_option_id)
|
|
);
|
|
|
|
-- Reactions/Emotes
|
|
CREATE TABLE chat_reactions (
|
|
id UUID PRIMARY KEY,
|
|
stream_id UUID NOT NULL REFERENCES streams(id),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
emoji VARCHAR(50),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Gifting
|
|
CREATE TABLE gifts (
|
|
id UUID PRIMARY KEY,
|
|
gifter_id UUID NOT NULL REFERENCES users(id),
|
|
recipient_id UUID NOT NULL REFERENCES users(id),
|
|
stream_id UUID REFERENCES streams(id),
|
|
gift_type VARCHAR(50), -- custom types
|
|
amount_cents INT NOT NULL,
|
|
message TEXT,
|
|
stripe_charge_id VARCHAR(255),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Gaming/Competitions
|
|
|
|
```sql
|
|
-- Tournaments
|
|
CREATE TABLE tournaments (
|
|
id UUID PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
owner_id UUID NOT NULL REFERENCES users(id),
|
|
game VARCHAR(255),
|
|
status VARCHAR(50) DEFAULT 'draft', -- draft, active, ended
|
|
max_participants INT,
|
|
prize_pool_cents INT,
|
|
started_at TIMESTAMP,
|
|
ended_at TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Tournament participants
|
|
CREATE TABLE tournament_participants (
|
|
id UUID PRIMARY KEY,
|
|
tournament_id UUID NOT NULL REFERENCES tournaments(id),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
seed INT,
|
|
final_rank INT,
|
|
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Leaderboards
|
|
CREATE TABLE leaderboards (
|
|
id UUID PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
game VARCHAR(255),
|
|
period VARCHAR(50), -- weekly, monthly, all-time
|
|
reset_date DATE
|
|
);
|
|
|
|
-- Leaderboard entries
|
|
CREATE TABLE leaderboard_entries (
|
|
leaderboard_id UUID NOT NULL REFERENCES leaderboards(id),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
rank INT,
|
|
score BIGINT,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (leaderboard_id, user_id)
|
|
);
|
|
```
|
|
|
|
## Analytics
|
|
|
|
```sql
|
|
-- Stream analytics
|
|
CREATE TABLE stream_analytics (
|
|
id UUID PRIMARY KEY,
|
|
stream_id UUID NOT NULL REFERENCES streams(id),
|
|
hour_timestamp TIMESTAMP,
|
|
viewer_count INT,
|
|
peak_viewers INT,
|
|
avg_watch_time_seconds INT,
|
|
new_followers INT,
|
|
subscriptions INT,
|
|
donations_cents INT,
|
|
chat_messages INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Channel analytics (daily)
|
|
CREATE TABLE channel_analytics (
|
|
id UUID PRIMARY KEY,
|
|
channel_id UUID NOT NULL REFERENCES channels(id),
|
|
date DATE,
|
|
total_views INT,
|
|
new_followers INT,
|
|
subscriptions INT,
|
|
donations_cents INT,
|
|
revenue_cents INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Indexes
|
|
|
|
```sql
|
|
-- Performance indexes
|
|
CREATE INDEX idx_users_username ON users(username);
|
|
CREATE INDEX idx_users_email ON users(email);
|
|
CREATE INDEX idx_channels_user_id ON channels(user_id);
|
|
CREATE INDEX idx_channels_slug ON channels(slug);
|
|
CREATE INDEX idx_streams_channel_id ON streams(channel_id);
|
|
CREATE INDEX idx_streams_status ON streams(status);
|
|
CREATE INDEX idx_streams_is_live ON streams(is_live);
|
|
CREATE INDEX idx_chat_messages_stream_id ON chat_messages(stream_id, created_at DESC);
|
|
CREATE INDEX idx_followers_channel_id ON followers(channel_id);
|
|
CREATE INDEX idx_followers_follower_id ON followers(follower_id);
|
|
CREATE INDEX idx_subscriptions_channel_id ON subscriptions(channel_id);
|
|
CREATE INDEX idx_subscriptions_status ON subscriptions(status);
|
|
CREATE INDEX idx_donations_channel_id ON donations(channel_id);
|
|
CREATE INDEX idx_vods_stream_id ON vods(stream_id);
|
|
CREATE INDEX idx_clips_channel_id ON clips(channel_id);
|
|
```
|