88 lines
2.3 KiB
SQL
88 lines
2.3 KiB
SQL
-- TeacherSchoolSchedule table to model when teachers work at specific schools
|
|
CREATE TABLE "TeacherSchoolSchedule" (
|
|
"id" SERIAL PRIMARY KEY,
|
|
"teacherId" TEXT NOT NULL REFERENCES "Teacher"("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
"schoolId" TEXT NOT NULL REFERENCES "School"("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
"startDate" TIMESTAMP(3) NOT NULL,
|
|
"endDate" TIMESTAMP(3) NOT NULL,
|
|
-- 1=Monday ... 7=Sunday, aligned with TimetableEntry.dayOfWeek
|
|
"daysOfWeek" INTEGER[] NOT NULL
|
|
);
|
|
|
|
ALTER TABLE "TeacherSchoolSchedule" ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- RLS policies for School, TeacherSchool, and TeacherSchoolSchedule
|
|
|
|
-- Allow admins full control over School
|
|
CREATE POLICY "Admins have full access to School"
|
|
ON "School"
|
|
FOR ALL
|
|
USING (is_admin())
|
|
WITH CHECK (is_admin());
|
|
|
|
-- Teachers can read schools they are mapped to via TeacherSchool
|
|
CREATE POLICY "Teachers can view their schools"
|
|
ON "School"
|
|
FOR SELECT
|
|
TO authenticated
|
|
USING (
|
|
is_admin()
|
|
OR id IN (
|
|
SELECT "schoolId" FROM "TeacherSchool" WHERE "teacherId" = requesting_user_id()
|
|
)
|
|
);
|
|
|
|
-- Optionally allow any authenticated user to browse the school directory
|
|
CREATE POLICY "Anyone can view schools"
|
|
ON "School"
|
|
FOR SELECT
|
|
TO authenticated
|
|
USING (true);
|
|
|
|
-- Teachers can manage schools where they are the adminId (independent/agency owners)
|
|
CREATE POLICY "Teachers manage their own schools"
|
|
ON "School"
|
|
FOR ALL
|
|
TO authenticated
|
|
USING (
|
|
requesting_user_role() = 'teacher'
|
|
AND "adminId" = requesting_user_id()
|
|
)
|
|
WITH CHECK (
|
|
requesting_user_role() = 'teacher'
|
|
AND "adminId" = requesting_user_id()
|
|
);
|
|
|
|
-- TeacherSchool policies
|
|
CREATE POLICY "Admins have full access to TeacherSchool"
|
|
ON "TeacherSchool"
|
|
FOR ALL
|
|
USING (is_admin())
|
|
WITH CHECK (is_admin());
|
|
|
|
CREATE POLICY "Teachers can view their TeacherSchool mappings"
|
|
ON "TeacherSchool"
|
|
FOR SELECT
|
|
TO authenticated
|
|
USING (
|
|
requesting_user_role() = 'teacher'
|
|
AND "teacherId" = requesting_user_id()
|
|
);
|
|
|
|
-- TeacherSchoolSchedule policies
|
|
CREATE POLICY "Admins have full access to TeacherSchoolSchedule"
|
|
ON "TeacherSchoolSchedule"
|
|
FOR ALL
|
|
USING (is_admin())
|
|
WITH CHECK (is_admin());
|
|
|
|
CREATE POLICY "Teachers can view their schedules"
|
|
ON "TeacherSchoolSchedule"
|
|
FOR SELECT
|
|
TO authenticated
|
|
USING (
|
|
requesting_user_role() = 'teacher'
|
|
AND "teacherId" = requesting_user_id()
|
|
);
|
|
|