forked from FujiwaraChoki/supoclip
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.sql
More file actions
217 lines (194 loc) · 8.76 KB
/
init.sql
File metadata and controls
217 lines (194 loc) · 8.76 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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
-- Database initialization script for SupoClip
-- Create database schema with required tables
-- Enable UUID extension for generating UUIDs
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Users table (compatible with Prisma schema)
CREATE TABLE users (
id VARCHAR(36) PRIMARY KEY DEFAULT uuid_generate_v4()::text,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
"emailVerified" BOOLEAN NOT NULL DEFAULT false,
image VARCHAR(500),
"createdAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
first_name VARCHAR(100),
last_name VARCHAR(100),
password_hash VARCHAR(255),
-- Default font preferences
default_font_family VARCHAR(100) DEFAULT 'TikTokSans-Regular',
default_font_size INTEGER DEFAULT 24,
default_font_color VARCHAR(7) DEFAULT '#FFFFFF',
notify_on_completion BOOLEAN NOT NULL DEFAULT true,
-- Monetization and billing fields
is_admin BOOLEAN NOT NULL DEFAULT false,
plan VARCHAR(20) NOT NULL DEFAULT 'free',
subscription_status VARCHAR(20) NOT NULL DEFAULT 'inactive',
stripe_customer_id VARCHAR(255) UNIQUE,
stripe_subscription_id VARCHAR(255) UNIQUE,
billing_period_start TIMESTAMP WITH TIME ZONE,
billing_period_end TIMESTAMP WITH TIME ZONE,
trial_ends_at TIMESTAMP WITH TIME ZONE
);
-- Source table (created before tasks since tasks reference sources)
CREATE TABLE sources (
id VARCHAR(36) PRIMARY KEY DEFAULT uuid_generate_v4()::text,
type VARCHAR(20) CHECK (type IN ('youtube', 'video_url')) NOT NULL,
title VARCHAR(500) NOT NULL,
url VARCHAR(1000),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Tasks table
CREATE TABLE tasks (
id VARCHAR(36) PRIMARY KEY DEFAULT uuid_generate_v4()::text,
user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
source_id VARCHAR(36) REFERENCES sources(id) ON DELETE SET NULL,
generated_clips_ids VARCHAR(36)[], -- Array of clip IDs
status VARCHAR(20) NOT NULL DEFAULT 'pending',
-- Progress tracking fields
progress INTEGER DEFAULT 0 CHECK (progress >= 0 AND progress <= 100),
progress_message TEXT,
-- Font customization fields
font_family VARCHAR(100) DEFAULT 'TikTokSans-Regular',
font_size INTEGER DEFAULT 24,
font_color VARCHAR(7) DEFAULT '#FFFFFF', -- Hex color code
-- Caption template and B-roll options
caption_template VARCHAR(50) DEFAULT 'default',
include_broll BOOLEAN DEFAULT false,
processing_mode VARCHAR(20) NOT NULL DEFAULT 'fast',
started_at TIMESTAMP WITH TIME ZONE,
completed_at TIMESTAMP WITH TIME ZONE,
cache_hit BOOLEAN NOT NULL DEFAULT false,
error_code VARCHAR(80),
stage_timings_json TEXT,
completion_notification_sent_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Generated clips table
CREATE TABLE generated_clips (
id VARCHAR(36) PRIMARY KEY DEFAULT uuid_generate_v4()::text,
task_id VARCHAR(36) NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
filename VARCHAR(255) NOT NULL,
file_path VARCHAR(500) NOT NULL,
start_time VARCHAR(20) NOT NULL, -- MM:SS format
end_time VARCHAR(20) NOT NULL, -- MM:SS format
duration FLOAT NOT NULL, -- Duration in seconds
text TEXT, -- Transcript text for this clip
relevance_score FLOAT NOT NULL,
reasoning TEXT, -- AI reasoning for selection
clip_order INTEGER NOT NULL, -- Order within the task
-- Virality score breakdown
virality_score INTEGER DEFAULT 0,
hook_score INTEGER DEFAULT 0,
engagement_score INTEGER DEFAULT 0,
value_score INTEGER DEFAULT 0,
shareability_score INTEGER DEFAULT 0,
hook_type VARCHAR(50),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE processing_cache (
cache_key VARCHAR(255) PRIMARY KEY,
source_url TEXT NOT NULL,
source_type VARCHAR(20) NOT NULL,
video_path TEXT,
transcript_text TEXT,
analysis_json TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Better Auth tables
CREATE TABLE session (
id VARCHAR(36) PRIMARY KEY,
"expiresAt" TIMESTAMP WITH TIME ZONE NOT NULL,
token VARCHAR(255) UNIQUE NOT NULL,
"createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"ipAddress" VARCHAR(255),
"userAgent" TEXT,
"userId" VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE account (
id VARCHAR(36) PRIMARY KEY,
"accountId" VARCHAR(255) NOT NULL,
"providerId" VARCHAR(255) NOT NULL,
"userId" VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
"accessToken" TEXT,
"refreshToken" TEXT,
"idToken" TEXT,
"accessTokenExpiresAt" TIMESTAMP WITH TIME ZONE,
"refreshTokenExpiresAt" TIMESTAMP WITH TIME ZONE,
scope TEXT,
password TEXT,
"createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL
);
CREATE TABLE verification (
id VARCHAR(36) PRIMARY KEY,
identifier VARCHAR(255) NOT NULL,
value VARCHAR(255) NOT NULL,
"expiresAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"createdAt" TIMESTAMP WITH TIME ZONE,
"updatedAt" TIMESTAMP WITH TIME ZONE
);
-- Stripe webhook idempotency table
CREATE TABLE stripe_webhook_events (
id VARCHAR(255) PRIMARY KEY,
type VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE app_settings (
setting_key VARCHAR(100) PRIMARY KEY,
encrypted_value TEXT NOT NULL,
prefer_admin_value BOOLEAN NOT NULL DEFAULT false,
updated_by VARCHAR(36) REFERENCES users(id) ON DELETE SET NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create indexes for better performance
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_tasks_user_id ON tasks(user_id);
CREATE INDEX idx_tasks_source_id ON tasks(source_id);
CREATE INDEX idx_tasks_status ON tasks(status);
CREATE INDEX idx_tasks_created_at ON tasks(created_at);
CREATE INDEX idx_tasks_processing_mode ON tasks(processing_mode);
CREATE INDEX idx_tasks_completed_at ON tasks(completed_at);
CREATE INDEX idx_sources_created_at ON sources(created_at);
CREATE INDEX idx_processing_cache_source_url ON processing_cache(source_url);
CREATE INDEX idx_generated_clips_task_id ON generated_clips(task_id);
CREATE INDEX idx_generated_clips_clip_order ON generated_clips(clip_order);
CREATE INDEX idx_generated_clips_created_at ON generated_clips(created_at);
CREATE INDEX idx_session_token ON session(token);
CREATE INDEX idx_session_userId ON session("userId");
CREATE INDEX idx_account_userId ON account("userId");
CREATE INDEX idx_verification_identifier ON verification(identifier);
CREATE INDEX idx_app_settings_updated_by ON app_settings(updated_by);
-- Create updated_at trigger function
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Create function for updatedAt column (Prisma format)
CREATE OR REPLACE FUNCTION update_updatedAt_column()
RETURNS TRIGGER AS $$
BEGIN
NEW."updatedAt" = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Create triggers for updated_at and updatedAt
-- Users table only has "updatedAt" (Better Auth convention)
CREATE TRIGGER update_users_updatedAt BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_updatedAt_column();
-- Tasks, sources, and generated_clips use snake_case updated_at
CREATE TRIGGER update_tasks_updated_at BEFORE UPDATE ON tasks FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_sources_updated_at BEFORE UPDATE ON sources FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_generated_clips_updated_at BEFORE UPDATE ON generated_clips FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_app_settings_updated_at BEFORE UPDATE ON app_settings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- Better Auth tables use camelCase "updatedAt"
CREATE TRIGGER update_session_updatedAt BEFORE UPDATE ON session FOR EACH ROW EXECUTE FUNCTION update_updatedAt_column();
CREATE TRIGGER update_account_updatedAt BEFORE UPDATE ON account FOR EACH ROW EXECUTE FUNCTION update_updatedAt_column();
CREATE TRIGGER update_verification_updatedAt BEFORE UPDATE ON verification FOR EACH ROW EXECUTE FUNCTION update_updatedAt_column();