feat: teacher en student frontend controllers
This commit is contained in:
		
							parent
							
								
									bfb9598fa1
								
							
						
					
					
						commit
						52364d717c
					
				
					 6 changed files with 172 additions and 0 deletions
				
			
		
							
								
								
									
										72
									
								
								frontend/src/controllers/base-controller.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								frontend/src/controllers/base-controller.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,72 @@ | |||
| import {API_BASE} from "../../config.ts"; | ||||
| 
 | ||||
| export class BaseController { | ||||
|     protected baseUrl: string; | ||||
| 
 | ||||
|     constructor(basePath: string) { | ||||
|         this.baseUrl = `${API_BASE}/${basePath}`; | ||||
|     } | ||||
| 
 | ||||
|     protected async get<T>(path: string, queryParams?: Record<string, any>): Promise<T> { | ||||
|         let url = `${this.baseUrl}${path}`; | ||||
|         if (queryParams) { | ||||
|             const query = new URLSearchParams(); | ||||
|             Object.entries(queryParams).forEach(([key, value]) => { | ||||
|                 if (value !== undefined && value !== null) query.append(key, value.toString()); | ||||
|             }); | ||||
|             url += `?${query.toString()}`; | ||||
|         } | ||||
| 
 | ||||
|         const res = await fetch(url); | ||||
|         if (!res.ok) { | ||||
|             const errorData = await res.json().catch(() => ({})); | ||||
|             throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`); | ||||
|         } | ||||
| 
 | ||||
|         return res.json(); | ||||
|     } | ||||
| 
 | ||||
|     protected async post<T>(path: string, body: unknown): Promise<T> { | ||||
|         const res = await fetch(`${this.baseUrl}${path}`, { | ||||
|             method: "POST", | ||||
|             headers: { "Content-Type": "application/json" }, | ||||
|             body: JSON.stringify(body), | ||||
|         }); | ||||
| 
 | ||||
|         if (!res.ok) { | ||||
|             const errorData = await res.json().catch(() => ({})); | ||||
|             throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`); | ||||
|         } | ||||
| 
 | ||||
|         return res.json(); | ||||
|     } | ||||
| 
 | ||||
|     protected async delete<T>(path: string): Promise<T> { | ||||
|         const res = await fetch(`${this.baseUrl}${path}`, { | ||||
|             method: "DELETE", | ||||
|         }); | ||||
| 
 | ||||
|         if (!res.ok) { | ||||
|             const errorData = await res.json().catch(() => ({})); | ||||
|             throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`); | ||||
|         } | ||||
| 
 | ||||
|         return res.json(); | ||||
|     } | ||||
| 
 | ||||
|     protected async put<T>(path: string, body: unknown): Promise<T> { | ||||
|         const res = await fetch(`${this.baseUrl}${path}`, { | ||||
|             method: "PUT", | ||||
|             headers: { "Content-Type": "application/json" }, | ||||
|             body: JSON.stringify(body), | ||||
|         }); | ||||
| 
 | ||||
|         if (!res.ok) { | ||||
|             const errorData = await res.json().catch(() => ({})); | ||||
|             throw new Error(errorData?.error || `Error ${res.status}: ${res.statusText}`); | ||||
|         } | ||||
| 
 | ||||
|         return res.json(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										16
									
								
								frontend/src/controllers/controllers.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								frontend/src/controllers/controllers.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| import {StudentController} from "@/controllers/student-controller.ts"; | ||||
| import {TeacherController} from "@/controllers/teacher-controller.ts"; | ||||
| 
 | ||||
| export function controllerGetter<T>(Factory: new () => T): () => T { | ||||
|     let instance: T | undefined; | ||||
| 
 | ||||
|     return (): T => { | ||||
|         if (!instance) { | ||||
|             instance = new Factory(); | ||||
|         } | ||||
|         return instance; | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| export const getStudentController = controllerGetter(StudentController); | ||||
| export const getTeacherController = controllerGetter(TeacherController); | ||||
							
								
								
									
										44
									
								
								frontend/src/controllers/student-controller.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								frontend/src/controllers/student-controller.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | |||
| import {BaseController} from "@/controllers/base-controller.ts"; | ||||
| 
 | ||||
| export class StudentController extends BaseController { | ||||
|     constructor() { | ||||
|         super("students"); | ||||
|     } | ||||
| 
 | ||||
|     getAll(full = true) { | ||||
|         return this.get<{ students: any[] }>("/", { full }); | ||||
|     } | ||||
| 
 | ||||
|     getByUsername(username: string) { | ||||
|         return this.get<any>(`/${username}`); | ||||
|     } | ||||
| 
 | ||||
|     createStudent(data: any) { | ||||
|         return this.post<any>("/", data); | ||||
|     } | ||||
| 
 | ||||
|     deleteStudent(username: string) { | ||||
|         return this.delete<any>(`/${username}`); | ||||
|     } | ||||
| 
 | ||||
|     getClasses(username: string, full = true) { | ||||
|         return this.get<{ classes: any[] }>(`/${username}/classes`, { full }); | ||||
|     } | ||||
| 
 | ||||
|     getAssignments(username: string, full = true) { | ||||
|         return this.get<{ assignments: any[] }>(`/${username}/assignments`, { full }); | ||||
|     } | ||||
| 
 | ||||
|     getGroups(username: string, full = true) { | ||||
|         return this.get<{ groups: any[] }>(`/${username}/groups`, { full }); | ||||
|     } | ||||
| 
 | ||||
|     getSubmissions(username: string) { | ||||
|         return this.get<{ submissions: any[] }>(`/${username}/submissions`); | ||||
|     } | ||||
| 
 | ||||
|     getQuestions(username: string, full = true) { | ||||
|         return this.get<{ questions: any[] }>(`/${username}/questions`, { full }); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										37
									
								
								frontend/src/controllers/teacher-controller.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								frontend/src/controllers/teacher-controller.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| import {BaseController} from "@/controllers/base-controller.ts"; | ||||
| 
 | ||||
| export class TeacherController extends BaseController { | ||||
|     constructor() { | ||||
|         super("teachers"); | ||||
|     } | ||||
| 
 | ||||
|     getAll(full = false) { | ||||
|         return this.get<{ teachers: any[] }>("/", { full }); | ||||
|     } | ||||
| 
 | ||||
|     getByUsername(username: string) { | ||||
|         return this.get<any>(`/${username}`); | ||||
|     } | ||||
| 
 | ||||
|     createTeacher(data: any) { | ||||
|         return this.post<any>("/", data); | ||||
|     } | ||||
| 
 | ||||
|     deleteTeacher(username: string) { | ||||
|         return this.delete<any>(`/${username}`); | ||||
|     } | ||||
| 
 | ||||
|     getClasses(username: string, full = false) { | ||||
|         return this.get<any[]>(`/${username}/classes`, { full }); | ||||
|     } | ||||
| 
 | ||||
|     getStudents(username: string, full = false) { | ||||
|         return this.get<{ students: any[] }>(`/${username}/students`, { full }); | ||||
|     } | ||||
| 
 | ||||
|     getQuestions(username: string, full = false) { | ||||
|         return this.get<{ questions: any[] }>(`/${username}/questions`, { full }); | ||||
|     } | ||||
| 
 | ||||
|     // getInvitations(id: string) {return this.get<{ invitations: string[] }>(`/${id}/invitations`);}
 | ||||
| } | ||||
		Reference in a new issue
	
	 Gabriellvl
						Gabriellvl