Files
pwap/web/supabase/migrations/006_create_perwerde_tables.sql
T
pezkuwichain a635610b7c feat: Phase 1B complete - Perwerde & ValidatorPool UI
Perwerde (Education Platform):
- Add hybrid backend (Supabase + Blockchain + IPFS)
- Implement CourseList, CourseCreator, StudentDashboard
- Create courses table with RLS policies
- Add IPFS upload utility
- Integrate with pallet-perwerde extrinsics

ValidatorPool:
- Add validator pool management UI
- Implement PoolCategorySelector with 3 categories
- Add ValidatorPoolDashboard with pool stats
- Integrate with pallet-validator-pool extrinsics
- Add to StakingDashboard as new tab

Technical:
- Fix all toast imports (sonner)
- Fix IPFS File upload (Blob conversion)
- Fix RLS policies (wallet_address → auth.uid)
- Add error boundaries
- Add loading states

Status: UI complete, blockchain integration pending VPS deployment
2025-11-17 05:04:51 +03:00

86 lines
2.6 KiB
SQL

-- Perwerde (Education) Tables
-- Courses Table (ID comes from blockchain)
CREATE TABLE IF NOT EXISTS public.courses (
id BIGINT PRIMARY KEY, -- Blockchain course_id
owner TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
content_link TEXT, -- IPFS hash
status TEXT NOT NULL DEFAULT 'Active',
created_at TIMESTAMP WITH TIME ZONE NOT NULL
);
-- Enrollments Table
CREATE TABLE IF NOT EXISTS public.enrollments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
student_address TEXT NOT NULL,
course_id BIGINT REFERENCES public.courses(id) ON DELETE CASCADE,
enrolled_at TIMESTAMP WITH TIME ZONE NOT NULL,
completed_at TIMESTAMP WITH TIME ZONE,
points_earned INTEGER DEFAULT 0,
is_completed BOOLEAN DEFAULT false,
UNIQUE(student_address, course_id)
);
-- Indexes
CREATE INDEX IF NOT EXISTS idx_courses_status ON public.courses(status);
CREATE INDEX IF NOT EXISTS idx_enrollments_student ON public.enrollments(student_address);
CREATE INDEX IF NOT EXISTS idx_enrollments_course ON public.enrollments(course_id);
-- RLS Policies
-- Courses
ALTER TABLE public.courses ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS "Anyone can view courses" ON public.courses;
CREATE POLICY "Anyone can view courses"
ON public.courses FOR SELECT
USING (true);
DROP POLICY IF EXISTS "Admins can manage courses" ON public.courses;
CREATE POLICY "Admins can manage courses"
ON public.courses FOR ALL
USING (
EXISTS (
SELECT 1 FROM public.admin_roles
WHERE user_id = auth.uid()
)
);
-- Enrollments
ALTER TABLE public.enrollments ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS "Users can view their own enrollments" ON public.enrollments;
CREATE POLICY "Users can view their own enrollments"
ON public.enrollments FOR SELECT
USING (
EXISTS (
SELECT 1 FROM public.wallets
WHERE user_id = auth.uid() AND address = student_address
)
);
DROP POLICY IF EXISTS "Users can create their own enrollments" ON public.enrollments;
CREATE POLICY "Users can create their own enrollments"
ON public.enrollments FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM public.wallets
WHERE user_id = auth.uid() AND address = student_address
)
);
DROP POLICY IF EXISTS "Admins or course owners can update enrollments" ON public.enrollments;
CREATE POLICY "Admins or course owners can update enrollments"
ON public.enrollments FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM public.admin_roles
WHERE user_id = auth.uid()
) OR
EXISTS (
SELECT 1 FROM public.courses c
JOIN public.wallets w ON c.owner = w.address
WHERE c.id = course_id AND w.user_id = auth.uid()
)
);