-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.sql
More file actions
106 lines (98 loc) · 4.62 KB
/
schema.sql
File metadata and controls
106 lines (98 loc) · 4.62 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
-- Grounded Analysis Database Schema
-- This schema stores users, user queries, guardian responses, and analysis summaries
-- Table to store users
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY, -- UUID
email TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
password_hash TEXT NOT NULL, -- Hashed password
avatar_url TEXT,
plan TEXT DEFAULT 'free' CHECK (plan IN ('free', 'pro')), -- User plan
plan_expires_at DATETIME, -- For PRO plan expiration
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login DATETIME,
is_active BOOLEAN DEFAULT TRUE
);
-- Table to store user sessions
CREATE TABLE IF NOT EXISTS user_sessions (
id TEXT PRIMARY KEY, -- Session token
user_id TEXT NOT NULL,
expires_at DATETIME NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- Table to store analysis sessions
CREATE TABLE IF NOT EXISTS analyses (
id TEXT PRIMARY KEY, -- UUID
user_id TEXT, -- NULL for anonymous users
query TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
status TEXT DEFAULT 'completed' CHECK (status IN ('pending', 'processing', 'completed', 'failed')),
user_ip TEXT,
user_agent TEXT,
is_public BOOLEAN DEFAULT FALSE, -- Whether analysis can be shared publicly
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
);
-- Table to store individual guardian responses
CREATE TABLE IF NOT EXISTS guardian_responses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
analysis_id TEXT NOT NULL,
guardian_id TEXT NOT NULL,
guardian_name TEXT NOT NULL,
guardian_avatar TEXT NOT NULL,
guardian_personality TEXT NOT NULL,
guardian_perspective TEXT NOT NULL,
response TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (analysis_id) REFERENCES analyses(id) ON DELETE CASCADE
);
-- Table to store insight summaries
CREATE TABLE IF NOT EXISTS insight_summaries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
analysis_id TEXT NOT NULL UNIQUE,
main_themes TEXT NOT NULL, -- JSON array
consensus TEXT NOT NULL,
divergent_views TEXT, -- JSON array
action_items TEXT NOT NULL, -- JSON array
overall_sentiment TEXT NOT NULL CHECK (overall_sentiment IN ('positive', 'neutral', 'negative')),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (analysis_id) REFERENCES analyses(id) ON DELETE CASCADE
);
-- Table to store analytics and usage stats
CREATE TABLE IF NOT EXISTS analytics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_type TEXT NOT NULL, -- 'query_submitted', 'analysis_viewed', 'analysis_shared'
analysis_id TEXT,
metadata TEXT, -- JSON for additional data
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (analysis_id) REFERENCES analyses(id) ON DELETE SET NULL
);
-- Table to track daily usage for rate limiting
CREATE TABLE IF NOT EXISTS user_daily_usage (
id TEXT PRIMARY KEY, -- UUID
user_id TEXT NOT NULL,
usage_date DATE NOT NULL, -- Date in YYYY-MM-DD format
query_count INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE(user_id, usage_date) -- One record per user per day
);
-- Indexes for better performance
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
CREATE INDEX IF NOT EXISTS idx_users_created_at ON users(created_at);
CREATE INDEX IF NOT EXISTS idx_users_plan ON users(plan);
CREATE INDEX IF NOT EXISTS idx_user_sessions_user_id ON user_sessions(user_id);
CREATE INDEX IF NOT EXISTS idx_user_sessions_expires_at ON user_sessions(expires_at);
CREATE INDEX IF NOT EXISTS idx_analyses_user_id ON analyses(user_id);
CREATE INDEX IF NOT EXISTS idx_analyses_created_at ON analyses(created_at);
CREATE INDEX IF NOT EXISTS idx_analyses_status ON analyses(status);
CREATE INDEX IF NOT EXISTS idx_guardian_responses_analysis_id ON guardian_responses(analysis_id);
CREATE INDEX IF NOT EXISTS idx_guardian_responses_guardian_id ON guardian_responses(guardian_id);
CREATE INDEX IF NOT EXISTS idx_insight_summaries_analysis_id ON insight_summaries(analysis_id);
CREATE INDEX IF NOT EXISTS idx_analytics_event_type ON analytics(event_type);
CREATE INDEX IF NOT EXISTS idx_analytics_created_at ON analytics(created_at);
CREATE INDEX IF NOT EXISTS idx_user_daily_usage_user_date ON user_daily_usage(user_id, usage_date);
CREATE INDEX IF NOT EXISTS idx_user_daily_usage_date ON user_daily_usage(usage_date);