From c3ad092512cc175086c7e4dabb47164d2a2a4bad Mon Sep 17 00:00:00 2001 From: Mohamed Maoulainine Maoulainine Date: Fri, 2 May 2025 01:26:08 +0200 Subject: [PATCH] fix: api integration --- .../MyINPulse-front/src/ApiClasses/Project.ts | 15 +- .../src/components/AddProjectForm.vue | 28 +-- .../components/PendingProjectComponent.vue | 27 ++- .../src/components/PendingRequestsManager.vue | 228 ++++++++++++++++++ .../src/services/Apis/Admin.ts | 131 +++++----- front/MyINPulse-front/src/views/AdminMain.vue | 73 ++++-- .../MyINPulse-front/src/views/CanvasView.vue | 2 +- 7 files changed, 374 insertions(+), 130 deletions(-) create mode 100644 front/MyINPulse-front/src/components/PendingRequestsManager.vue diff --git a/front/MyINPulse-front/src/ApiClasses/Project.ts b/front/MyINPulse-front/src/ApiClasses/Project.ts index b1064fe..f445276 100644 --- a/front/MyINPulse-front/src/ApiClasses/Project.ts +++ b/front/MyINPulse-front/src/ApiClasses/Project.ts @@ -22,16 +22,16 @@ class Project { this._idProject = value; } - get projectName(): string | undefined { - return this._projectName; + get projectName(): string { + return this._projectName ?? ""; } set projectName(value: string | undefined) { this._projectName = value; } - get creationDate(): string | undefined { - return this._creationDate; + get creationDate(): string { + return this._creationDate ?? ""; } set creationDate(value: string | undefined) { @@ -77,6 +77,13 @@ class Project { status: this.status, }; } + + toCreatePayload() { + return { + projectName: this.projectName, + logo: this.logo, + }; + } } export default Project; diff --git a/front/MyINPulse-front/src/components/AddProjectForm.vue b/front/MyINPulse-front/src/components/AddProjectForm.vue index 6a24514..2c6ce5a 100644 --- a/front/MyINPulse-front/src/components/AddProjectForm.vue +++ b/front/MyINPulse-front/src/components/AddProjectForm.vue @@ -12,24 +12,13 @@ /> -
- - -
-
@@ -39,16 +28,17 @@ diff --git a/front/MyINPulse-front/src/components/PendingProjectComponent.vue b/front/MyINPulse-front/src/components/PendingProjectComponent.vue index a0d917c..cb4af63 100644 --- a/front/MyINPulse-front/src/components/PendingProjectComponent.vue +++ b/front/MyINPulse-front/src/components/PendingProjectComponent.vue @@ -15,26 +15,29 @@ diff --git a/front/MyINPulse-front/src/services/Apis/Admin.ts b/front/MyINPulse-front/src/services/Apis/Admin.ts index bc279f0..6c9e300 100644 --- a/front/MyINPulse-front/src/services/Apis/Admin.ts +++ b/front/MyINPulse-front/src/services/Apis/Admin.ts @@ -1,6 +1,6 @@ import { type AxiosError, type AxiosResponse } from "axios"; -import Project from "@/ApiClasses/Project"; import Report from "@/ApiClasses/Repport"; +import ProjectDecision from "@/ApiClasses/ProjectDecision"; import { axiosInstance, defaultApiErrorHandler, @@ -53,51 +53,50 @@ function validateUserAccount( }); } -// function getPendingProjectJoinRequests( // Not yet implemented [cite: 3] -// onSuccessHandler?: (response: AxiosResponse) => void, -// onErrorHandler?: (error: AxiosError) => void -// ): void { -// axiosInstance -// .get("/admin/request-join") -// .then((response) => { -// if (onSuccessHandler) { -// onSuccessHandler(response); -// } else { -// defaultApiSuccessHandler(response); -// } -// }) -// .catch((error: AxiosError) => { -// if (onErrorHandler) { -// onErrorHandler(error); -// } else { -// defaultApiErrorHandler(error); -// } -// }); -// } - -// function decideProjectJoinRequest( // Not yet implemented [cite: 3] -// joinRequestId: number, -// decision: { isAccepted: boolean }, -// onSuccessHandler?: (response: AxiosResponse) => void, -// onErrorHandler?: (error: AxiosError) => void -// ): void { -// axiosInstance -// .post(`/admin/request-join/decision/${joinRequestId}`, decision) -// .then((response) => { -// if (onSuccessHandler) { -// onSuccessHandler(response); -// } else { -// defaultApiSuccessHandler(response); -// } -// }) -// .catch((error: AxiosError) => { -// if (onErrorHandler) { -// onErrorHandler(error); -// } else { -// defaultApiErrorHandler(error); -// } -// }); -// } +function getPendingProjectJoinRequests( // Not yet implemented + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get("/admin/request-join") + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} +function decideProjectJoinRequest( // Not yet implemented + joinRequestId: number, + decision: { isAccepted: boolean }, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post(`/admin/request-join/decision/${joinRequestId}`, decision) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} function getAdminProjects( onSuccessHandler?: (response: AxiosResponse) => void, @@ -121,27 +120,20 @@ function getAdminProjects( }); } +type ProjectCreatePayload = { + projectName: string; + logo?: string; +}; + function addProjectManually( - projectDetails: Project, // Replace 'any' with a proper type for project details if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void + payload: ProjectCreatePayload, + onSuccess?: (response: AxiosResponse) => void, + onError?: (error: AxiosError) => void ): void { axiosInstance - .post("/admin/projects", projectDetails) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); + .post("/admin/projects", payload) + .then((response) => onSuccess?.(response)) + .catch((error: AxiosError) => onError?.(error)); } function getPendingProjects( @@ -167,13 +159,12 @@ function getPendingProjects( } function decidePendingProject( - pendingProjectId: number, - decision: { projectId: number; adminId: number; isAccepted: boolean }, // Replace 'any' with a proper type for project decision if available + decision: ProjectDecision, onSuccessHandler?: (response: AxiosResponse) => void, onErrorHandler?: (error: AxiosError) => void ): void { axiosInstance - .post(`/admin/projects/pending/decision/${pendingProjectId}`, decision) + .post(`/admin/projects/pending/decision`, decision.toObject()) .then((response) => { if (onSuccessHandler) { onSuccessHandler(response); @@ -308,11 +299,11 @@ function grantAdminRights( export { axiosInstance, - // requestJoinProject, // Not yet implemented [cite: 4] + //requestJoinProject, // Not yet implemented [cite: 4] getPendingAccounts, validateUserAccount, - // getPendingProjectJoinRequests, // Not yet implemented [cite: 3] - // decideProjectJoinRequest, // Not yet implemented [cite: 3] + getPendingProjectJoinRequests, // Not yet implemented [cite: 3] + decideProjectJoinRequest, // Not yet implemented [cite: 3] getAdminProjects, addProjectManually, getPendingProjects, diff --git a/front/MyINPulse-front/src/views/AdminMain.vue b/front/MyINPulse-front/src/views/AdminMain.vue index 1ce1af5..5ff97a1 100644 --- a/front/MyINPulse-front/src/views/AdminMain.vue +++ b/front/MyINPulse-front/src/views/AdminMain.vue @@ -1,6 +1,7 @@