2024-03-29 20:08:34 -04:00
|
|
|
import axios, { AxiosError, AxiosResponse } from 'axios';
|
|
|
|
|
|
2025-01-10 15:46:17 -05:00
|
|
|
import { FolderType } from 'src/Types/FolderType';
|
|
|
|
|
import { QuizType } from 'src/Types/QuizType';
|
2025-02-20 00:19:32 -05:00
|
|
|
import { RoomType } from 'src/Types/RoomType';
|
2025-02-07 19:36:11 -05:00
|
|
|
import { ENV_VARIABLES } from 'src/constants';
|
2024-03-29 20:08:34 -04:00
|
|
|
|
2025-01-11 02:22:14 -05:00
|
|
|
type ApiResponse = boolean | string;
|
|
|
|
|
|
2024-03-29 20:08:34 -04:00
|
|
|
class ApiService {
|
|
|
|
|
private BASE_URL: string;
|
|
|
|
|
private TTL: number;
|
|
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
this.BASE_URL = ENV_VARIABLES.VITE_BACKEND_URL;
|
|
|
|
|
this.TTL = 3600000; // 1h
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private constructRequestUrl(endpoint: string): string {
|
|
|
|
|
return `${this.BASE_URL}/api${endpoint}`;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-11 02:22:14 -05:00
|
|
|
private constructRequestHeaders() {
|
2024-09-15 21:56:48 -04:00
|
|
|
if (this.isLoggedIn()) {
|
2024-03-29 20:08:34 -04:00
|
|
|
return {
|
|
|
|
|
Authorization: `Bearer ${this.getToken()}`,
|
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return {
|
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Helpers
|
2025-02-07 19:36:11 -05:00
|
|
|
private saveToken(token: string): void {
|
2024-03-29 20:08:34 -04:00
|
|
|
const now = new Date();
|
|
|
|
|
|
|
|
|
|
const object = {
|
|
|
|
|
token: token,
|
|
|
|
|
expiry: now.getTime() + this.TTL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
localStorage.setItem("jwt", JSON.stringify(object));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private getToken(): string | null {
|
|
|
|
|
const objectStr = localStorage.getItem("jwt");
|
|
|
|
|
|
|
|
|
|
if (!objectStr) {
|
|
|
|
|
return null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const object = JSON.parse(objectStr)
|
|
|
|
|
const now = new Date()
|
|
|
|
|
|
|
|
|
|
if (now.getTime() > object.expiry) {
|
|
|
|
|
// If the item is expired, delete the item from storage
|
|
|
|
|
// and return null
|
|
|
|
|
this.logout();
|
|
|
|
|
return null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return object.token;
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-15 21:56:48 -04:00
|
|
|
public isLoggedIn(): boolean {
|
2024-03-29 20:08:34 -04:00
|
|
|
const token = this.getToken()
|
|
|
|
|
|
|
|
|
|
if (token == null) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update token expiry
|
|
|
|
|
this.saveToken(token);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public logout(): void {
|
|
|
|
|
return localStorage.removeItem("jwt");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// User Routes
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-02-07 19:36:11 -05:00
|
|
|
public async register(email: string, password: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!email || !password) {
|
|
|
|
|
throw new Error(`L'email et le mot de passe sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
const url: string = this.constructRequestUrl(`/user/register`);
|
2024-03-29 20:08:34 -04:00
|
|
|
const headers = this.constructRequestHeaders();
|
2025-02-07 19:36:11 -05:00
|
|
|
const body = { email, password };
|
2024-03-29 20:08:34 -04:00
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'enregistrement a échoué. Status: ${result.status}`);
|
2024-03-29 20:08:34 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-02-07 19:36:11 -05:00
|
|
|
public async login(email: string, password: string): Promise<ApiResponse> {
|
|
|
|
|
try {
|
2024-03-29 20:08:34 -04:00
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
if (!email || !password) {
|
|
|
|
|
throw new Error(`L'email et le mot de passe sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/user/login`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { email, password };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La connexion a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
2024-03-29 20:08:34 -04:00
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
this.saveToken(result.data.token);
|
2024-03-29 20:08:34 -04:00
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
console.log("axios.isAxiosError(error): ", axios.isAxiosError(error));
|
2025-01-11 02:22:14 -05:00
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
if (err.status === 401) {
|
|
|
|
|
return 'Email ou mot de passe incorrect.';
|
|
|
|
|
}
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
2024-03-29 20:08:34 -04:00
|
|
|
}
|
|
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
return `Une erreur inattendue s'est produite.`
|
2024-03-29 20:08:34 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-01-11 02:22:14 -05:00
|
|
|
* @returns true if successful
|
2024-03-29 20:08:34 -04:00
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async resetPassword(email: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!email) {
|
|
|
|
|
throw new Error(`L'email est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
const url: string = this.constructRequestUrl(`/user/reset-password`);
|
2024-03-29 20:08:34 -04:00
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { email };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`Échec de la réinitialisation du mot de passe. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async changePassword(email: string, oldPassword: string, newPassword: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!email || !oldPassword || !newPassword) {
|
|
|
|
|
throw new Error(`L'email, l'ancien et le nouveau mot de passe sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-07 19:36:11 -05:00
|
|
|
const url: string = this.constructRequestUrl(`/user/change-password`);
|
2024-03-29 20:08:34 -04:00
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { email, oldPassword, newPassword };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`Le changement du mot de passe a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async deleteUser(email: string, password: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!email || !password) {
|
|
|
|
|
throw new Error(`L'email et le mot de passe sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/user/delete-user`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { email, password };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
2024-10-29 10:10:13 -04:00
|
|
|
throw new Error(`La suppression du compte a échoué. Status: ${result.status}`);
|
2024-03-29 20:08:34 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Folder Routes
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async createFolder(title: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!title) {
|
|
|
|
|
throw new Error(`Le titre est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/folder/create`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { title };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La création du dossier a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns folder array if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
|
|
|
|
public async getUserFolders(): Promise<FolderType[] | string> {
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
// No params
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/folder/getUserFolders`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.get(url, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'obtention des dossiers utilisateur a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.data.data.map((folder: FolderType) => ({ _id: folder._id, title: folder.title }));
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
2024-10-29 10:10:13 -04:00
|
|
|
const url = err.config?.url || 'URL inconnue';
|
|
|
|
|
return data?.error || `Erreur serveur inconnue lors de la requête (${url}).`;
|
2024-03-29 20:08:34 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns quiz array if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
|
|
|
|
public async getFolderContent(folderId: string): Promise<QuizType[] | string> {
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!folderId) {
|
|
|
|
|
throw new Error(`Le folderId est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/folder/getFolderContent/${folderId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.get(url, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'obtention des quiz du dossier a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.data.data.map((quiz: QuizType) => ({ _id: quiz._id, title: quiz.title, content: quiz.content }));
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-20 00:19:32 -05:00
|
|
|
//ROOM routes
|
|
|
|
|
|
|
|
|
|
public async getUserRooms(): Promise<RoomType[] | string> {
|
|
|
|
|
try {
|
|
|
|
|
const url: string = this.constructRequestUrl(`/room/getUserRooms`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.get(url, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'obtention des salles utilisateur a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
2025-02-21 20:15:32 -05:00
|
|
|
|
2025-02-20 00:19:32 -05:00
|
|
|
return result.data.data.map((room: RoomType) => ({ _id: room._id, title: room.title }));
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
const url = err.config?.url || 'URL inconnue';
|
|
|
|
|
return data?.error || `Erreur serveur inconnue lors de la requête (${url}).`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-25 16:12:57 -05:00
|
|
|
public async getRoomContent(roomId: string): Promise<RoomType> {
|
|
|
|
|
try {
|
|
|
|
|
const url = this.constructRequestUrl(`/room/${roomId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const response = await axios.get<{ data: RoomType }>(url, { headers });
|
|
|
|
|
|
|
|
|
|
if (response.status !== 200) {
|
|
|
|
|
throw new Error(`Failed to get room: ${response.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return response.data.data;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const serverError = error.response?.data?.error;
|
|
|
|
|
throw new Error(serverError || 'Erreur serveur inconnue');
|
|
|
|
|
}
|
|
|
|
|
throw new Error('Erreur réseau');
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-20 00:19:32 -05:00
|
|
|
|
|
|
|
|
public async getRoomTitleByUserId(userId: string): Promise<string[] | string> {
|
|
|
|
|
try {
|
|
|
|
|
if (!userId) {
|
|
|
|
|
throw new Error(`L'ID utilisateur est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/room/getRoomTitleByUserId/${userId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.get(url, { headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'obtention des titres des salles a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.data.titles;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
return `Une erreur inattendue s'est produite.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public async getRoomTitle(roomId: string): Promise<string | string> {
|
|
|
|
|
try {
|
|
|
|
|
if (!roomId) {
|
|
|
|
|
throw new Error(`L'ID de la salle est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/room/getRoomTitle/${roomId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.get(url, { headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'obtention du titre de la salle a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.data.title;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
return `Une erreur inattendue s'est produite.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public async createRoom(title: string): Promise<string | string> {
|
|
|
|
|
try {
|
|
|
|
|
if (!title) {
|
|
|
|
|
throw new Error(`Le titre de la salle est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/room/create`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { title };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La création de la salle a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Salle créée avec succès. ID de la salle: ${result.data.roomId}`;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la création de la salle.';
|
|
|
|
|
}
|
|
|
|
|
return `Une erreur inattendue s'est produite.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async deleteRoom(roomId: string): Promise<string | string> {
|
|
|
|
|
try {
|
|
|
|
|
if (!roomId) {
|
|
|
|
|
throw new Error(`L'ID de la salle est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/room/delete/${roomId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.delete(url, { headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La suppression de la salle a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Salle supprimée avec succès.`;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la suppression de la salle.';
|
|
|
|
|
}
|
|
|
|
|
return `Une erreur inattendue s'est produite.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async renameRoom(roomId: string, newTitle: string): Promise<string | string> {
|
|
|
|
|
try {
|
|
|
|
|
if (!roomId || !newTitle) {
|
|
|
|
|
throw new Error(`L'ID de la salle et le nouveau titre sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/room/rename`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { roomId, newTitle };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.put(url, body, { headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La mise à jour du titre de la salle a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Titre de la salle mis à jour avec succès.`;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la mise à jour du titre.';
|
|
|
|
|
}
|
|
|
|
|
return `Une erreur inattendue s'est produite.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-29 20:08:34 -04:00
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async deleteFolder(folderId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!folderId) {
|
|
|
|
|
throw new Error(`Le folderId est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/folder/delete/${folderId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.delete(url, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La supression du dossier a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async renameFolder(folderId: string, newTitle: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
2025-01-26 21:50:57 -05:00
|
|
|
console.log(`rename folder: folderId: ${folderId}, newTitle: ${newTitle}`);
|
2024-03-29 20:08:34 -04:00
|
|
|
if (!folderId || !newTitle) {
|
|
|
|
|
throw new Error(`Le folderId et le nouveau titre sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/folder/rename`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { folderId, newTitle };
|
|
|
|
|
|
2025-01-26 21:50:57 -05:00
|
|
|
const result = await axios.put(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
console.log(`rename folder: result: ${result.status}, ${result.data}`);
|
2024-03-29 20:08:34 -04:00
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`Le changement de nom de dossier a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
2025-01-26 21:50:57 -05:00
|
|
|
console.log(JSON.stringify(err));
|
2024-03-29 20:08:34 -04:00
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-11 02:22:14 -05:00
|
|
|
public async duplicateFolder(folderId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
if (!folderId) {
|
|
|
|
|
throw new Error(`Le folderId et le nouveau titre sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/folder/duplicate`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { folderId };
|
|
|
|
|
|
|
|
|
|
console.log(headers);
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La duplication du dossier a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-11 02:22:14 -05:00
|
|
|
public async copyFolder(folderId: string, newTitle: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
if (!folderId || !newTitle) {
|
|
|
|
|
throw new Error(`Le folderId et le nouveau titre sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/folder/copy/${folderId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { newTitle };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La copie du dossier a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-19 18:56:37 -05:00
|
|
|
|
2024-03-29 20:08:34 -04:00
|
|
|
// Quiz Routes
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async createQuiz(title: string, content: string[], folderId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!title || !content || !folderId) {
|
|
|
|
|
throw new Error(`Le titre, les contenu et le dossier de destination sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/create`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { title, content, folderId };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La création du quiz a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns quiz if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
|
|
|
|
public async getQuiz(quizId: string): Promise<QuizType | string> {
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!quizId) {
|
|
|
|
|
throw new Error(`Le quizId est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/get/${quizId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.get(url, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'obtention du quiz a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.data.data as QuizType;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async deleteQuiz(quizId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!quizId) {
|
|
|
|
|
throw new Error(`Le quizId est requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/delete/${quizId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.delete(url, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La supression du quiz a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async updateQuiz(quizId: string, newTitle: string, newContent: string[]): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!quizId || !newTitle || !newContent) {
|
|
|
|
|
throw new Error(`Le quizId, titre et le contenu sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/update`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { quizId, newTitle, newContent };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.put(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La mise à jours du quiz a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async moveQuiz(quizId: string, newFolderId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!quizId || !newFolderId) {
|
|
|
|
|
throw new Error(`Le quizId et le nouveau dossier sont requis.`);
|
|
|
|
|
}
|
|
|
|
|
//console.log(quizId);
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/move`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { quizId, newFolderId };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.put(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`Le déplacement du quiz a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @remarks This function is not yet implemented.
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async duplicateQuiz(quizId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/duplicate`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { quizId };
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`La duplication du quiz a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-11 02:22:14 -05:00
|
|
|
return result.status === 200;
|
2024-03-29 20:08:34 -04:00
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @remarks This function is not yet implemented.
|
|
|
|
|
* @returns true if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
2025-01-11 02:22:14 -05:00
|
|
|
public async copyQuiz(quizId: string, newTitle: string, folderId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
2025-01-11 02:22:14 -05:00
|
|
|
console.log(quizId, newTitle, folderId);
|
2024-03-29 20:08:34 -04:00
|
|
|
return "Route not implemented yet!";
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-11 02:22:14 -05:00
|
|
|
async ShareQuiz(quizId: string, email: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
if (!quizId || !email) {
|
|
|
|
|
throw new Error(`quizId and email are required.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/Share`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { quizId, email };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.put(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`Update and share quiz failed. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Unknown server error during request.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `An unexpected error occurred.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getSharedQuiz(quizId: string): Promise<string> {
|
|
|
|
|
try {
|
|
|
|
|
if (!quizId) {
|
|
|
|
|
throw new Error(`quizId is required.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/getShare/${quizId}`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.get(url, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`Update and share quiz failed. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.data.data;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Unknown server error during request.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `An unexpected error occurred.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-11 02:22:14 -05:00
|
|
|
async receiveSharedQuiz(quizId: string, folderId: string): Promise<ApiResponse> {
|
2024-03-29 20:08:34 -04:00
|
|
|
try {
|
|
|
|
|
if (!quizId || !folderId) {
|
|
|
|
|
throw new Error(`quizId and folderId are required.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/quiz/receiveShare`);
|
|
|
|
|
const headers = this.constructRequestHeaders();
|
|
|
|
|
const body = { quizId, folderId };
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, body, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`Receive shared quiz failed. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
|
|
|
|
return data?.error || 'Unknown server error during request.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `An unexpected error occurred.`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Images Route
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns the image URL (string) if successful
|
|
|
|
|
* @returns A error string if unsuccessful,
|
|
|
|
|
*/
|
|
|
|
|
public async uploadImage(image: File): Promise<string> {
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if (!image) {
|
|
|
|
|
throw new Error(`L'image est requise.`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const url: string = this.constructRequestUrl(`/image/upload`);
|
|
|
|
|
|
|
|
|
|
const headers = {
|
|
|
|
|
Authorization: `Bearer ${this.getToken()}`,
|
|
|
|
|
'Content-Type': 'multipart/form-data'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const formData = new FormData();
|
|
|
|
|
formData.append('image', image);
|
|
|
|
|
|
|
|
|
|
const result: AxiosResponse = await axios.post(url, formData, { headers: headers });
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) {
|
|
|
|
|
throw new Error(`L'enregistrement a échoué. Status: ${result.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const id = result.data.id;
|
|
|
|
|
|
|
|
|
|
return this.constructRequestUrl('/image/get/' + id);
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log("Error details: ", error);
|
|
|
|
|
|
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
|
|
|
const err = error as AxiosError;
|
|
|
|
|
const data = err.response?.data as { error: string } | undefined;
|
2025-01-11 02:22:14 -05:00
|
|
|
const msg = data?.error || 'Erreur serveur inconnue lors de la requête.';
|
|
|
|
|
return `ERROR : ${msg}`;
|
2024-03-29 20:08:34 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `ERROR : Une erreur inattendue s'est produite.`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// NOTE : Get Image pas necessaire
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const apiService = new ApiService();
|
2025-02-07 19:36:11 -05:00
|
|
|
export default apiService;
|