mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-04-22 07:57:55 +00:00
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
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
-- 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()
|
||||
)
|
||||
);
|
||||
Reference in New Issue
Block a user