Ajout de la gestion des users et des catégories dans la partie admin
This commit is contained in:
parent
72d3211d5e
commit
40eb0c207c
@ -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);
|
||||||
|
|||||||
@ -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,8 +51,15 @@ 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")
|
||||||
|
|||||||
@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,9 +50,17 @@ function FormNewObject({ isAdmin }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
useEffect(() => {
|
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);
|
setCategorie(response.data);
|
||||||
console.log(response.data);
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("Erreur lors de la récupération des catégories :", error);
|
||||||
});
|
});
|
||||||
}, []);
|
}, []);
|
||||||
function resetForm() {
|
function resetForm() {
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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)) {
|
||||||
|
axios
|
||||||
|
.post(`${API_BASE_URL}/addCategories`, { name: trimmed })
|
||||||
|
.then((response) => {
|
||||||
|
console.log("Catégorie ajoutée :", response.data);
|
||||||
setCategories([...categories, trimmed]);
|
setCategories([...categories, trimmed]);
|
||||||
setNewCategory("");
|
setNewCategory("");
|
||||||
|
window.location.reload();
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("Erreur lors de l'ajout de la catégorie :", error);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const handleDeleteCategory = (categoryToDelete) => {
|
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));
|
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,7 +170,8 @@ function AdminObjet() {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
{categories.map((cat, index) => (
|
{categories &&
|
||||||
|
categories.map((cat, index) => (
|
||||||
<li
|
<li
|
||||||
key={index}
|
key={index}
|
||||||
className="flex justify-between items-center border-b border-gray-200 py-2"
|
className="flex justify-between items-center border-b border-gray-200 py-2"
|
||||||
|
|||||||
@ -34,14 +34,19 @@ 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) {
|
||||||
|
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
|
axios
|
||||||
.post(`${API_BASE_URL}/deleteUser`, {
|
.post(`${API_BASE_URL}/deleteUser`, {
|
||||||
id: userId,
|
id: userId,
|
||||||
})
|
})
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
alert("L'utilisateur à bien été supprimé !");
|
alert("L'utilisateur a bien été supprimé !");
|
||||||
console.log("L'utilisateur à été supprimé :", response.data);
|
console.log("L'utilisateur a été supprimé :", response.data);
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
@ -50,15 +55,20 @@ function User() {
|
|||||||
error
|
error
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
logAction(user.name, "Utilisateur supprimé");
|
logAction(user.name, "Utilisateur supprimé");
|
||||||
}
|
|
||||||
setUsers(users.filter((u) => u.id !== userId));
|
setUsers(users.filter((u) => u.id !== userId));
|
||||||
|
} else {
|
||||||
|
console.log("Suppression annulée");
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
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*/
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user