-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdatabase_schema_complete.sql
More file actions
169 lines (147 loc) · 6.38 KB
/
database_schema_complete.sql
File metadata and controls
169 lines (147 loc) · 6.38 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
-- SkillForge Complete Database Schema
-- Run this in your Supabase SQL Editor to fix all 404/406 errors
-- Enable Row Level Security
ALTER DATABASE postgres SET "app.jwt_secret" TO 'your-jwt-secret';
-- Create users table (if not exists)
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
full_name TEXT,
avatar TEXT,
total_entries INTEGER DEFAULT 0,
total_badges INTEGER DEFAULT 0,
learning_streak INTEGER DEFAULT 0,
last_entry_date DATE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create entries table (if not exists)
CREATE TABLE IF NOT EXISTS entries (
id TEXT PRIMARY KEY,
userid TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
title TEXT NOT NULL,
description TEXT,
category TEXT DEFAULT 'tutorial',
date DATE NOT NULL,
tx_hash TEXT,
blockchain TEXT DEFAULT 'demo',
createdat TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create forum_posts table (MISSING - causing 404 errors)
CREATE TABLE IF NOT EXISTS forum_posts (
id SERIAL PRIMARY KEY,
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
title TEXT NOT NULL,
content TEXT NOT NULL,
category_id INTEGER DEFAULT 1,
likes INTEGER DEFAULT 0,
replies INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Create course_enrollments table (MISSING - causing 404 errors)
CREATE TABLE IF NOT EXISTS course_enrollments (
id SERIAL PRIMARY KEY,
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
course_id TEXT NOT NULL,
course_title TEXT NOT NULL,
progress INTEGER DEFAULT 0,
completed BOOLEAN DEFAULT FALSE,
enrolled_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
completed_at TIMESTAMP WITH TIME ZONE
);
-- Create badges table
CREATE TABLE IF NOT EXISTS badges (
id SERIAL PRIMARY KEY,
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
badge_name TEXT NOT NULL,
badge_description TEXT,
milestone INTEGER NOT NULL,
unlocked_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
tx_hash TEXT,
rarity TEXT DEFAULT 'common'
);
-- Create forum_categories table
CREATE TABLE IF NOT EXISTS forum_categories (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Insert default forum categories
INSERT INTO forum_categories (id, name, description) VALUES
(1, 'General Discussion', 'General learning discussions'),
(2, 'Technical Help', 'Get help with technical issues'),
(3, 'Project Showcase', 'Share your learning projects'),
(4, 'Career Advice', 'Career and professional development')
ON CONFLICT (id) DO NOTHING;
-- Create indexes for better performance
CREATE INDEX IF NOT EXISTS idx_entries_userid ON entries(userid);
CREATE INDEX IF NOT EXISTS idx_entries_date ON entries(date DESC);
CREATE INDEX IF NOT EXISTS idx_forum_posts_user_id ON forum_posts(user_id);
CREATE INDEX IF NOT EXISTS idx_forum_posts_category ON forum_posts(category_id);
CREATE INDEX IF NOT EXISTS idx_course_enrollments_user_id ON course_enrollments(user_id);
CREATE INDEX IF NOT EXISTS idx_badges_user_id ON badges(user_id);
-- Enable Row Level Security (RLS)
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE entries ENABLE ROW LEVEL SECURITY;
ALTER TABLE forum_posts ENABLE ROW LEVEL SECURITY;
ALTER TABLE course_enrollments ENABLE ROW LEVEL SECURITY;
ALTER TABLE badges ENABLE ROW LEVEL SECURITY;
-- Create RLS policies for public access (suitable for hackathon demo)
-- Users can read all users but only update their own
CREATE POLICY "Users can view all profiles" ON users FOR SELECT USING (true);
CREATE POLICY "Users can update own profile" ON users FOR UPDATE USING (true);
CREATE POLICY "Users can insert their own profile" ON users FOR INSERT WITH CHECK (true);
-- Entries are publicly readable, users can manage their own
CREATE POLICY "Entries are publicly readable" ON entries FOR SELECT USING (true);
CREATE POLICY "Users can insert own entries" ON entries FOR INSERT WITH CHECK (true);
CREATE POLICY "Users can update own entries" ON entries FOR UPDATE USING (true);
-- Forum posts are publicly readable
CREATE POLICY "Forum posts are publicly readable" ON forum_posts FOR SELECT USING (true);
CREATE POLICY "Users can create forum posts" ON forum_posts FOR INSERT WITH CHECK (true);
CREATE POLICY "Users can update own forum posts" ON forum_posts FOR UPDATE USING (true);
-- Course enrollments
CREATE POLICY "Users can view all enrollments" ON course_enrollments FOR SELECT USING (true);
CREATE POLICY "Users can create enrollments" ON course_enrollments FOR INSERT WITH CHECK (true);
CREATE POLICY "Users can update own enrollments" ON course_enrollments FOR UPDATE USING (true);
-- Badges are publicly readable
CREATE POLICY "Badges are publicly readable" ON badges FOR SELECT USING (true);
CREATE POLICY "Users can insert badges" ON badges FOR INSERT WITH CHECK (true);
-- Create 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';
-- Create triggers for updated_at
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_forum_posts_updated_at BEFORE UPDATE ON forum_posts
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- Grant necessary permissions
GRANT USAGE ON SCHEMA public TO anon, authenticated;
GRANT ALL ON ALL TABLES IN SCHEMA public TO anon, authenticated;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO anon, authenticated;
-- Insert demo data for testing (optional)
INSERT INTO users (id, username, email, password, full_name, total_entries, total_badges) VALUES
('demo_user_1', 'demo_learner', 'demo@skillforge.dev', 'demo123', 'Demo Learner', 5, 2)
ON CONFLICT (id) DO NOTHING;
INSERT INTO entries (id, userid, title, description, category, date) VALUES
('demo_entry_1', 'demo_user_1', 'First Learning Entry', 'Completed React basics tutorial', 'tutorial', CURRENT_DATE)
ON CONFLICT (id) DO NOTHING;
-- Verify tables exist
SELECT
schemaname,
tablename,
tableowner,
hasindexes,
hasrules,
hastriggers
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename;