From a94b343f660fb385c7c3fc9ffac71ea33081ae02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lotten?= Date: Thu, 13 Nov 2025 13:03:08 +0100 Subject: [PATCH 01/18] build: Add webclient dependencie --- flyway.conf | 4 ++++ pom.xml | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 flyway.conf diff --git a/flyway.conf b/flyway.conf new file mode 100644 index 0000000..be3336f --- /dev/null +++ b/flyway.conf @@ -0,0 +1,4 @@ +flyway.url=jdbc:postgresql://185.166.39.209:5432/vlib_db +flyway.user=vlibadmin +flyway.password=T5tUb8DTh2dtMaRymzMyRKwT5kg3xqamdZJjqkLr +flyway.locations=filesystem:src/main/resources/db/migration \ No newline at end of file diff --git a/pom.xml b/pom.xml index 70f2782..cf02062 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,10 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-webflux + org.postgresql postgresql From 7032842a6e0a9bd8cf59589dbc9b16f0d5a8e06e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lotten?= Date: Sun, 30 Nov 2025 12:04:26 +0100 Subject: [PATCH 02/18] feat: add WebClient confifuration for external api vlib --- .../host_dcode/vlib/config/WebClientConfig.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java diff --git a/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java b/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java new file mode 100644 index 0000000..d10fe34 --- /dev/null +++ b/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java @@ -0,0 +1,15 @@ +package fr.host_dcode.vlib.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebClientConfig { + @Bean + public WebClient webClient(){ + return WebClient.builder() + .baseUrl("https://opendata.paris.fr/api/records/1.0/search/") + .build(); + } +} From 7dcf1017a4fe1d4b75ec5b99e52bdf1aed66d23d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lotten?= Date: Sun, 30 Nov 2025 15:26:06 +0100 Subject: [PATCH 03/18] feat: add DTO classes in model folder for parsing API data --- .../vlib/model/VelibApiResponse.java | 17 ++++ .../fr/host_dcode/vlib/model/VelibFields.java | 33 ++++++++ .../fr/host_dcode/vlib/model/VelibRecord.java | 23 +++++ .../vlib/repository/StationRepository.java | 10 +++ .../host_dcode/vlib/service/VelibService.java | 83 +++++++++++++++++++ 5 files changed, 166 insertions(+) create mode 100644 src/main/java/fr/host_dcode/vlib/model/VelibApiResponse.java create mode 100644 src/main/java/fr/host_dcode/vlib/model/VelibFields.java create mode 100644 src/main/java/fr/host_dcode/vlib/model/VelibRecord.java create mode 100644 src/main/java/fr/host_dcode/vlib/repository/StationRepository.java create mode 100644 src/main/java/fr/host_dcode/vlib/service/VelibService.java diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibApiResponse.java b/src/main/java/fr/host_dcode/vlib/model/VelibApiResponse.java new file mode 100644 index 0000000..e9f61c8 --- /dev/null +++ b/src/main/java/fr/host_dcode/vlib/model/VelibApiResponse.java @@ -0,0 +1,17 @@ +package fr.host_dcode.vlib.model; + +import java.util.List; + +public class VelibApiResponse { + + private List records; + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java new file mode 100644 index 0000000..0d4d73f --- /dev/null +++ b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java @@ -0,0 +1,33 @@ +package fr.host_dcode.vlib.model; + +import java.time.ZonedDateTime; +import java.util.List; + + +public class VelibFields { + + private String recordId; + private String name; + private String station_code; + private String city; + private List coordonnees_geo; + private ZonedDateTime duedate; + + + public String getName(){ + return this.name; + } + public String getStation_code(){ + return this.station_code; + } + + public String getDuedate(){ + return this.duedate.toString(); + } + + public List getCoordonnees_geo(){ + return this.coordonnees_geo; + } + + +} \ No newline at end of file diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java new file mode 100644 index 0000000..5cab498 --- /dev/null +++ b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java @@ -0,0 +1,23 @@ +package fr.host_dcode.vlib.model; + +public class VelibRecord { + + private VelibFields fields; + public String recordId; + + public VelibFields getFields() { + return fields; + } + + public void setFields(VelibFields fields) { + this.fields = fields; + } + + public String getRecordId(){ + return this.recordId; + } + public void setRecordId(String recordid) { + this.recordId = recordid; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java b/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java new file mode 100644 index 0000000..2cb7400 --- /dev/null +++ b/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java @@ -0,0 +1,10 @@ +package fr.host_dcode.vlib.repository; + +import fr.host_dcode.vlib.model.Station; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StationRepository extends JpaRepository { + +} diff --git a/src/main/java/fr/host_dcode/vlib/service/VelibService.java b/src/main/java/fr/host_dcode/vlib/service/VelibService.java new file mode 100644 index 0000000..e8dccc0 --- /dev/null +++ b/src/main/java/fr/host_dcode/vlib/service/VelibService.java @@ -0,0 +1,83 @@ +package fr.host_dcode.vlib.service; + +import fr.host_dcode.vlib.model.Station; +import fr.host_dcode.vlib.model.VelibApiResponse; +import fr.host_dcode.vlib.model.VelibFields; +import fr.host_dcode.vlib.repository.StationRepository; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class VelibService { + public final WebClient webClient; + private final StationRepository stationRepository; + + public VelibService(WebClient webClient, StationRepository stationRepository) { + this.webClient = webClient; + this.stationRepository = stationRepository; + } + + public List fetchAndSaveVelibData() { + + String queryUri = "?dataset=velib-disponibilite-en-temps-reel&rows=50"; + + VelibApiResponse apiResponse = webClient.get() + .uri(queryUri) + .retrieve() + .bodyToMono(VelibApiResponse.class) + .block(); + + if (apiResponse == null || apiResponse.getRecords() == null || apiResponse.getRecords().isEmpty()) { + System.out.println("Aucune donnée Velib reçue."); + return List.of(); + } + + List stationsToSave = apiResponse.getRecords().stream() + .map(record -> { + VelibFields fields = record.getFields(); + + List coords = fields.getCoordonnees_geo(); + double latitude = (coords != null && coords.size() >= 1) ? coords.get(0) : 0.0; + double longitude = (coords != null && coords.size() >= 2) ? coords.get(1) : 0.0; + + String description = fields.getName() + ". Dernière mise à jour: " + fields.getDuedate(); + + Station station = new Station( + fields.getName(), + record.getRecordId(), + fields.getStation_code(), + latitude, + longitude, + description + ); + + return station; + }) + .collect(Collectors.toList()); + + if (!stationsToSave.isEmpty()) { + System.out.println("Tentative d'enregistrement de " + stationsToSave.size() + " stations."); + return stationRepository.saveAll(stationsToSave); + } + + return List.of(); + } + + + @EventListener(ApplicationReadyEvent.class) + public void runAfterStartup() { + System.out.println("🚀 Démarrage de l'application détecté. Lancement de la récupération des données Velib..."); + + try { + fetchAndSaveVelibData(); + System.out.println("✅ Récupération et sauvegarde initiales terminées."); + } catch (Exception e) { + System.err.println("❌ Erreur critique lors de la récupération initiale des données Velib : " + e.getMessage()); + } + } +} \ No newline at end of file From 705108b11dd811c205cff5231e565374c12931ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lotten?= Date: Sun, 30 Nov 2025 15:30:00 +0100 Subject: [PATCH 04/18] feat: Create new migration file to add recordId column in station table --- .../V2__Alter_table_station_to_add_recordId_column.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/resources/db/migration/V2__Alter_table_station_to_add_recordId_column.sql diff --git a/src/main/resources/db/migration/V2__Alter_table_station_to_add_recordId_column.sql b/src/main/resources/db/migration/V2__Alter_table_station_to_add_recordId_column.sql new file mode 100644 index 0000000..52033f8 --- /dev/null +++ b/src/main/resources/db/migration/V2__Alter_table_station_to_add_recordId_column.sql @@ -0,0 +1,2 @@ +ALTER TABLE station + ADD COLUMN recordId VARCHAR(100) NOT NULL; \ No newline at end of file From 37bb96a97ea081c671bef91b3cc40fd84a55f4ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lotten?= Date: Sun, 30 Nov 2025 20:16:31 +0100 Subject: [PATCH 05/18] feat: add station filter to verify if stations are already in db --- .../fr/host_dcode/vlib/model/Station.java | 29 +++++++++---------- .../fr/host_dcode/vlib/model/VelibFields.java | 9 ++++++ .../fr/host_dcode/vlib/model/VelibRecord.java | 4 +++ .../vlib/repository/StationRepository.java | 2 ++ .../host_dcode/vlib/service/VelibService.java | 25 +++++++++------- ...es_users_and_station_to_change_id_type.sql | 6 ++++ ...Delete_address_column_in_table_station.sql | 2 ++ 7 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 src/main/resources/db/migration/V3__Alter_tables_users_and_station_to_change_id_type.sql create mode 100644 src/main/resources/db/migration/V4__Delete_address_column_in_table_station.sql diff --git a/src/main/java/fr/host_dcode/vlib/model/Station.java b/src/main/java/fr/host_dcode/vlib/model/Station.java index 1859b59..8535526 100644 --- a/src/main/java/fr/host_dcode/vlib/model/Station.java +++ b/src/main/java/fr/host_dcode/vlib/model/Station.java @@ -1,10 +1,8 @@ package fr.host_dcode.vlib.model; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; +import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDateTime; @@ -13,30 +11,34 @@ public class Station { @Id @GeneratedValue(strategy = GenerationType.UUID) private String id; + @Column(name = "recordid") private String recordId; private String name; - private String station_code; + @Column(name = "station_code") + private String stationCode; private double latitude; private double longitude; - private String address; private String city; private String description; + @CreationTimestamp + @Column(name = "last_update") private LocalDateTime last_update; public Station(){} - public Station(String name, String recordId, String stationCode, double latitude, double longitude, String description) { + public Station(String name, String recordId, String stationCode,String city, double latitude, double longitude, String description) { this.name = name; this.recordId = recordId; - this.station_code = stationCode; + this.stationCode = stationCode; + this.city = city; this.latitude = latitude; this.longitude = longitude; this.description = description; } public String getStationCode(){ - return this.station_code; + return this.stationCode; } public String getName(){ @@ -65,13 +67,10 @@ public Double getLongitude(){ return this.longitude; } - public String getAddress(){ - return this.address; - } - - public void setAddress(String address){ - this.address = address; + public String getCity(){ + return this.city; } + public void setCity(String city){} } diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java index 0d4d73f..145abf7 100644 --- a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java +++ b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java @@ -1,14 +1,19 @@ package fr.host_dcode.vlib.model; +import com.fasterxml.jackson.annotation.JsonProperty; + import java.time.ZonedDateTime; import java.util.List; public class VelibFields { + @JsonProperty("recordid") private String recordId; private String name; + @JsonProperty("stationcode") private String station_code; + @JsonProperty("nom_arrondissement_communes") private String city; private List coordonnees_geo; private ZonedDateTime duedate; @@ -29,5 +34,9 @@ public List getCoordonnees_geo(){ return this.coordonnees_geo; } + public String getCity(){ + return this.city; + } + } \ No newline at end of file diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java index 5cab498..709f062 100644 --- a/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java +++ b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java @@ -1,8 +1,11 @@ package fr.host_dcode.vlib.model; +import com.fasterxml.jackson.annotation.JsonProperty; + public class VelibRecord { private VelibFields fields; + @JsonProperty("recordid") public String recordId; public VelibFields getFields() { @@ -16,6 +19,7 @@ public void setFields(VelibFields fields) { public String getRecordId(){ return this.recordId; } + public void setRecordId(String recordid) { this.recordId = recordid; } diff --git a/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java b/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java index 2cb7400..e688e35 100644 --- a/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java +++ b/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java @@ -7,4 +7,6 @@ @Repository public interface StationRepository extends JpaRepository { + Station findByStationCode(String stationCode); + } diff --git a/src/main/java/fr/host_dcode/vlib/service/VelibService.java b/src/main/java/fr/host_dcode/vlib/service/VelibService.java index e8dccc0..c727cda 100644 --- a/src/main/java/fr/host_dcode/vlib/service/VelibService.java +++ b/src/main/java/fr/host_dcode/vlib/service/VelibService.java @@ -22,7 +22,7 @@ public VelibService(WebClient webClient, StationRepository stationRepository) { this.stationRepository = stationRepository; } - public List fetchAndSaveVelibData() { + public void fetchAndSaveVelibData() { String queryUri = "?dataset=velib-disponibilite-en-temps-reel&rows=50"; @@ -34,10 +34,10 @@ public List fetchAndSaveVelibData() { if (apiResponse == null || apiResponse.getRecords() == null || apiResponse.getRecords().isEmpty()) { System.out.println("Aucune donnée Velib reçue."); - return List.of(); + return; } - List stationsToSave = apiResponse.getRecords().stream() + apiResponse.getRecords().stream() .map(record -> { VelibFields fields = record.getFields(); @@ -51,6 +51,7 @@ public List fetchAndSaveVelibData() { fields.getName(), record.getRecordId(), fields.getStation_code(), + fields.getCity(), latitude, longitude, description @@ -58,14 +59,16 @@ public List fetchAndSaveVelibData() { return station; }) - .collect(Collectors.toList()); - - if (!stationsToSave.isEmpty()) { - System.out.println("Tentative d'enregistrement de " + stationsToSave.size() + " stations."); - return stationRepository.saveAll(stationsToSave); - } - - return List.of(); + .forEach(station ->{ + Station existingStation = stationRepository.findByStationCode(station.getStationCode()); + if(existingStation == null){ + stationRepository.save(station); + } else { + existingStation.setName(station.getName()); + //AJOUTER TOUTES LES MAJS + stationRepository.save(existingStation); + } + }); } diff --git a/src/main/resources/db/migration/V3__Alter_tables_users_and_station_to_change_id_type.sql b/src/main/resources/db/migration/V3__Alter_tables_users_and_station_to_change_id_type.sql new file mode 100644 index 0000000..7044121 --- /dev/null +++ b/src/main/resources/db/migration/V3__Alter_tables_users_and_station_to_change_id_type.sql @@ -0,0 +1,6 @@ +ALTER TABLE users +ALTER COLUMN id TYPE VARCHAR(40) USING id::VARCHAR(40); + + +ALTER TABLE station +ALTER COLUMN id TYPE VARCHAR(40) USING id::VARCHAR(40); \ No newline at end of file diff --git a/src/main/resources/db/migration/V4__Delete_address_column_in_table_station.sql b/src/main/resources/db/migration/V4__Delete_address_column_in_table_station.sql new file mode 100644 index 0000000..1c111e0 --- /dev/null +++ b/src/main/resources/db/migration/V4__Delete_address_column_in_table_station.sql @@ -0,0 +1,2 @@ +ALTER TABLE station +DROP COLUMN address; \ No newline at end of file From b10ff534f3c403549bd473a1f6b9ab019154a634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lotten?= Date: Mon, 1 Dec 2025 22:48:51 +0100 Subject: [PATCH 06/18] fix: Apply changes of open conversation in pr --- src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java | 5 ++++- src/main/java/fr/host_dcode/vlib/model/VelibRecord.java | 2 +- .../fr/host_dcode/vlib/repository/StationRepository.java | 2 +- src/main/java/fr/host_dcode/vlib/service/VelibService.java | 5 ++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java b/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java index d10fe34..755811e 100644 --- a/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java +++ b/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java @@ -1,15 +1,18 @@ package fr.host_dcode.vlib.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { + @Value("${velib.api.base-url}") + private String baseUrl; @Bean public WebClient webClient(){ return WebClient.builder() - .baseUrl("https://opendata.paris.fr/api/records/1.0/search/") + .baseUrl(baseUrl) .build(); } } diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java index 709f062..9dc782a 100644 --- a/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java +++ b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java @@ -6,7 +6,7 @@ public class VelibRecord { private VelibFields fields; @JsonProperty("recordid") - public String recordId; + private String recordId; public VelibFields getFields() { return fields; diff --git a/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java b/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java index e688e35..7c334f9 100644 --- a/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java +++ b/src/main/java/fr/host_dcode/vlib/repository/StationRepository.java @@ -7,6 +7,6 @@ @Repository public interface StationRepository extends JpaRepository { - Station findByStationCode(String stationCode); + Station findByStationCode(String station_code); } diff --git a/src/main/java/fr/host_dcode/vlib/service/VelibService.java b/src/main/java/fr/host_dcode/vlib/service/VelibService.java index c727cda..094d5aa 100644 --- a/src/main/java/fr/host_dcode/vlib/service/VelibService.java +++ b/src/main/java/fr/host_dcode/vlib/service/VelibService.java @@ -10,7 +10,6 @@ import org.springframework.web.reactive.function.client.WebClient; import java.util.List; -import java.util.stream.Collectors; @Service public class VelibService { @@ -45,7 +44,7 @@ public void fetchAndSaveVelibData() { double latitude = (coords != null && coords.size() >= 1) ? coords.get(0) : 0.0; double longitude = (coords != null && coords.size() >= 2) ? coords.get(1) : 0.0; - String description = fields.getName() + ". Dernière mise à jour: " + fields.getDuedate(); + String description = fields.getName() + ". Dernière mise à jour: " + (fields.getDuedate() != null ? fields.getDuedate() : "inconnue"); Station station = new Station( fields.getName(), @@ -65,7 +64,7 @@ public void fetchAndSaveVelibData() { stationRepository.save(station); } else { existingStation.setName(station.getName()); - //AJOUTER TOUTES LES MAJS + //ADD ALL UPDATES stationRepository.save(existingStation); } }); From 7313bad880ced310b3dffacb64a0279fbead2117 Mon Sep 17 00:00:00 2001 From: DCodeProg <130582816+DCodeProg@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:17:07 +0100 Subject: [PATCH 07/18] chore: make VelibService webClient private Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DCodeProg <130582816+DCodeProg@users.noreply.github.com> --- src/main/java/fr/host_dcode/vlib/service/VelibService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/host_dcode/vlib/service/VelibService.java b/src/main/java/fr/host_dcode/vlib/service/VelibService.java index 094d5aa..cc05161 100644 --- a/src/main/java/fr/host_dcode/vlib/service/VelibService.java +++ b/src/main/java/fr/host_dcode/vlib/service/VelibService.java @@ -13,7 +13,7 @@ @Service public class VelibService { - public final WebClient webClient; + private final WebClient webClient; private final StationRepository stationRepository; public VelibService(WebClient webClient, StationRepository stationRepository) { From 5f25c29585b6475cc31e080224935b8bdee71fc8 Mon Sep 17 00:00:00 2001 From: DCodeProg <130582816+DCodeProg@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:18:14 +0100 Subject: [PATCH 08/18] fix: add null check to duedate.toStringMethod Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DCodeProg <130582816+DCodeProg@users.noreply.github.com> --- src/main/java/fr/host_dcode/vlib/model/VelibFields.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java index 145abf7..90af0b5 100644 --- a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java +++ b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java @@ -27,7 +27,7 @@ public String getStation_code(){ } public String getDuedate(){ - return this.duedate.toString(); + return this.duedate != null ? this.duedate.toString() : null; } public List getCoordonnees_geo(){ From f2bab8a6337ed815dea30cc59f67ae148d9679c3 Mon Sep 17 00:00:00 2001 From: DCodeProg <130582816+DCodeProg@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:25:51 +0100 Subject: [PATCH 09/18] chore: add timeout to webclient Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DCodeProg <130582816+DCodeProg@users.noreply.github.com> --- src/main/java/fr/host_dcode/vlib/service/VelibService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/host_dcode/vlib/service/VelibService.java b/src/main/java/fr/host_dcode/vlib/service/VelibService.java index cc05161..26eb99f 100644 --- a/src/main/java/fr/host_dcode/vlib/service/VelibService.java +++ b/src/main/java/fr/host_dcode/vlib/service/VelibService.java @@ -29,7 +29,7 @@ public void fetchAndSaveVelibData() { .uri(queryUri) .retrieve() .bodyToMono(VelibApiResponse.class) - .block(); + .block(java.time.Duration.ofSeconds(30)); if (apiResponse == null || apiResponse.getRecords() == null || apiResponse.getRecords().isEmpty()) { System.out.println("Aucune donnée Velib reçue."); From 77f0cbceec18eded2c2d65098c6778ba24085bc4 Mon Sep 17 00:00:00 2001 From: DCodeProg <130582816+DCodeProg@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:28:31 +0100 Subject: [PATCH 10/18] refactor: use correct java naming convention for getStationCode Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DCodeProg <130582816+DCodeProg@users.noreply.github.com> --- src/main/java/fr/host_dcode/vlib/model/VelibFields.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java index 90af0b5..9f8ac27 100644 --- a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java +++ b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java @@ -22,7 +22,7 @@ public class VelibFields { public String getName(){ return this.name; } - public String getStation_code(){ + public String getStationCode(){ return this.station_code; } From db46c46b671276fed3e893f95a8ce1087796a498 Mon Sep 17 00:00:00 2001 From: DCodeProg <130582816+DCodeProg@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:31:48 +0100 Subject: [PATCH 11/18] chore: match parameter and and field name for consistency Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DCodeProg <130582816+DCodeProg@users.noreply.github.com> --- src/main/java/fr/host_dcode/vlib/model/VelibRecord.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java index 9dc782a..d98d6ae 100644 --- a/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java +++ b/src/main/java/fr/host_dcode/vlib/model/VelibRecord.java @@ -20,8 +20,8 @@ public String getRecordId(){ return this.recordId; } - public void setRecordId(String recordid) { - this.recordId = recordid; + public void setRecordId(String recordId) { + this.recordId = recordId; } } \ No newline at end of file From 48e2216ada53f94f088ea65f42217dbbc791d640 Mon Sep 17 00:00:00 2001 From: DCodeProg Date: Tue, 2 Dec 2025 09:33:16 +0100 Subject: [PATCH 12/18] fix: correct annotation usage and field naming for lastUpdate in Station class --- src/main/java/fr/host_dcode/vlib/model/Station.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/Station.java b/src/main/java/fr/host_dcode/vlib/model/Station.java index 8535526..05de191 100644 --- a/src/main/java/fr/host_dcode/vlib/model/Station.java +++ b/src/main/java/fr/host_dcode/vlib/model/Station.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; import java.time.LocalDateTime; @@ -20,9 +21,9 @@ public class Station { private double longitude; private String city; private String description; - @CreationTimestamp + @UpdateTimestamp @Column(name = "last_update") - private LocalDateTime last_update; + private LocalDateTime lastUpdate; public Station(){} From 0de530a0a2c7912197caf8b435e0e57a4e0890bc Mon Sep 17 00:00:00 2001 From: DCodeProg Date: Tue, 2 Dec 2025 09:34:06 +0100 Subject: [PATCH 13/18] fix: setCity setter --- .../fr/host_dcode/vlib/model/Station.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/Station.java b/src/main/java/fr/host_dcode/vlib/model/Station.java index 05de191..24b1e98 100644 --- a/src/main/java/fr/host_dcode/vlib/model/Station.java +++ b/src/main/java/fr/host_dcode/vlib/model/Station.java @@ -1,6 +1,5 @@ package fr.host_dcode.vlib.model; - import jakarta.persistence.*; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @@ -25,10 +24,11 @@ public class Station { @Column(name = "last_update") private LocalDateTime lastUpdate; + public Station() { + } - public Station(){} - - public Station(String name, String recordId, String stationCode,String city, double latitude, double longitude, String description) { + public Station(String name, String recordId, String stationCode, String city, double latitude, double longitude, + String description) { this.name = name; this.recordId = recordId; this.stationCode = stationCode; @@ -38,40 +38,44 @@ public Station(String name, String recordId, String stationCode,String city, dou this.description = description; } - public String getStationCode(){ + public String getStationCode() { return this.stationCode; } - public String getName(){ + public String getName() { return this.name; } - public void setName(String name){ + public void setName(String name) { this.name = name; } - public String getRecordId(){ + public String getRecordId() { return this.recordId; } - public String getDescription(){ + public String getDescription() { return this.description; } - public void setDescription(String description){ + public void setDescription(String description) { this.description = description; } - public Double getLatitude(){ + + public Double getLatitude() { return this.latitude; } - public Double getLongitude(){ + + public Double getLongitude() { return this.longitude; } - public String getCity(){ + public String getCity() { return this.city; } - public void setCity(String city){} + public void setCity(String city) { + this.city = city; + } } From fbcb2a13c592fad10d7b05733d2b24d4ac41c7c7 Mon Sep 17 00:00:00 2001 From: DCodeProg Date: Tue, 2 Dec 2025 09:34:58 +0100 Subject: [PATCH 14/18] fix: update station code field naming for consistency --- src/main/java/fr/host_dcode/vlib/service/VelibService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/host_dcode/vlib/service/VelibService.java b/src/main/java/fr/host_dcode/vlib/service/VelibService.java index 26eb99f..514d604 100644 --- a/src/main/java/fr/host_dcode/vlib/service/VelibService.java +++ b/src/main/java/fr/host_dcode/vlib/service/VelibService.java @@ -49,7 +49,7 @@ public void fetchAndSaveVelibData() { Station station = new Station( fields.getName(), record.getRecordId(), - fields.getStation_code(), + fields.getStationCode(), fields.getCity(), latitude, longitude, From c10f1ad2264779af905366990a5ae6771d771c94 Mon Sep 17 00:00:00 2001 From: DCodeProg Date: Tue, 2 Dec 2025 09:39:44 +0100 Subject: [PATCH 15/18] fix: update station code field naming for consistency --- src/main/java/fr/host_dcode/vlib/model/VelibFields.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java index 9f8ac27..b83510e 100644 --- a/src/main/java/fr/host_dcode/vlib/model/VelibFields.java +++ b/src/main/java/fr/host_dcode/vlib/model/VelibFields.java @@ -12,7 +12,7 @@ public class VelibFields { private String recordId; private String name; @JsonProperty("stationcode") - private String station_code; + private String stationCode; @JsonProperty("nom_arrondissement_communes") private String city; private List coordonnees_geo; @@ -23,7 +23,7 @@ public String getName(){ return this.name; } public String getStationCode(){ - return this.station_code; + return this.stationCode; } public String getDuedate(){ From e0c9de15a0a6bd8548c6792b413503ede261b13c Mon Sep 17 00:00:00 2001 From: DCodeProg Date: Tue, 2 Dec 2025 09:40:45 +0100 Subject: [PATCH 16/18] fix: ensure baseUrl is not null in WebClient configuration --- src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java b/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java index 755811e..77dd77a 100644 --- a/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java +++ b/src/main/java/fr/host_dcode/vlib/config/WebClientConfig.java @@ -9,10 +9,11 @@ public class WebClientConfig { @Value("${velib.api.base-url}") private String baseUrl; + @Bean - public WebClient webClient(){ + public WebClient webClient() { return WebClient.builder() - .baseUrl(baseUrl) + .baseUrl(java.util.Objects.requireNonNull(baseUrl, "velib.api.base-url must not be null")) .build(); } } From c7ef70704d14ff5b9759a651d9f3bfc636e23b97 Mon Sep 17 00:00:00 2001 From: DCodeProg Date: Tue, 2 Dec 2025 09:43:31 +0100 Subject: [PATCH 17/18] fix: remove unused import for CreationTimestamp in Station class --- src/main/java/fr/host_dcode/vlib/model/Station.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/Station.java b/src/main/java/fr/host_dcode/vlib/model/Station.java index 24b1e98..8d72a86 100644 --- a/src/main/java/fr/host_dcode/vlib/model/Station.java +++ b/src/main/java/fr/host_dcode/vlib/model/Station.java @@ -1,7 +1,6 @@ package fr.host_dcode.vlib.model; import jakarta.persistence.*; -import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import java.time.LocalDateTime; From 75b7b1728be34df2fb51b7b64714c9d6ce2870c1 Mon Sep 17 00:00:00 2001 From: DCodeProg Date: Tue, 2 Dec 2025 09:43:59 +0100 Subject: [PATCH 18/18] fix: rename created_at field to createdAt for consistency --- src/main/java/fr/host_dcode/vlib/model/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/host_dcode/vlib/model/User.java b/src/main/java/fr/host_dcode/vlib/model/User.java index f097a9d..cd015ad 100644 --- a/src/main/java/fr/host_dcode/vlib/model/User.java +++ b/src/main/java/fr/host_dcode/vlib/model/User.java @@ -20,7 +20,7 @@ public enum Status { private String password; @Enumerated(EnumType.STRING) private Status status; - private LocalDateTime created_at; + private LocalDateTime createdAt; public User(){}