Spaces:
Running
Running
File size: 3,985 Bytes
e64b891 | 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 | -- Phase 1: Database Schema for New Certification Flow
-- This creates tables to track structured certification sessions and their steps
-- Table 1: certification_sessions
-- Tracks each unique certification attempt with status progression
CREATE TABLE IF NOT EXISTS certification_sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
course_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'in_progress'
CHECK (status IN ('in_progress', 'assessment_completed', 'project_submitted', 'certified')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Table 2: session_steps
-- Logs every action within a session for chat history reconstruction
CREATE TABLE IF NOT EXISTS session_steps (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
session_id UUID NOT NULL REFERENCES certification_sessions(id) ON DELETE CASCADE,
step_type TEXT NOT NULL
CHECK (step_type IN ('course_selected', 'learning_started', 'assessment_submitted', 'results_viewed', 'project_generated')),
step_data JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Row Level Security (RLS) Policies
-- Enable RLS on both tables
ALTER TABLE certification_sessions ENABLE ROW LEVEL SECURITY;
ALTER TABLE session_steps ENABLE ROW LEVEL SECURITY;
-- RLS Policy for certification_sessions: Users can only access their own sessions
CREATE POLICY "Users can only access their own certification sessions" ON certification_sessions
FOR ALL USING (auth.uid() = user_id);
-- RLS Policy for session_steps: Users can only access steps from their own sessions
CREATE POLICY "Users can only access their own session steps" ON session_steps
FOR ALL USING (
EXISTS (
SELECT 1 FROM certification_sessions
WHERE certification_sessions.id = session_steps.session_id
AND certification_sessions.user_id = auth.uid()
)
);
-- Indexes for performance
CREATE INDEX IF NOT EXISTS idx_certification_sessions_user_id ON certification_sessions(user_id);
CREATE INDEX IF NOT EXISTS idx_certification_sessions_status ON certification_sessions(status);
CREATE INDEX IF NOT EXISTS idx_session_steps_session_id ON session_steps(session_id);
CREATE INDEX IF NOT EXISTS idx_session_steps_step_type ON session_steps(step_type);
CREATE INDEX IF NOT EXISTS idx_session_steps_created_at ON session_steps(created_at);
-- Update trigger for certification_sessions.updated_at
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
CREATE TRIGGER update_certification_sessions_updated_at
BEFORE UPDATE ON certification_sessions
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- Sample step_data structures (for documentation):
/*
For 'course_selected':
{
"course_name": "JavaScript Fundamentals",
"difficulty": "Beginner",
"estimated_duration": "2-3 hours"
}
For 'learning_started':
{
"modules": [
{
"title": "Introduction to JavaScript",
"youtube_url": "https://youtube.com/watch?v=...",
"duration": "15 mins"
}
]
}
For 'assessment_submitted':
{
"score": 85,
"max_score": 100,
"assigned_difficulty": "Intermediate",
"submission_text": "User's assessment response...",
"evaluation_feedback": "AI feedback on submission..."
}
For 'results_viewed':
{
"score": 85,
"grade": "B+",
"passed": true,
"recommended_difficulty": "Intermediate",
"available_difficulties": ["Beginner", "Intermediate", "Advanced"]
}
For 'project_generated':
{
"project_title": "Build a To-Do List Application",
"project_description": "Create a full-featured to-do list...",
"difficulty": "Intermediate",
"submission_form_link": "https://forms.google.com/...",
"requirements": ["Feature 1", "Feature 2"]
}
*/
|