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("/publicUser").handler(queryUsers::getPublicUser);
router.get("/getCategories").handler(queryObjects::getCategories);
router.post("/addCategories").handler(setObjects::newCategorie);
router.post("/deleteCategories").handler(setObjects::deleteCategories);
// Routes d'authentification
router.post("/signup").handler(authHandler::handleSignup);
router.post("/login").handler(authHandler::handleLogin);

View File

@ -42,7 +42,7 @@ public class QueryObjects {
public void getCategories(RoutingContext context) {
databaseService.pool
.query("SELECT DISTINCT type FROM weather_objects;")
.query("SELECT name FROM categories;")
.execute()
.onFailure(e -> {
System.err.println("Erreur de récupération de la BDD :" + e.getMessage());
@ -51,8 +51,15 @@ public class QueryObjects {
.end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
})
.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();
rows.forEach(row -> types.add(row.getString("type")));
rows.forEach(row -> types.add(row.getString("name")));
context.response()
.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) {
JsonObject body = context.body().asJsonObject();
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 }) {
const { user } = useAuth();
const [categorie, setCategorie] = useState({});
const [categorie, setCategorie] = useState();
const [description, setDescription] = useState("");
const [type, setType] = useState("");
const [location, setLocalisation] = useState("");
@ -50,9 +50,17 @@ function FormNewObject({ isAdmin }) {
}
}
useEffect(() => {
axios.get(`${API_BASE_URL}/getCategories`).then((response) => {
axios
.get(`${API_BASE_URL}/getCategories`)
.then((response) => {
if (response.data.length === 0) {
console.warn("Aucune catégorie disponible.");
} else {
setCategorie(response.data);
console.log(response.data);
}
})
.catch((error) => {
console.error("Erreur lors de la récupération des catégories :", error);
});
}, []);
function resetForm() {
@ -151,7 +159,7 @@ function FormNewObject({ isAdmin }) {
disabled={verif}
>
<option value="">-- Sélectionner un type --</option>
{categorie.map((cat, index) => (
{categorie&&categorie.map((cat, index) => (
<option key={index} value={cat}>
{cat}
</option>

View File

@ -90,6 +90,17 @@ function Header() {
</Link>
</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">
<Link
to="/profil"

View File

@ -6,7 +6,7 @@ import AddObject from "../Gestion/AddObject.jsx";
import FormNewObject from "../../components/FormNewObject.jsx";
function AdminObjet() {
const [categories, setCategories] = useState(["Catégorie 1", "Catégorie 2"]);
const [categories, setCategories] = useState();
const [newCategory, setNewCategory] = useState("");
const [objects, setObjects] = useState([]);
@ -19,14 +19,57 @@ function AdminObjet() {
const handleAddCategory = () => {
const trimmed = newCategory.trim();
if (trimmed !== "" && !categories.includes(trimmed)) {
axios
.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 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 [description, setDescription] = useState("");
const [type, setType] = useState("");
@ -127,7 +170,8 @@ function AdminObjet() {
</button>
</div>
<ul>
{categories.map((cat, index) => (
{categories &&
categories.map((cat, index) => (
<li
key={index}
className="flex justify-between items-center border-b border-gray-200 py-2"

View File

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