From be7381586162089572857c4d643f0bee3c407b8e Mon Sep 17 00:00:00 2001
From: Mohamed Maoulainine Maoulainine
 <Mohamed_Maoulainine.Maoulainine@enseirb-matmeca.fr>
Date: Mon, 28 Apr 2025 22:35:56 +0200
Subject: [PATCH] fix: separating the apis

---
 front/MyINPulse-front/src/api_tmp.ts          | 738 ------------------
 .../src/services/Apis/Admin.ts                | 321 ++++++++
 .../src/services/Apis/Entrepreneurs.ts        | 134 ++++
 .../src/services/Apis/Shared.ts               | 154 ++++
 .../src/services/Apis/Unauth.ts               |  56 ++
 5 files changed, 665 insertions(+), 738 deletions(-)
 delete mode 100644 front/MyINPulse-front/src/api_tmp.ts
 create mode 100644 front/MyINPulse-front/src/services/Apis/Admin.ts
 create mode 100644 front/MyINPulse-front/src/services/Apis/Entrepreneurs.ts
 create mode 100644 front/MyINPulse-front/src/services/Apis/Shared.ts
 create mode 100644 front/MyINPulse-front/src/services/Apis/Unauth.ts

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]
+};