feat: teacher en student frontend controllers
This commit is contained in:
parent
bfb9598fa1
commit
52364d717c
6 changed files with 172 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
||||||
import { Response, Router } from 'express';
|
import { Response, Router } from 'express';
|
||||||
import studentRouter from './students.js';
|
import studentRouter from './students.js';
|
||||||
|
import teacherRouter from './teachers.js';
|
||||||
import groupRouter from './groups.js';
|
import groupRouter from './groups.js';
|
||||||
import assignmentRouter from './assignments.js';
|
import assignmentRouter from './assignments.js';
|
||||||
import submissionRouter from './submissions.js';
|
import submissionRouter from './submissions.js';
|
||||||
|
@ -22,6 +23,7 @@ router.get('/', (_, res: Response) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
router.use('/student', studentRouter /* #swagger.tags = ['Student'] */);
|
router.use('/student', studentRouter /* #swagger.tags = ['Student'] */);
|
||||||
|
router.use('/teacher', teacherRouter /* #swagger.tags = ['Teacher'] */);
|
||||||
router.use('/group', groupRouter /* #swagger.tags = ['Group'] */);
|
router.use('/group', groupRouter /* #swagger.tags = ['Group'] */);
|
||||||
router.use('/assignment', assignmentRouter /* #swagger.tags = ['Assignment'] */);
|
router.use('/assignment', assignmentRouter /* #swagger.tags = ['Assignment'] */);
|
||||||
router.use('/submission', submissionRouter /* #swagger.tags = ['Submission'] */);
|
router.use('/submission', submissionRouter /* #swagger.tags = ['Submission'] */);
|
||||||
|
|
1
frontend/config.ts
Normal file
1
frontend/config.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export const API_BASE = "http://localhost:3000/api";
|
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`);}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue