diff --git a/front/MyINPulse-front/src/api_tmp.ts b/front/MyINPulse-front/src/api_tmp.ts deleted file mode 100644 index 222915f..0000000 --- a/front/MyINPulse-front/src/api_tmp.ts +++ /dev/null @@ -1,738 +0,0 @@ -import axios, { type AxiosError, type AxiosResponse } from "axios"; -import { store } from "@/main.ts"; -import { addNewMessage, color } from "@/services/popupDisplayer.ts"; -import Project from "./ApiClasses/Project"; -import SectionCell from "./ApiClasses/SectionCell"; -import Report from "./ApiClasses/Repport"; -import Appointment from "./ApiClasses/Appointment"; - -const axiosInstance = axios.create({ - baseURL: import.meta.env.VITE_BACKEND_URL, - headers: { - "Content-Type": "application/json", - }, -}); - -axiosInstance.interceptors.response.use( - (response) => response, // Directly return successful responses. - async (error) => { - const originalRequest = error.config; - if ( - ((error.response && error.response.status === 401) || - error.code == "ERR_NETWORK") && - !originalRequest._retry && - store.authenticated - ) { - originalRequest._retry = true; // Mark the request as retried to avoid infinite loops. - try { - await store.refreshUserToken(); - // Update the authorization header with the new access token. - axiosInstance.defaults.headers.common["Authorization"] = - `Bearer ${store.user.token}`; - return axiosInstance(originalRequest); // Retry the original request with the new access token. - } catch (refreshError) { - // Handle refresh token errors by clearing stored tokens and redirecting to the login page. - console.error("Token refresh failed:", refreshError); - localStorage.removeItem("accessToken"); - localStorage.removeItem("refreshToken"); - window.location.href = "/login"; - return Promise.reject(refreshError); - } - } - return Promise.reject(error); // For all other errors, return the error as is. - } -); - -// TODO: spawn a error modal -function defaultApiErrorHandler(err: AxiosError) { - addNewMessage(err.message, color.Red); -} - -function defaultApiSuccessHandler(response: AxiosResponse) { - addNewMessage(response.data, color.Green); -} - -// Existing functions (maintained for backward compatibility) -function callApi( - endpoint: string, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get(endpoint) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function postApi( - endpoint: string, - data: unknown, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post(endpoint, data) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function deleteApi( - endpoint: string, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .delete(endpoint) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -// New functions based on Swagger documentation - -// Unauth API -function finalizeAccount( - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post("/unauth/finalize") - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -// function requestJoinProject( // Not yet implemented [cite: 4] -// projectId: number, -// onSuccessHandler?: (response: AxiosResponse) => void, -// onErrorHandler?: (error: AxiosError) => void -// ): void { -// axiosInstance -// .post(`/unauth/request-join/${projectId}`) -// .then((response) => { -// if (onSuccessHandler) { -// onSuccessHandler(response); -// } else { -// defaultApiSuccessHandler(response); -// } -// }) -// .catch((error: AxiosError) => { -// if (onErrorHandler) { -// onErrorHandler(error); -// } else { -// defaultApiErrorHandler(error); -// } -// }); -// } - -// Admin API -function getPendingAccounts( - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get("/admin/pending-accounts") - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function validateUserAccount( - userId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post(`/admin/accounts/validate/${userId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -// 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 getAdminProjects( - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get("/admin/projects") - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function addProjectManually( - projectDetails: Project, // Replace 'any' with a proper type for project details if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (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); - } - }); -} - -function getPendingProjects( - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get("/admin/projects/pending") - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function decidePendingProject( - pendingProjectId: number, - decision: { projectId: number; adminId: number; isAccepted: boolean }, // Replace 'any' with a proper type for project decision if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post(`/admin/projects/pending/decision/${pendingProjectId}`, decision) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function createAppointmentReport( - appointmentId: number, - reportContent: Report, // Replace 'any' with a proper type for report content if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post(`/admin/appointments/report/${appointmentId}`, reportContent) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function updateAppointmentReport( - appointmentId: number, - reportContent: Report, // Replace 'any' with a proper type for report content if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .put(`/admin/appointments/report/${appointmentId}`, reportContent) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function getUpcomingAppointments( - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get("/admin/appointments/upcoming") - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function removeProject( - projectId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .delete(`/admin/projects/${projectId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function grantAdminRights( - userId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post(`/admin/make-admin/${userId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -// Shared API -function getSectionCellsByDate( - projectId: number, - sectionId: number, - date: string, // Use string for date in 'YYYY-MM-DD HH:mm' format - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get(`/shared/projects/sectionCells/${projectId}/${sectionId}/${date}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function getProjectEntrepreneurs( - projectId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get(`/shared/projects/entrepreneurs/${projectId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function getProjectAdmin( - projectId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get(`/shared/projects/admin/${projectId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function getProjectAppointments( - projectId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get(`/shared/projects/appointments/${projectId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function getAppointmentReport( - appointmentId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .get(`/shared/appointments/report/${appointmentId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function requestAppointment( - appointmentDetails: Appointment, // Replace 'any' with a proper type for appointment details if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post("/shared/appointments/request", appointmentDetails) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -// Entrepreneurs API -function requestProjectCreation( - projectDetails: Project, // Replace 'any' with a proper type for project details if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post("/entrepreneur/projects/request", projectDetails) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function addSectionCell( - sectionCellDetails: SectionCell, // Replace 'any' with a proper type for section cell details if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .post("/entrepreneur/sectionCells", sectionCellDetails) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function modifySectionCell( - sectionCellId: number, - sectionCellDetails: SectionCell, // Replace 'any' with a proper type for section cell details if available - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .put(`/entrepreneur/sectionCells/${sectionCellId}`, sectionCellDetails) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -function removeSectionCell( - sectionCellId: number, - onSuccessHandler?: (response: AxiosResponse) => void, - onErrorHandler?: (error: AxiosError) => void -): void { - axiosInstance - .delete(`/entrepreneur/sectionCells/${sectionCellId}`) - .then((response) => { - if (onSuccessHandler) { - onSuccessHandler(response); - } else { - defaultApiSuccessHandler(response); - } - }) - .catch((error: AxiosError) => { - if (onErrorHandler) { - onErrorHandler(error); - } else { - defaultApiErrorHandler(error); - } - }); -} - -export { - axiosInstance, - callApi, - postApi, - deleteApi, - finalizeAccount, - // requestJoinProject, // Not yet implemented [cite: 4] - getPendingAccounts, - validateUserAccount, - // getPendingProjectJoinRequests, // Not yet implemented [cite: 3] - // decideProjectJoinRequest, // Not yet implemented [cite: 3] - getAdminProjects, - addProjectManually, - getPendingProjects, - decidePendingProject, - createAppointmentReport, - updateAppointmentReport, - getUpcomingAppointments, - removeProject, - grantAdminRights, - getSectionCellsByDate, - getProjectEntrepreneurs, - getProjectAdmin, - getProjectAppointments, - getAppointmentReport, - requestAppointment, - requestProjectCreation, - addSectionCell, - modifySectionCell, - removeSectionCell, -}; diff --git a/front/MyINPulse-front/src/services/Apis/Admin.ts b/front/MyINPulse-front/src/services/Apis/Admin.ts new file mode 100644 index 0000000..d08df72 --- /dev/null +++ b/front/MyINPulse-front/src/services/Apis/Admin.ts @@ -0,0 +1,321 @@ +import { type AxiosError, type AxiosResponse } from "axios"; +import Project from "@/ApiClasses/Project"; +import Report from "@/ApiClasses/Repport"; +import { axiosInstance, defaultApiErrorHandler, defaultApiSuccessHandler } from "@/services/api" + +// Admin API +function getPendingAccounts( + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get("/admin/pending-accounts") + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function validateUserAccount( + userId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post(`/admin/accounts/validate/${userId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +// 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 getAdminProjects( + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get("/admin/projects") + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function addProjectManually( + projectDetails: Project, // Replace 'any' with a proper type for project details if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (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); + } + }); +} + +function getPendingProjects( + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get("/admin/projects/pending") + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function decidePendingProject( + pendingProjectId: number, + decision: { projectId: number; adminId: number; isAccepted: boolean }, // Replace 'any' with a proper type for project decision if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post(`/admin/projects/pending/decision/${pendingProjectId}`, decision) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function createAppointmentReport( + appointmentId: number, + reportContent: Report, // Replace 'any' with a proper type for report content if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post(`/admin/appointments/report/${appointmentId}`, reportContent) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function updateAppointmentReport( + appointmentId: number, + reportContent: Report, // Replace 'any' with a proper type for report content if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .put(`/admin/appointments/report/${appointmentId}`, reportContent) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function getUpcomingAppointments( + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get("/admin/appointments/upcoming") + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function removeProject( + projectId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .delete(`/admin/projects/${projectId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function grantAdminRights( + userId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post(`/admin/make-admin/${userId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +export { + axiosInstance, + // requestJoinProject, // Not yet implemented [cite: 4] + getPendingAccounts, + validateUserAccount, + // getPendingProjectJoinRequests, // Not yet implemented [cite: 3] + // decideProjectJoinRequest, // Not yet implemented [cite: 3] + getAdminProjects, + addProjectManually, + getPendingProjects, + decidePendingProject, + createAppointmentReport, + updateAppointmentReport, + getUpcomingAppointments, + removeProject, + grantAdminRights, +}; diff --git a/front/MyINPulse-front/src/services/Apis/Entrepreneurs.ts b/front/MyINPulse-front/src/services/Apis/Entrepreneurs.ts new file mode 100644 index 0000000..f3d9fbc --- /dev/null +++ b/front/MyINPulse-front/src/services/Apis/Entrepreneurs.ts @@ -0,0 +1,134 @@ +import Project from "@/ApiClasses/Project"; +import SectionCell from "@/ApiClasses/SectionCell"; +import { axiosInstance, defaultApiErrorHandler, defaultApiSuccessHandler } from "@/services/api" + +axiosInstance.interceptors.response.use( + (response) => response, // Directly return successful responses. + async (error) => { + const originalRequest = error.config; + if ( + ((error.response && error.response.status === 401) || + error.code == "ERR_NETWORK") && + !originalRequest._retry && + store.authenticated + ) { + originalRequest._retry = true; // Mark the request as retried to avoid infinite loops. + try { + await store.refreshUserToken(); + // Update the authorization header with the new access token. + axiosInstance.defaults.headers.common["Authorization"] = + `Bearer ${store.user.token}`; + return axiosInstance(originalRequest); // Retry the original request with the new access token. + } catch (refreshError) { + // Handle refresh token errors by clearing stored tokens and redirecting to the login page. + console.error("Token refresh failed:", refreshError); + localStorage.removeItem("accessToken"); + localStorage.removeItem("refreshToken"); + router.push("/login"); + return Promise.reject(refreshError); + } + } + return Promise.reject(error); // For all other errors, return the error as is. + } +); + +// Entrepreneurs API +function requestProjectCreation( + projectDetails: Project, // Replace 'any' with a proper type for project details if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post("/entrepreneur/projects/request", projectDetails) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function addSectionCell( + sectionCellDetails: SectionCell, // Replace 'any' with a proper type for section cell details if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post("/entrepreneur/sectionCells", sectionCellDetails) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function modifySectionCell( + sectionCellId: number, + sectionCellDetails: SectionCell, // Replace 'any' with a proper type for section cell details if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .put(`/entrepreneur/sectionCells/${sectionCellId}`, sectionCellDetails) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function removeSectionCell( + sectionCellId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .delete(`/entrepreneur/sectionCells/${sectionCellId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +export { + requestProjectCreation, + addSectionCell, + modifySectionCell, + removeSectionCell, +}; diff --git a/front/MyINPulse-front/src/services/Apis/Shared.ts b/front/MyINPulse-front/src/services/Apis/Shared.ts new file mode 100644 index 0000000..6693527 --- /dev/null +++ b/front/MyINPulse-front/src/services/Apis/Shared.ts @@ -0,0 +1,154 @@ +import { type AxiosError, type AxiosResponse } from "axios"; +import Appointment from "@/ApiClasses/Appointment"; +import { axiosInstance, defaultApiErrorHandler, defaultApiSuccessHandler } from "@/services/api" + + +// Shared API +function getSectionCellsByDate( + projectId: number, + sectionId: number, + date: string, // Use string for date in 'YYYY-MM-DD HH:mm' format + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get(`/shared/projects/sectionCells/${projectId}/${sectionId}/${date}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function getProjectEntrepreneurs( + projectId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get(`/shared/projects/entrepreneurs/${projectId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function getProjectAdmin( + projectId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get(`/shared/projects/admin/${projectId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function getProjectAppointments( + projectId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get(`/shared/projects/appointments/${projectId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function getAppointmentReport( + appointmentId: number, + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .get(`/shared/appointments/report/${appointmentId}`) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +function requestAppointment( + appointmentDetails: Appointment, // Replace 'any' with a proper type for appointment details if available + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post("/shared/appointments/request", appointmentDetails) + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +export { + getSectionCellsByDate, + getProjectEntrepreneurs, + getProjectAdmin, + getProjectAppointments, + getAppointmentReport, + requestAppointment, +}; diff --git a/front/MyINPulse-front/src/services/Apis/Unauth.ts b/front/MyINPulse-front/src/services/Apis/Unauth.ts new file mode 100644 index 0000000..d4e4f64 --- /dev/null +++ b/front/MyINPulse-front/src/services/Apis/Unauth.ts @@ -0,0 +1,56 @@ +import { type AxiosError, type AxiosResponse } from "axios"; + +import { axiosInstance, defaultApiErrorHandler, defaultApiSuccessHandler } from "@/services/api" + + +// Unauth API +function finalizeAccount( + onSuccessHandler?: (response: AxiosResponse) => void, + onErrorHandler?: (error: AxiosError) => void +): void { + axiosInstance + .post("/unauth/finalize") + .then((response) => { + if (onSuccessHandler) { + onSuccessHandler(response); + } else { + defaultApiSuccessHandler(response); + } + }) + .catch((error: AxiosError) => { + if (onErrorHandler) { + onErrorHandler(error); + } else { + defaultApiErrorHandler(error); + } + }); +} + +// function requestJoinProject( // Not yet implemented [cite: 4] +// projectId: number, +// onSuccessHandler?: (response: AxiosResponse) => void, +// onErrorHandler?: (error: AxiosError) => void +// ): void { +// axiosInstance +// .post(`/unauth/request-join/${projectId}`) +// .then((response) => { +// if (onSuccessHandler) { +// onSuccessHandler(response); +// } else { +// defaultApiSuccessHandler(response); +// } +// }) +// .catch((error: AxiosError) => { +// if (onErrorHandler) { +// onErrorHandler(error); +// } else { +// defaultApiErrorHandler(error); +// } +// }); +// } + + +export { + finalizeAccount, + // requestJoinProject, // Not yet implemented [cite: 4] +};