-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1-database-schema.sql
More file actions
315 lines (281 loc) · 10.1 KB
/
1-database-schema.sql
File metadata and controls
315 lines (281 loc) · 10.1 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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
-- LAW-AI Database Schema Setup
-- Copy and paste this in Supabase SQL Editor
-- Enable extensions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
-- Create enum types
DO $$ BEGIN
CREATE TYPE plan_type AS ENUM ('FREE', 'BASIC', 'PLUS', 'PRO');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE payment_status AS ENUM ('CREATED', 'PAID', 'FAILED');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
DO $$ BEGIN
CREATE TYPE feature_type AS ENUM (
'AI_ASSISTANT', 'DOC_GENERATOR', 'JUDGMENT_SUMMARIZER',
'CRM', 'ACTS', 'NEWS', 'CASE_TRACKER', 'NOTICES', 'DRAFTS', 'RESEARCH'
);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- Main users table
CREATE TABLE IF NOT EXISTS users_app (
user_id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
email TEXT UNIQUE NOT NULL,
full_name TEXT,
phone TEXT,
organization TEXT,
profile_pic TEXT,
plan plan_type DEFAULT 'FREE',
usage_count INTEGER DEFAULT 0,
expiry_date TIMESTAMPTZ,
theme_preference TEXT DEFAULT 'system',
settings JSONB,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Payments table
CREATE TABLE IF NOT EXISTS payments (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
plan plan_type NOT NULL,
amount INTEGER NOT NULL,
currency TEXT DEFAULT 'INR',
razorpay_order_id TEXT NOT NULL,
razorpay_payment_id TEXT,
razorpay_signature TEXT,
status payment_status DEFAULT 'CREATED',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Usage tracking
CREATE TABLE IF NOT EXISTS usage_events (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
feature feature_type NOT NULL,
count INTEGER DEFAULT 1,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(user_id, feature)
);
-- Research queries
CREATE TABLE IF NOT EXISTS research (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
query TEXT NOT NULL,
result TEXT NOT NULL,
type TEXT DEFAULT 'general',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Legal drafts
CREATE TABLE IF NOT EXISTS drafts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
type TEXT NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL,
inputs JSONB NOT NULL,
pdf_url TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Judgment summaries
CREATE TABLE IF NOT EXISTS summaries (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
title TEXT NOT NULL,
original_text TEXT NOT NULL,
summary TEXT NOT NULL,
file_url TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Case tracking
CREATE TABLE IF NOT EXISTS case_tracker (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
cnr TEXT UNIQUE NOT NULL,
party_name TEXT NOT NULL,
court TEXT NOT NULL,
status TEXT NOT NULL,
next_date TIMESTAMPTZ,
last_update TIMESTAMPTZ NOT NULL,
details JSONB,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Legal notices
CREATE TABLE IF NOT EXISTS notices (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
type TEXT NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL,
recipient TEXT NOT NULL,
status TEXT DEFAULT 'draft',
pdf_url TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- CRM data
CREATE TABLE IF NOT EXISTS crm (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
client_name TEXT NOT NULL,
client_email TEXT,
client_phone TEXT,
title TEXT NOT NULL,
description TEXT,
date TIMESTAMPTZ NOT NULL,
duration INTEGER DEFAULT 60,
status TEXT DEFAULT 'scheduled',
reminders JSONB,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Acts data
CREATE TABLE IF NOT EXISTS acts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
title TEXT NOT NULL,
year TEXT NOT NULL,
act_id TEXT NOT NULL,
content TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- News articles
CREATE TABLE IF NOT EXISTS news (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
title TEXT NOT NULL,
content TEXT NOT NULL,
summary TEXT,
source TEXT NOT NULL,
url TEXT NOT NULL,
published_at TIMESTAMPTZ NOT NULL,
category TEXT,
tags TEXT[],
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Chat sessions
CREATE TABLE IF NOT EXISTS chat_sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
title TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Chat messages
CREATE TABLE IF NOT EXISTS chat_messages (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
session_id UUID REFERENCES chat_sessions(id) ON DELETE CASCADE,
role TEXT NOT NULL,
content TEXT NOT NULL,
citations TEXT[],
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Uploaded files
CREATE TABLE IF NOT EXISTS uploaded_files (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
filename TEXT NOT NULL,
file_type TEXT NOT NULL,
file_size INTEGER NOT NULL,
content TEXT,
uploaded_at TIMESTAMPTZ DEFAULT NOW()
);
-- Audit logs
CREATE TABLE IF NOT EXISTS audit_logs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
action TEXT NOT NULL,
resource TEXT NOT NULL,
details TEXT,
ip_address TEXT,
user_agent TEXT,
timestamp TIMESTAMPTZ DEFAULT NOW()
);
-- Rate limiting
CREATE TABLE IF NOT EXISTS rate_limits (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
key TEXT UNIQUE NOT NULL,
count INTEGER DEFAULT 1,
reset_time TIMESTAMPTZ NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- AI prompts table
CREATE TABLE IF NOT EXISTS ai_prompts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT UNIQUE NOT NULL,
category TEXT NOT NULL,
prompt_text TEXT NOT NULL,
system_prompt TEXT,
temperature DECIMAL(3,2) DEFAULT 0.7,
max_tokens INTEGER DEFAULT 1000,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- AI interactions
CREATE TABLE IF NOT EXISTS ai_interactions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users_app(user_id) ON DELETE CASCADE,
prompt_category TEXT NOT NULL,
user_input TEXT NOT NULL,
ai_response TEXT NOT NULL,
tokens_used INTEGER,
response_time_ms INTEGER,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Create indexes
CREATE INDEX IF NOT EXISTS idx_users_app_email ON users_app(email);
CREATE INDEX IF NOT EXISTS idx_payments_user_created ON payments(user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_usage_events_user_created ON usage_events(user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_research_user_created ON research(user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_chat_sessions_user ON chat_sessions(user_id);
CREATE INDEX IF NOT EXISTS idx_chat_messages_session ON chat_messages(session_id);
CREATE INDEX IF NOT EXISTS idx_uploaded_files_user ON uploaded_files(user_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_user_timestamp ON audit_logs(user_id, timestamp);
CREATE INDEX IF NOT EXISTS idx_rate_limits_key_reset ON rate_limits(key, reset_time);
-- Updated at trigger function
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
-- Add triggers
DROP TRIGGER IF EXISTS update_users_app_updated_at ON users_app;
CREATE TRIGGER update_users_app_updated_at BEFORE UPDATE ON users_app FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_drafts_updated_at ON drafts;
CREATE TRIGGER update_drafts_updated_at BEFORE UPDATE ON drafts FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_case_tracker_updated_at ON case_tracker;
CREATE TRIGGER update_case_tracker_updated_at BEFORE UPDATE ON case_tracker FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_notices_updated_at ON notices;
CREATE TRIGGER update_notices_updated_at BEFORE UPDATE ON notices FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_crm_updated_at ON crm;
CREATE TRIGGER update_crm_updated_at BEFORE UPDATE ON crm FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_acts_updated_at ON acts;
CREATE TRIGGER update_acts_updated_at BEFORE UPDATE ON acts FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_chat_sessions_updated_at ON chat_sessions;
CREATE TRIGGER update_chat_sessions_updated_at BEFORE UPDATE ON chat_sessions FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- User signup trigger
CREATE OR REPLACE FUNCTION handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO users_app (user_id, email, full_name)
VALUES (NEW.id, NEW.email, NEW.raw_user_meta_data->>'full_name');
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW EXECUTE FUNCTION handle_new_user();
-- Storage bucket
INSERT INTO storage.buckets (id, name, public)
VALUES ('law-ai-files', 'law-ai-files', true)
ON CONFLICT (id) DO NOTHING;