From 7d69a729870a14653fcddab1033a89f9ce37b4d9 Mon Sep 17 00:00:00 2001 From: MateoGlzAlon Date: Thu, 12 Dec 2024 20:11:57 +0100 Subject: [PATCH] feat: added ban and delete project functionality for admins --- Dockerfile | 4 - README.md | 2 +- app/(pages)/projects/[projectId]/page.jsx | 103 ++++++++++++++++-- .../DELETE/deleteProjectDELETE.jsx | 18 +++ .../DELETE/deleteUserDELETE.jsx | 18 +++ 5 files changed, 130 insertions(+), 15 deletions(-) create mode 100644 components/fetchComponents/DELETE/deleteProjectDELETE.jsx create mode 100644 components/fetchComponents/DELETE/deleteUserDELETE.jsx diff --git a/Dockerfile b/Dockerfile index c3f4435..b894b94 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,10 +9,6 @@ COPY package.json ./ RUN npm update && npm install -# If you want yarn update and install uncomment the bellow - -# RUN yarn install && yarn upgrade - FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules diff --git a/README.md b/README.md index f5eca1e..f0329f9 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,5 @@ This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next ## Getting Started ``` -docker run -d --env-file .env --name raisehub_frontend_container -p 3000:3000 mateogonzalezz/raisehub_frontend:1733921631 +docker run -d --env-file .env --name raisehub_frontend_container -p 3000:3000 mateogonzalezz/raisehub_frontend: ``` diff --git a/app/(pages)/projects/[projectId]/page.jsx b/app/(pages)/projects/[projectId]/page.jsx index 79030f6..bc84596 100644 --- a/app/(pages)/projects/[projectId]/page.jsx +++ b/app/(pages)/projects/[projectId]/page.jsx @@ -10,29 +10,82 @@ import NumberTicker from "@/components/magicui/number-ticker"; import fetchProjectData from '@/components/fetchComponents/GET/fetchProjectData'; import PaymentButton from '@/components/pageComponents/projects/PaymentButton'; import { useWebSocket } from "@/components/generalComponents/WebSocketContext"; +import deleteProjectById from '@/components/fetchComponents/DELETE/deleteProjectDELETE'; +import deleteUserById from '@/components/fetchComponents/DELETE/deleteUserDELETE'; +import TokenManager from '@/app/apis/TokenManager'; + +// Reusable confirmation modal +const ConfirmationModal = ({ isOpen, onClose, onConfirm, message }) => { + if (!isOpen) return null; + + return ( +
+
+

{message}

+
+ + +
+
+
+ ); +}; const ProjectDetails = ({ params }) => { const { projectId } = params; - console.log("projectId es: ", projectId); const router = useRouter(); - const [project, setProject] = useState(null); // Correct project state + const [project, setProject] = useState(null); const [loading, setLoading] = useState(true); + const [isDeleteModalOpen, setDeleteModalOpen] = useState(false); + const [isBanModalOpen, setBanModalOpen] = useState(false); const { setupStompClient } = useWebSocket(); + const handleDeleteProject = async () => { + try { + await deleteProjectById(projectId); + alert("Project deleted successfully."); + router.push("/"); + } catch (error) { + alert("Failed to delete project."); + } finally { + setDeleteModalOpen(false); + } + }; + + const handleBanUser = async () => { + try { + console.log("userid es: ", project.userId); + // Implement ban user logic here + await deleteUserById(project.userId); + alert("User banned successfully."); + router.push("/"); + } catch (error) { + alert("Failed to ban user."); + } finally { + setBanModalOpen(false); + } + }; + useEffect(() => { const fetchData = async () => { try { setLoading(true); - - // Fetch project data const data = await fetchProjectData(projectId); if (!data) throw new Error("Project not found"); - setProject(data); - } catch (error) { console.error("Error loading project data:", error); - router.push("/404"); // Redirect to 404 if the project is not found + router.push("/404"); } finally { setLoading(false); } @@ -71,7 +124,7 @@ const ProjectDetails = ({ params }) => { ); } - if (!project) return null; // Prevent rendering if the project is still null + if (!project) return null; return ( @@ -124,15 +177,45 @@ const ProjectDetails = ({ params }) => { + {TokenManager.getClaims().roles[0] === "admin" && ( +
+ + + +
+ )} +

About

{project.description}

- -
+ + {/* Modals */} + setDeleteModalOpen(false)} + onConfirm={handleDeleteProject} + message="Are you sure you want to delete this project?" + /> + setBanModalOpen(false)} + onConfirm={handleBanUser} + message="Are you sure you want to ban this user?" + />
); }; diff --git a/components/fetchComponents/DELETE/deleteProjectDELETE.jsx b/components/fetchComponents/DELETE/deleteProjectDELETE.jsx new file mode 100644 index 0000000..87df21d --- /dev/null +++ b/components/fetchComponents/DELETE/deleteProjectDELETE.jsx @@ -0,0 +1,18 @@ +import axios from 'axios'; + +import { DATA } from '@/app/data'; +import TokenManager from '@/app/apis/TokenManager'; + +export default async function deleteProject(projectId) { + if (projectId) { + try { + await axios.delete(`${DATA.origin}/projects/${projectId}`, + { + headers: { Authorization: `Bearer ${TokenManager.getAccessToken()}` } + } + ); + } catch (error) { + console.error("Failed to delete project: ", projectId); + } + } +} diff --git a/components/fetchComponents/DELETE/deleteUserDELETE.jsx b/components/fetchComponents/DELETE/deleteUserDELETE.jsx new file mode 100644 index 0000000..5c894dc --- /dev/null +++ b/components/fetchComponents/DELETE/deleteUserDELETE.jsx @@ -0,0 +1,18 @@ +import axios from 'axios'; + +import { DATA } from '@/app/data'; +import TokenManager from '@/app/apis/TokenManager'; + +export default async function deleteUser(userId) { + if (userId) { + try { + await axios.delete(`${DATA.origin}/users/${userId}`, + { + headers: { Authorization: `Bearer ${TokenManager.getAccessToken()}` } + } + ); + } catch (error) { + console.error("Failed to delete user: ", userId); + } + } +}