From 5d1a5b4ecced2d6b97ffddafb47a0af5f362c48b Mon Sep 17 00:00:00 2001
From: Brieuc Dubois <git@bhasher.com>
Date: Thu, 19 Jun 2025 09:35:46 +0200
Subject: [PATCH] Fix #183

---
 backend/app/crud/__init__.py                      | 9 +++++++++
 backend/app/main.py                               | 8 ++++++++
 frontend/src/lib/api/users.ts                     | 7 +++++++
 frontend/src/routes/+layout.server.ts             | 9 +--------
 frontend/src/routes/register/[[studyId]]/+page.ts | 8 +++++---
 5 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/backend/app/crud/__init__.py b/backend/app/crud/__init__.py
index b8a8c2a8..3f0308ff 100644
--- a/backend/app/crud/__init__.py
+++ b/backend/app/crud/__init__.py
@@ -35,6 +35,15 @@ def get_users(db: Session, skip: int = 0):
     return db.query(models.User).offset(skip).all()
 
 
+def get_tutors_by_study(db: Session, study_id: int):
+    return (
+        db.query(models.User)
+        .filter(models.User.type == models.UserType.TUTOR.value)
+        .filter(models.User.studies.any(models.Study.id == study_id))
+        .all()
+    )
+
+
 def create_user(db: Session, user: schemas.UserCreate) -> models.User:
     password = Hasher.get_password_hash(user.password)
     nickname = user.nickname if user.nickname else user.email.split("@")[0]
diff --git a/backend/app/main.py b/backend/app/main.py
index fec8ab0a..0480a4c4 100644
--- a/backend/app/main.py
+++ b/backend/app/main.py
@@ -189,6 +189,14 @@ def read_users(
     return crud.get_users(db, skip=skip)
 
 
+@usersRouter.get("/tutors/study/{study_id}", response_model=list[schemas.User])
+def get_tutors_by_study(
+    study_id: int,
+    db: Session = Depends(get_db),
+):
+    return crud.get_tutors_by_study(db, study_id)
+
+
 @usersRouter.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
 def delete_user(
     user_id: int,
diff --git a/frontend/src/lib/api/users.ts b/frontend/src/lib/api/users.ts
index 8e64df18..4778fbe9 100644
--- a/frontend/src/lib/api/users.ts
+++ b/frontend/src/lib/api/users.ts
@@ -7,6 +7,13 @@ export async function getUsersAPI(fetch: fetchType): Promise<any[]> {
 	return await response.json();
 }
 
+export async function getTutorsByStudyAPI(fetch: fetchType, study_id: number): Promise<any[]> {
+	const response = await fetch(`/api/users/tutors/study/${study_id}`);
+	if (!response.ok) return [];
+
+	return await response.json();
+}
+
 export async function getUserAPI(fetch: fetchType, user_id: number): Promise<any | null> {
 	const response = await fetch(`/api/users/${user_id}`);
 	if (!response.ok) return null;
diff --git a/frontend/src/routes/+layout.server.ts b/frontend/src/routes/+layout.server.ts
index a1671e66..fd3dfa06 100644
--- a/frontend/src/routes/+layout.server.ts
+++ b/frontend/src/routes/+layout.server.ts
@@ -1,13 +1,6 @@
 import { type ServerLoad, redirect } from '@sveltejs/kit';
 
-const publicly_allowed = [
-	'/login',
-	'/register',
-	'/tests',
-	'/surveys',
-	'/tutor/register',
-	'/studies'
-];
+const publicly_allowed = ['/login', '/register', '/studies'];
 
 const isPublic = (path: string) => {
 	for (const allowed of publicly_allowed) {
diff --git a/frontend/src/routes/register/[[studyId]]/+page.ts b/frontend/src/routes/register/[[studyId]]/+page.ts
index b8209365..73f9d298 100644
--- a/frontend/src/routes/register/[[studyId]]/+page.ts
+++ b/frontend/src/routes/register/[[studyId]]/+page.ts
@@ -1,5 +1,5 @@
 import { getStudiesAPI, getStudyAPI } from '$lib/api/studies';
-import { getUsersAPI } from '$lib/api/users';
+import { getUsersAPI, getTutorsByStudyAPI } from '$lib/api/users';
 import Study from '$lib/types/study';
 import type { Load } from '@sveltejs/kit';
 
@@ -23,8 +23,10 @@ export const load: Load = async ({ parent, fetch, params, url }) => {
 
 	const studies = Study.parseAll(await getStudiesAPI(fetch));
 
-	const users = await getUsersAPI(fetch);
-	const tutors = users.filter((user) => user.type === 1);
+	let tutors: any[] = [];
+	if (study && study.id) {
+		tutors = await getTutorsByStudyAPI(fetch, study.id);
+	}
 
 	let role = 'learner';
 	if (url.searchParams.has('role')) {
-- 
GitLab