Ajout de la gestion des users et des catégories dans la partie admin

This commit is contained in:
Mathis 2025-04-12 11:45:55 +02:00
parent 72d3211d5e
commit 40eb0c207c
7 changed files with 197 additions and 47 deletions

View File

@ -64,6 +64,9 @@ public class MainVerticle extends AbstractVerticle {
router.post("/changePassword").handler(setUser::changeUserPassword); router.post("/changePassword").handler(setUser::changeUserPassword);
router.post("/publicUser").handler(queryUsers::getPublicUser); router.post("/publicUser").handler(queryUsers::getPublicUser);
router.get("/getCategories").handler(queryObjects::getCategories); router.get("/getCategories").handler(queryObjects::getCategories);
router.post("/addCategories").handler(setObjects::newCategorie);
router.post("/deleteCategories").handler(setObjects::deleteCategories);
// Routes d'authentification // Routes d'authentification
router.post("/signup").handler(authHandler::handleSignup); router.post("/signup").handler(authHandler::handleSignup);
router.post("/login").handler(authHandler::handleLogin); router.post("/login").handler(authHandler::handleLogin);

View File

@ -42,7 +42,7 @@ public class QueryObjects {
public void getCategories(RoutingContext context) { public void getCategories(RoutingContext context) {
databaseService.pool databaseService.pool
.query("SELECT DISTINCT type FROM weather_objects;") .query("SELECT name FROM categories;")
.execute() .execute()
.onFailure(e -> { .onFailure(e -> {
System.err.println("Erreur de récupération de la BDD :" + e.getMessage()); System.err.println("Erreur de récupération de la BDD :" + e.getMessage());
@ -51,9 +51,16 @@ public class QueryObjects {
.end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode()); .end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
}) })
.onSuccess(rows -> { .onSuccess(rows -> {
if (!rows.iterator().hasNext()) {
context.response()
.setStatusCode(404)
.end(new JsonObject().put("error", "Aucun type trouvé dans la base de données").encode());
return;
}
JsonArray types = new JsonArray(); JsonArray types = new JsonArray();
rows.forEach(row -> types.add(row.getString("type"))); rows.forEach(row -> types.add(row.getString("name")));
context.response() context.response()
.putHeader("content-type", "application/json; charset=UTF-8") .putHeader("content-type", "application/json; charset=UTF-8")
.end(types.encode()); .end(types.encode());
@ -64,8 +71,8 @@ public class QueryObjects {
JsonObject body = context.body().asJsonObject(); JsonObject body = context.body().asJsonObject();
if (body == null) { if (body == null) {
context.response() context.response()
.setStatusCode(400) .setStatusCode(400)
.end(new JsonObject().put("error", "Corps de la requête manquant").encode()); .end(new JsonObject().put("error", "Corps de la requête manquant").encode());
return; return;
} }
String id = body.getString("id"); String id = body.getString("id");
@ -98,7 +105,7 @@ public class QueryObjects {
Boolean shouldUpdatePoints = body.getBoolean("shouldUpdatePoints", false); Boolean shouldUpdatePoints = body.getBoolean("shouldUpdatePoints", false);
if (Boolean.TRUE.equals(shouldUpdatePoints) && idUser != null) { if (Boolean.TRUE.equals(shouldUpdatePoints) && idUser != null) {
setUser.updateUserPoints(Integer.parseInt(idUser), 1); setUser.updateUserPoints(Integer.parseInt(idUser), 1);
} }
context.response() context.response()
.putHeader("content-type", "application/json: charset=UTF-8") .putHeader("content-type", "application/json: charset=UTF-8")

View File

@ -60,6 +60,38 @@ public class SetObjects {
}); });
} }
public void deleteCategories(RoutingContext context) {
JsonObject body = context.body().asJsonObject();
if (body == null) {
context.response()
.setStatusCode(400)
.end(new JsonObject().put("error", "Corps de la requête manquant").encode());
return;
}
String name = body.getString("name");
databaseService.pool
.preparedQuery("DELETE FROM categories WHERE name=?")
.execute(Tuple.of(name))
.onFailure(e -> {
System.err.println("Erreur de récupération de la BDD :" + e.getMessage());
context.response()
.setStatusCode(500)
.end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
})
.onSuccess(rows -> {
if (rows.rowCount() == 0) {
context.response()
.setStatusCode(404)
.end(new JsonObject().put("error", "Catégorie non trouvé").encode());
return;
}
context.response()
.putHeader("content-type", "application/json: charset=UTF-8")
.end(new JsonObject().put("success", "La catégorie à bien été supprimé").encode());
return;
});
}
public void deleteObject(RoutingContext context) { public void deleteObject(RoutingContext context) {
JsonObject body = context.body().asJsonObject(); JsonObject body = context.body().asJsonObject();
if (body == null) { if (body == null) {
@ -137,4 +169,39 @@ public class SetObjects {
}); });
} }
public void newCategorie(RoutingContext context) {
JsonObject body = context.body().asJsonObject();
if (body == null) {
context.response()
.setStatusCode(400)
.end(new JsonObject().put("error", "Corps de la requête manquant").encode());
return;
}
String name = body.getString("name");
databaseService.pool
.preparedQuery(
"INSERT INTO categories (name) VALUES (?)")
.execute(Tuple.of(name))
.onFailure(e -> {
System.err.println("Erreur de récupération de la BDD :" + e.getMessage());
context.response()
.setStatusCode(500)
.end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
})
.onSuccess(rows -> {
if (rows.rowCount() == 0) {
context.response()
.setStatusCode(404)
.end(new JsonObject().put("error", "Objet non trouvé").encode());
return;
}
context.response()
.putHeader("content-type", "application/json: charset=UTF-8")
.end(new JsonObject().put("success", "La catégorie à bien été ajouté").encode());
return;
});
}
} }

View File

@ -6,7 +6,7 @@ import { useAuth } from "../AuthContext";
function FormNewObject({ isAdmin }) { function FormNewObject({ isAdmin }) {
const { user } = useAuth(); const { user } = useAuth();
const [categorie, setCategorie] = useState({}); const [categorie, setCategorie] = useState();
const [description, setDescription] = useState(""); const [description, setDescription] = useState("");
const [type, setType] = useState(""); const [type, setType] = useState("");
const [location, setLocalisation] = useState(""); const [location, setLocalisation] = useState("");
@ -50,10 +50,18 @@ function FormNewObject({ isAdmin }) {
} }
} }
useEffect(() => { useEffect(() => {
axios.get(`${API_BASE_URL}/getCategories`).then((response) => { axios
setCategorie(response.data); .get(`${API_BASE_URL}/getCategories`)
console.log(response.data); .then((response) => {
}); if (response.data.length === 0) {
console.warn("Aucune catégorie disponible.");
} else {
setCategorie(response.data);
}
})
.catch((error) => {
console.error("Erreur lors de la récupération des catégories :", error);
});
}, []); }, []);
function resetForm() { function resetForm() {
setNom(""); setNom("");
@ -151,7 +159,7 @@ function FormNewObject({ isAdmin }) {
disabled={verif} disabled={verif}
> >
<option value="">-- Sélectionner un type --</option> <option value="">-- Sélectionner un type --</option>
{categorie.map((cat, index) => ( {categorie&&categorie.map((cat, index) => (
<option key={index} value={cat}> <option key={index} value={cat}>
{cat} {cat}
</option> </option>

View File

@ -90,6 +90,17 @@ function Header() {
</Link> </Link>
</li> </li>
)} )}
{(user?.role === "admin")&&(
<li>
<Link
to="/dashboard"
onClick={() => setIsMenuOpen(false)}
className="text-gray-600 hover:text-indigo-600"
>
Administration
</Link>
</li>
)}
<li className="sm:hidden"> <li className="sm:hidden">
<Link <Link
to="/profil" to="/profil"

View File

@ -6,7 +6,7 @@ import AddObject from "../Gestion/AddObject.jsx";
import FormNewObject from "../../components/FormNewObject.jsx"; import FormNewObject from "../../components/FormNewObject.jsx";
function AdminObjet() { function AdminObjet() {
const [categories, setCategories] = useState(["Catégorie 1", "Catégorie 2"]); const [categories, setCategories] = useState();
const [newCategory, setNewCategory] = useState(""); const [newCategory, setNewCategory] = useState("");
const [objects, setObjects] = useState([]); const [objects, setObjects] = useState([]);
@ -19,14 +19,57 @@ function AdminObjet() {
const handleAddCategory = () => { const handleAddCategory = () => {
const trimmed = newCategory.trim(); const trimmed = newCategory.trim();
if (trimmed !== "" && !categories.includes(trimmed)) { if (trimmed !== "" && !categories.includes(trimmed)) {
setCategories([...categories, trimmed]); axios
setNewCategory(""); .post(`${API_BASE_URL}/addCategories`, { name: trimmed })
.then((response) => {
console.log("Catégorie ajoutée :", response.data);
setCategories([...categories, trimmed]);
setNewCategory("");
window.location.reload();
})
.catch((error) => {
console.error("Erreur lors de l'ajout de la catégorie :", error);
});
} }
}; };
const handleDeleteCategory = (categoryToDelete) => { const handleDeleteCategory = (categoryToDelete) => {
setCategories(categories.filter((cat) => cat !== categoryToDelete)); const confirmation = window.confirm(
`Êtes-vous sûr de vouloir supprimer la catégorie "${categoryToDelete}" ? Cette action pourrait impacter des objets.`
);
if (confirmation) {
setCategories(categories.filter((cat) => cat !== categoryToDelete));
axios
.post(`${API_BASE_URL}/deleteCategories`, { name: categoryToDelete })
.then((response) => {
console.log("Catégorie supprimée :", response.data);
window.location.reload();
})
.catch((error) => {
console.error(
"Erreur lors de la suppression de la catégorie :",
error
);
});
} else {
console.log("Suppression annulée.");
}
}; };
useEffect(() => {
axios
.get(`${API_BASE_URL}/getCategories`)
.then((response) => {
if (response.data.length === 0) {
console.warn("Aucune catégorie disponible.");
} else {
setCategories(response.data);
}
})
.catch((error) => {
console.error("Erreur lors de la récupération des catégories :", error);
});
}, []);
const [name, setName] = useState(""); const [name, setName] = useState("");
const [description, setDescription] = useState(""); const [description, setDescription] = useState("");
const [type, setType] = useState(""); const [type, setType] = useState("");
@ -127,20 +170,21 @@ function AdminObjet() {
</button> </button>
</div> </div>
<ul> <ul>
{categories.map((cat, index) => ( {categories &&
<li categories.map((cat, index) => (
key={index} <li
className="flex justify-between items-center border-b border-gray-200 py-2" key={index}
> className="flex justify-between items-center border-b border-gray-200 py-2"
<span>{cat}</span>
<button
onClick={() => handleDeleteCategory(cat)}
className="text-red-600 hover:underline"
> >
Supprimer <span>{cat}</span>
</button> <button
</li> onClick={() => handleDeleteCategory(cat)}
))} className="text-red-600 hover:underline"
>
Supprimer
</button>
</li>
))}
</ul> </ul>
</section> </section>
{/*Formulaire d'ajout d'objet*/} {/*Formulaire d'ajout d'objet*/}

View File

@ -34,31 +34,41 @@ function User() {
}, []); }, []);
const handleDeleteUser = (userId) => { const handleDeleteUser = (userId) => {
const user = users.find((u) => u.id === userId); const user = users.find((u) => u.id === userId);
if (user) { if (user) {
axios const confirmation = window.confirm(
.post(`${API_BASE_URL}/deleteUser`, { `Êtes-vous sûr de vouloir supprimer l'utilisateur "${user.name}" ? Cette action pourrait entraîner la suppression des objets associés.`
id: userId, );
}) if (confirmation) {
.then((response) => { axios
alert("L'utilisateur à bien été supprimé !"); .post(`${API_BASE_URL}/deleteUser`, {
console.log("L'utilisateur à été supprimé :", response.data); id: userId,
window.location.reload(); })
}) .then((response) => {
.catch((error) => { alert("L'utilisateur a bien été supprimé !");
console.error( console.log("L'utilisateur a été supprimé :", response.data);
"Erreur lors de la suppression de l'utilisateur :", window.location.reload();
error })
); .catch((error) => {
}); console.error(
logAction(user.name, "Utilisateur supprimé"); "Erreur lors de la suppression de l'utilisateur :",
error
);
});
logAction(user.name, "Utilisateur supprimé");
setUsers(users.filter((u) => u.id !== userId));
} else {
console.log("Suppression annulée");
}
} }
setUsers(users.filter((u) => u.id !== userId));
}; };
const handleChangeAccessLevel = (userId, newLevel) => { const handleChangeAccessLevel = (userId, newLevel) => {
setUsers( setUsers(
users.map((user) => { users.map((user) => {
if (user.id === userId && newLevel!=user.role) { if (user.id === userId && newLevel != user.role) {
const oldLevel = user.role; const oldLevel = user.role;
user.role = newLevel; user.role = newLevel;
/*ToDO*/ /*ToDO*/