Demande suppression admin

This commit is contained in:
Charles Mendiburu 2025-04-13 11:56:49 +02:00
parent 090da8c055
commit 63f945dcf0
4 changed files with 643 additions and 7 deletions

View File

@ -44,6 +44,7 @@ public class MainVerticle extends AbstractVerticle {
setObjects.setUserHandler(setUser);
queryObjects.setUserHandler(setUser);
setWeatherData.setUserHandler(setUser);
QueryDeleteObject RequestDeleteObject = new QueryDeleteObject(databaseService);
// Déclaration des routes
@ -66,6 +67,9 @@ public class MainVerticle extends AbstractVerticle {
router.get("/getCategories").handler(queryObjects::getCategories);
router.post("/addCategories").handler(setObjects::newCategorie);
router.post("/deleteCategories").handler(setObjects::deleteCategories);
router.post("/requestDeleteObject").handler(RequestDeleteObject::deleteObject);
// Routes d'authentification
router.post("/signup").handler(authHandler::handleSignup);

View File

@ -0,0 +1,64 @@
package com.example.starter;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Tuple;
public class QueryDeleteObject {
private DatabaseService databaseService;
public QueryDeleteObject(DatabaseService dtbS) {
this.databaseService = dtbS;
}
public void deleteObject(RoutingContext context) {
JsonObject body = context.body().asJsonObject();
if (body == null) {
context.response().setStatusCode(400).end(new JsonObject().put("error", "Requête invalide").encode());
return;
}
// Lecture des paramètres
Integer objectId = body.getInteger("object_id");
Integer userId = body.getInteger("requested_by");
System.out.println("Body reçu : " + body.encode());
System.out.println("objectId = " + objectId + ", userId = " + userId);
if (objectId == null || userId == null) {
context.response().setStatusCode(400).end(new JsonObject().put("error", "Champs manquants").encode());
return;
}
// Vérification si l'objet existe
String checkQuery = "SELECT id FROM weather_objects WHERE id = ?";
databaseService.pool.preparedQuery(checkQuery).execute(Tuple.of(objectId), res -> {
if (res.failed()) {
res.cause().printStackTrace(); // Affiche l'erreur SQL s'il y en a une
context.response().setStatusCode(500).end(new JsonObject().put("error", "Erreur base de données").encode());
return;
}
if (res.result().rowCount() == 0) {
context.response().setStatusCode(404).end(new JsonObject().put("error", "Objet non trouvé").encode());
return;
}
// Insertion simple (pas de vérif doublon pour linstant)
String checkDuplicate = "SELECT 1 FROM deletion_requests WHERE object_id = ? AND requested_by = ?";
String insertQuery = "INSERT INTO deletion_requests (object_id, requested_by) VALUES (?, ?)";
databaseService.pool.preparedQuery(insertQuery).execute(Tuple.of(objectId, userId), insertRes -> {
if (insertRes.succeeded()) {
context.response().setStatusCode(200).end(new JsonObject().put("message", "Demande envoyée").encode());
} else {
insertRes.cause().printStackTrace(); // Pour voir l'erreur en console
context.response().setStatusCode(500).end(new JsonObject().put("error", "Erreur insertion").encode());
}
});
});
}
}

View File

@ -1,5 +1,5 @@
import React from "react";
import { Search, ArrowRight, RadioTower, Plus } from "lucide-react";
import { Search, ArrowRight, RadioTower, Plus, Trash } from "lucide-react";
import { useEffect, useState } from "react";
import axios from "axios";
import { API_BASE_URL } from "../../config";
@ -32,6 +32,41 @@ function ObjectManagement() {
setObjects(response.data);
});
}, []);
const handleRequestDeletion = async (objectId) => {
console.log("Demande de suppression pour l'objet", objectId);
try {
// Log des données envoyées
console.log("Envoi de la requête:", {
object_id: objectId,
requested_by: user.id,
});
const response = await axios.post(
`${API_BASE_URL}/requestDeleteObject`,
{
object_id: objectId,
requested_by: user.id,
},
{
headers: {
"Content-Type": "application/json", // Pas d'Authorization
},
}
);
console.log("Réponse du serveur:", response.data);
alert("Demande de suppression envoyée à l'administrateur.");
} catch (error) {
console.error("Erreur lors de la requête :", error.response?.data || error.message);
alert("Erreur lors de la demande.");
}
};
return (
<div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-50">
@ -141,12 +176,23 @@ function ObjectManagement() {
</div>
<h3 className="text-xl font-semibold mb-2">{object.name}</h3>
<p className="text-gray-600 mb-4">{object.description}</p>
<a
href={`/objet?id=${object.id}`}
className="flex items-center text-indigo-600 hover:text-indigo-700"
>
Plus d'infos <ArrowRight size={16} className="ml-2" />
</a>
<div className="flex items-center justify-between mt-4">
<a
href={`/objet?id=${object.id}`}
className="flex items-center text-indigo-600 hover:text-indigo-700"
>
Plus d'infos <ArrowRight size={16} className="ml-2" />
</a>
{user?.role !== "user" && (
<button
onClick={() => handleRequestDeletion(object.id)}
className="text-red-500 hover:text-red-700"
title="Supprimer l'objet"
>
<Trash size={20} />
</button>
)}
</div>
</div>
))
)}

522
sql/export1.sql Normal file
View File

@ -0,0 +1,522 @@
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.8 (Ubuntu 16.8-0ubuntu0.24.04.1)
-- Dumped by pg_dump version 16.8 (Ubuntu 16.8-0ubuntu0.24.04.1)
-- Started on 2025-04-13 11:04:16 CEST
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- TOC entry 223 (class 1259 OID 16527)
-- Name: categories; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.categories (
id integer NOT NULL,
name text NOT NULL
);
ALTER TABLE public.categories OWNER TO postgres;
--
-- TOC entry 222 (class 1259 OID 16526)
-- Name: categories_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.categories_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.categories_id_seq OWNER TO postgres;
--
-- TOC entry 3502 (class 0 OID 0)
-- Dependencies: 222
-- Name: categories_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.categories_id_seq OWNED BY public.categories.id;
--
-- TOC entry 225 (class 1259 OID 16573)
-- Name: deletion_requests; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.deletion_requests (
id integer NOT NULL,
object_id integer NOT NULL,
requested_by integer NOT NULL,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
status character varying(20) DEFAULT 'pending'::character varying
);
ALTER TABLE public.deletion_requests OWNER TO postgres;
--
-- TOC entry 224 (class 1259 OID 16572)
-- Name: deletion_requests_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.deletion_requests_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.deletion_requests_id_seq OWNER TO postgres;
--
-- TOC entry 3503 (class 0 OID 0)
-- Dependencies: 224
-- Name: deletion_requests_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.deletion_requests_id_seq OWNED BY public.deletion_requests.id;
--
-- TOC entry 215 (class 1259 OID 16468)
-- Name: range_data; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.range_data (
station_id integer NOT NULL,
temperature_min numeric,
temperature_max numeric,
pressure_min numeric,
pressure_max numeric,
humidity_min numeric,
humidity_max numeric
);
ALTER TABLE public.range_data OWNER TO postgres;
--
-- TOC entry 219 (class 1259 OID 16502)
-- Name: users; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.users (
id integer NOT NULL,
name character varying(50) NOT NULL,
surname character varying(50) NOT NULL,
email character varying(100) NOT NULL,
gender character varying(10) NOT NULL,
password text NOT NULL,
created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
points integer DEFAULT 0,
CONSTRAINT users_gender_check CHECK (((gender)::text = ANY ((ARRAY['homme'::character varying, 'femme'::character varying])::text[])))
);
ALTER TABLE public.users OWNER TO postgres;
--
-- TOC entry 218 (class 1259 OID 16501)
-- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.users_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.users_id_seq OWNER TO postgres;
--
-- TOC entry 3504 (class 0 OID 0)
-- Dependencies: 218
-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id;
--
-- TOC entry 221 (class 1259 OID 16524)
-- Name: weather_data_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.weather_data_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.weather_data_id_seq OWNER TO postgres;
--
-- TOC entry 216 (class 1259 OID 16473)
-- Name: weather_data; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.weather_data (
id integer DEFAULT nextval('public.weather_data_id_seq'::regclass) NOT NULL,
station_id integer NOT NULL,
temperature numeric(5,2),
humidity numeric(5,2),
pressure numeric(7,2),
wind_speed numeric(5,2),
wind_direction character varying(50),
"timestamp" timestamp without time zone DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE public.weather_data OWNER TO postgres;
--
-- TOC entry 220 (class 1259 OID 16522)
-- Name: weather_objects_id_seq1; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.weather_objects_id_seq1
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.weather_objects_id_seq1 OWNER TO postgres;
--
-- TOC entry 217 (class 1259 OID 16477)
-- Name: weather_objects; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.weather_objects (
id integer DEFAULT nextval('public.weather_objects_id_seq1'::regclass) NOT NULL,
name character varying(500) NOT NULL,
description text,
type character varying(100) NOT NULL,
location character varying(255),
last_update timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
status character varying(50) DEFAULT 'active'::character varying,
batterie integer,
type_batterie character varying(50),
proprio_id integer,
CONSTRAINT weather_objects_batterie_check CHECK (((batterie >= 0) AND (batterie <= 100)))
);
ALTER TABLE public.weather_objects OWNER TO postgres;
--
-- TOC entry 3317 (class 2604 OID 16530)
-- Name: categories id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.categories ALTER COLUMN id SET DEFAULT nextval('public.categories_id_seq'::regclass);
--
-- TOC entry 3318 (class 2604 OID 16576)
-- Name: deletion_requests id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.deletion_requests ALTER COLUMN id SET DEFAULT nextval('public.deletion_requests_id_seq'::regclass);
--
-- TOC entry 3314 (class 2604 OID 16505)
-- Name: users id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass);
--
-- TOC entry 3494 (class 0 OID 16527)
-- Dependencies: 223
-- Data for Name: categories; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.categories (id, name) FROM stdin;
1 Station météo
2 Capteur
3 Passerelle
4 Anémomètre
5 Pluviomètre
6 Thermomètre
7 Hygromètre
\.
--
-- TOC entry 3496 (class 0 OID 16573)
-- Dependencies: 225
-- Data for Name: deletion_requests; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.deletion_requests (id, object_id, requested_by, created_at, status) FROM stdin;
1 2 1 2025-04-13 10:45:55.942399 pending
\.
--
-- TOC entry 3486 (class 0 OID 16468)
-- Dependencies: 215
-- Data for Name: range_data; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.range_data (station_id, temperature_min, temperature_max, pressure_min, pressure_max, humidity_min, humidity_max) FROM stdin;
1 -33 42 980 1040 30 84
2 -15 50 980 1040 30 90
3 -15 50 980 1040 30 90
4 -15 50 980 1040 30 90
5 -15 50 980 1040 30 90
6 -15 50 980 1040 30 90
7 -15 50 980 1040 30 90
8 -15 50 980 1040 30 90
9 -15 50 980 1040 30 90
10 -15 50 980 1040 30 90
\.
--
-- TOC entry 3490 (class 0 OID 16502)
-- Dependencies: 219
-- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.users (id, name, surname, email, gender, password, created_at, points) FROM stdin;
1 Jean Dupont jean.dupont@example.com homme hashed_password1 2025-03-31 15:15:17.203076 0
2 Marie Curie marie.curie@example.com femme hashed_password2 2025-03-31 15:15:17.203076 0
3 Albert Einstein albert.einstein@example.com homme hashed_password3 2025-03-31 15:15:17.203076 0
4 Alice Lemoine alice@example.com femme $2a$12$QNx7sC7VBXrU7QHFhU78vunLIU3C9KiVT2KyCJ5y6G0cdJB/k0YuC 2025-03-31 16:59:25.687126 0
15 azaz azeazae azeaze@azeaze femme $2a$12$YPEoDDRD/y2Zxh7mfTUWHuCgT9k3OlqwGWBPNpPx2yTSlfY4yHSka 2025-03-31 17:26:18.258471 0
16 El moudden Nassef nassmaghrebi@gmail.com homme $2a$12$f6Ovl48RsbipNNsEBcVjP.DGdCYPaxlHsZ2YexpeHDAXq4UzMK3hm 2025-04-01 15:34:05.987387 0
17 Declos Mathis md10022004@gmail.com homme $2a$12$/PufX/T..YU1Ze3yNYAkU.Ql8VqaBP7vmNXBK1Q8NniEA/Vqi37Qa 2025-04-02 11:12:36.427383 0
19 azeaze azeaze azeaze@aeaze.com femme $2a$12$vH.MxhvC/cJ02SNZSsr9SeHYy.JWoIFLKZGKVhUHLv7b9E1rm3Dam 2025-04-04 10:40:01.71072 0
20 Mendiburu Charles charles@gmail.com homme $2a$12$RPL.17dQ66kyZyfCST2EYePeDd/4iNhpr7hCpfBxJ7cROt/Lx1/zK 2025-04-11 19:06:41.216647 104
18 Mendiburu Charles charles.mendi1609@gmail.com homme $2a$12$PLowdJvo.jsnzbjE9CEccucGPE5XDn9kyn2nmyWWvh8eydT4827CS 2025-04-04 08:51:44.689425 226
\.
--
-- TOC entry 3487 (class 0 OID 16473)
-- Dependencies: 216
-- Data for Name: weather_data; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.weather_data (id, station_id, temperature, humidity, pressure, wind_speed, wind_direction, "timestamp") FROM stdin;
1 1 21.50 60.20 1013.10 5.40 Nord-Ouest 2025-03-29 18:47:46.685241
2 2 22.30 55.00 1012.50 3.20 Sud-Ouest 2025-03-29 18:47:46.685241
3 3 24.10 50.00 1010.80 6.00 Est 2025-03-29 18:47:46.685241
4 1 22.50 65.40 1013.20 5.50 Nord-Ouest 2025-04-12 01:33:17.747529
5 2 19.30 70.10 1012.80 4.70 Sud-Est 2025-04-12 01:33:17.747529
6 2 22.50 65.40 1013.20 5.50 Nord-Ouest 2025-04-12 01:34:04.077375
7 3 19.30 70.10 1012.80 4.70 Sud-Est 2025-04-12 01:34:04.077375
\.
--
-- TOC entry 3488 (class 0 OID 16477)
-- Dependencies: 217
-- Data for Name: weather_objects; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.weather_objects (id, name, description, type, location, last_update, status, batterie, type_batterie, proprio_id) FROM stdin;
2 Station Lyon Station météo située à Lyon, France. station Lyon, France 2025-03-30 12:16:00.835834 active 100 solaire \N
4 Station Alpha Station météo dans le centre-ville station_meteo Paris 2025-04-12 01:32:19.680121 active 80 Li-Ion 1
5 Station Beta Station météo sur la montagne station_meteo Alpes 2025-04-12 01:32:19.680121 active 60 NiMH 2
6 Station Gamma Station météo près de la mer station_meteo Nice 2025-04-12 01:32:19.680121 active 90 Li-Ion 3
1 Station Paris Station météo située à Paris, France. station Paris, France 2025-04-12 01:36:03.306108 inactive 100 solaire \N
3 Station Marseille Station météo située à Marseille, France. station Marseille, France 2025-04-12 01:36:32.314423 active 100 solaire \N
7 Station Meteo Charles Station meteo de charles station meteo Capbreton 2025-04-12 09:29:48.565373 active \N Solaire 18
\.
--
-- TOC entry 3505 (class 0 OID 0)
-- Dependencies: 222
-- Name: categories_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.categories_id_seq', 7, true);
--
-- TOC entry 3506 (class 0 OID 0)
-- Dependencies: 224
-- Name: deletion_requests_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.deletion_requests_id_seq', 1, true);
--
-- TOC entry 3507 (class 0 OID 0)
-- Dependencies: 218
-- Name: users_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.users_id_seq', 20, true);
--
-- TOC entry 3508 (class 0 OID 0)
-- Dependencies: 221
-- Name: weather_data_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.weather_data_id_seq', 7, true);
--
-- TOC entry 3509 (class 0 OID 0)
-- Dependencies: 220
-- Name: weather_objects_id_seq1; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.weather_objects_id_seq1', 7, true);
--
-- TOC entry 3334 (class 2606 OID 16536)
-- Name: categories categories_name_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT categories_name_key UNIQUE (name);
--
-- TOC entry 3336 (class 2606 OID 16534)
-- Name: categories categories_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT categories_pkey PRIMARY KEY (id);
--
-- TOC entry 3338 (class 2606 OID 16580)
-- Name: deletion_requests deletion_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.deletion_requests
ADD CONSTRAINT deletion_requests_pkey PRIMARY KEY (id);
--
-- TOC entry 3324 (class 2606 OID 16486)
-- Name: range_data station_meteo_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.range_data
ADD CONSTRAINT station_meteo_pkey PRIMARY KEY (station_id);
--
-- TOC entry 3330 (class 2606 OID 16514)
-- Name: users users_email_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.users
ADD CONSTRAINT users_email_key UNIQUE (email);
--
-- TOC entry 3332 (class 2606 OID 16512)
-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.users
ADD CONSTRAINT users_pkey PRIMARY KEY (id);
--
-- TOC entry 3326 (class 2606 OID 16488)
-- Name: weather_data weather_data_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.weather_data
ADD CONSTRAINT weather_data_pkey PRIMARY KEY (id);
--
-- TOC entry 3328 (class 2606 OID 16490)
-- Name: weather_objects weather_objects_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.weather_objects
ADD CONSTRAINT weather_objects_pkey PRIMARY KEY (id);
--
-- TOC entry 3341 (class 2606 OID 16586)
-- Name: deletion_requests fk_user; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.deletion_requests
ADD CONSTRAINT fk_user FOREIGN KEY (requested_by) REFERENCES public.users(id) ON DELETE CASCADE;
--
-- TOC entry 3342 (class 2606 OID 16581)
-- Name: deletion_requests fk_weather_object; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.deletion_requests
ADD CONSTRAINT fk_weather_object FOREIGN KEY (object_id) REFERENCES public.weather_objects(id) ON DELETE CASCADE;
--
-- TOC entry 3339 (class 2606 OID 16491)
-- Name: weather_data weather_data_station_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.weather_data
ADD CONSTRAINT weather_data_station_id_fkey FOREIGN KEY (station_id) REFERENCES public.weather_objects(id);
--
-- TOC entry 3340 (class 2606 OID 16517)
-- Name: weather_objects weather_objects_proprio_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.weather_objects
ADD CONSTRAINT weather_objects_proprio_id_fkey FOREIGN KEY (proprio_id) REFERENCES public.users(id) ON DELETE CASCADE;
-- Completed on 2025-04-13 11:04:16 CEST
--
-- PostgreSQL database dump complete
--