diff --git a/api/src/routes/users.py b/api/src/routes/users.py index 7305139..e8a8443 100644 --- a/api/src/routes/users.py +++ b/api/src/routes/users.py @@ -191,12 +191,6 @@ async def update_user( user.username = user_udpate.username - if user_udpate.password is not None and not validate_password(user_udpate.password): - raise HTTPException(status_code=400, detail="Invalid password") - - if not verify_password(user_udpate.password, user.password): - user.password = get_hashed_password(user_udpate.password) - stmt = ( user_table.update() .where(user_table.c.username == username) @@ -208,7 +202,7 @@ async def update_user( return user -@router.patch( +@router.delete( "/{username}", summary="Delete an user by username", dependencies=[Depends(jwt_bearer)], diff --git a/front-js/src/app/dashboard/page.tsx b/front-js/src/app/dashboard/page.tsx index 5d4c826..e2e36f0 100644 --- a/front-js/src/app/dashboard/page.tsx +++ b/front-js/src/app/dashboard/page.tsx @@ -20,6 +20,8 @@ export default function Dashboard() { const [isLoading, setIsLoading] = useState(true); + const[isAdmin, setIsAdmin] = useState(false); + useEffect(() => { const checkTokens = async () => { const token = Cookies.get("access_token"); @@ -71,6 +73,28 @@ export default function Dashboard() { getUser(); }, [router]); + + const [role, setRole] = useState(""); + + useEffect(() => { + const getRole = async () => { + try { + const response = await axios.get("/users/me", { + headers: { + Authorization: `Bearer ${Cookies.get("access_token")}`, + }, + }); + setRole(response.data.role); + } catch { + Cookies.remove("access_token"); + Cookies.remove("refresh_token"); + router.push("/"); + } + }; + + getRole(); + }, [router]); + return ( @@ -81,11 +105,13 @@ export default function Dashboard() { dashboard: "Tableau de bord", modules: "Mes modules", profile: "Mon profil", + ...(role=="admin" && {userManagement: "Gestion des utilisateurs"}), }} activeTab="dashboard" onClick={(tab) => router.push(`/${tab.toLowerCase()}`)} onClickLogout={() => router.push("/auth/logout")} onClickLogo={() => router.push("/")} + /> )} diff --git a/front-js/src/app/usermanagement/layout.tsx b/front-js/src/app/usermanagement/layout.tsx new file mode 100644 index 0000000..0c3fcf6 --- /dev/null +++ b/front-js/src/app/usermanagement/layout.tsx @@ -0,0 +1,14 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Portail administrateur", + description: "Networkers", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return {children}; +} \ No newline at end of file diff --git a/front-js/src/app/usermanagement/page.tsx b/front-js/src/app/usermanagement/page.tsx new file mode 100644 index 0000000..b91cc93 --- /dev/null +++ b/front-js/src/app/usermanagement/page.tsx @@ -0,0 +1,241 @@ +"use client"; + +import Box from "@/components/Box"; +import Header from "@/components/Header"; +import { useRouter } from "next/navigation"; +import Layout from "@/components/Layout"; +import Modal from "@/components/Modal"; +import { useEffect, useState } from "react"; +import Title from "@/components/Title"; +import axios from "@/axiosConfig"; +import Cookies from "js-cookie"; +import { Alert, MenuItem, Select } from "@mui/material"; +import Input from "@/components/Input"; +import Button from "@/components/Button"; + +export default function Profile() { + const router = useRouter(); + + const [, setHasAccessToken] = useState(false); + + useEffect(() => { + const checkTokens = async () => { + const token = Cookies.get("access_token"); + const refresh = Cookies.get("refresh_token"); + if (!token && refresh) { + try { + const response = await axios.post("/auth/refresh", { + refresh_token: refresh, + }); + const data = response.data; + if (response.status === 200) { + Cookies.set("access_token", data.access_token); + Cookies.set("refresh_token", refresh); + } + } catch { + Cookies.remove("access_token"); + Cookies.remove("refresh_token"); + } + } + setHasAccessToken(!!token); + + if (!token && !refresh) { + router.push("/"); + } + }; + + checkTokens(); + }, [router]); + + const [role, setRole] = useState(""); + + const [currentUser, setCurrentUser] = useState(); + + const getAdminUser = async () => { + try { + const response = await axios.get("/users/me", { + headers: { + Authorization: `Bearer ${Cookies.get("access_token")}`, + }, + }); + setCurrentUser(response.data.username); + } catch { + Cookies.remove("access_token"); + Cookies.remove("refresh_token"); + router.push("/"); + } + }; + + useEffect(() => { + getAdminUser(); + }, []); + + useEffect(() => { + const getRole = async () => { + try { + const response = await axios.get("/users/me", { + headers: { + Authorization: `Bearer ${Cookies.get("access_token")}`, + }, + }); + setRole(response.data.role); + if (response.data.role !== "admin") { + router.push("/"); + } + } catch { + Cookies.remove("access_token"); + Cookies.remove("refresh_token"); + router.push("/"); + } + }; + + getRole(); + }, [router]); + + const [users, setUsers] = useState>(); + + const getUsers = async () => { + try { + const response = await axios.get("/users", { + headers: { + Authorization: `Bearer ${Cookies.get("access_token")}`, + }, + }); + const data = new Array(); + for (const user of response.data) { + data.push(user.username); + } + setUsers(data); + console.log(data); + } catch {} + }; + + useEffect(() => { + getUsers(); + }, []); + + const [selectedUser, setSelectedUser] = useState(""); + const [username, setUsername] = useState(""); + const [res, setRes] = useState(""); + + const handleUpdate = async () => { + try { + const response = await axios.patch( + `/users/${selectedUser}`, + { + username: username, + }, + { + headers: { + Authorization: `Bearer ${Cookies.get("access_token")}`, + }, + } + ); + if (response.status === 200) { + setRes("Utilisateur mis à jour"); + getUsers(); + } + } catch {} + }; + + const handleDelete = async () => { + try { + const response = await axios.delete(`/users/${selectedUser}`, { + headers: { + Authorization: `Bearer ${Cookies.get("access_token")}`, + }, + }); + if (response.status === 200) { + setRes("Utilisateur supprimé"); + getUsers(); + setSelectedUser(""); + } + } catch {} + }; + + return ( + + +
router.push(`/${tab.toLowerCase()}`)} + onClickLogout={() => router.push("/auth/logout")} + onClickLogo={() => router.push("/")} + /> + + + + Gestion des utilisateurs +
+ + + setUsername(e.target.value)} + required + label="Nouveau nom d'utilisateur" + /> + {res !== "" ? ( + + {res} + + ) : null} +