diff --git a/pom.xml b/pom.xml
index ae6ec97..aba3cfa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,6 +54,16 @@
jackson-databind
2.13.0
+
+ com.fasterxml.jackson.jaxrs
+ jackson-jaxrs-json-provider
+ 2.13.0
+
+
+ org.glassfish.jersey.media
+ jersey-media-json-jackson
+ 2.13
+
diff --git a/src/main/java/com/example/CorsFilters.java b/src/main/java/com/example/CorsFilters.java
index 853eaa7..a8eb9e1 100644
--- a/src/main/java/com/example/CorsFilters.java
+++ b/src/main/java/com/example/CorsFilters.java
@@ -27,6 +27,7 @@ public class CorsFilters implements Filter {
// Autoriser les en-têtes spécifiés dans la requête
httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type");
+ httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
// Permettre l'envoi de cookies (si nécessaire)
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
diff --git a/src/main/java/com/example/services/AuthService.java b/src/main/java/com/example/services/AuthService.java
new file mode 100644
index 0000000..40f4ac1
--- /dev/null
+++ b/src/main/java/com/example/services/AuthService.java
@@ -0,0 +1,144 @@
+package com.example.services;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Path("/auth")
+public class AuthService {
+ private static final Logger logger = LoggerFactory.getLogger(AuthService.class);
+
+ public class UserAbilityRules {
+ private List rules;
+
+ public UserAbilityRules() {
+ this.rules = Arrays.asList("admin", "editor");
+ }
+
+ public List getRules() {
+ return rules;
+ }
+ }
+
+ public class UserData {
+ private int id;
+ private String fullName;
+ private String username;
+ private String avatar;
+ private String email;
+ private String role;
+
+ public UserData() {
+ this.id = 1;
+ this.fullName = "Frédérik Benoist";
+ this.username = "fbenoist";
+ this.avatar = "/images/avatars/avatar-1.png";
+ this.email = "admin@demo.com";
+ this.role = "admin";
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public String getRole() {
+ return role;
+ }
+ }
+
+ public class AuthResponse {
+ private String accessToken;
+ private UserAbilityRules userAbilityRules;
+ private UserData userData;
+
+ public AuthResponse() {
+ this.accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0.fhc3wykrAnRpcKApKhXiahxaOe8PSHatad31NuIZ0Zg";
+ this.userAbilityRules = new UserAbilityRules();
+ this.userData = new UserData();
+ }
+
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ public UserAbilityRules getUserAbilityRules() {
+ return userAbilityRules;
+ }
+
+ public UserData getUserData() {
+ return userData;
+ }
+ }
+
+ @POST
+ @Path("/login")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public AuthResponse login(Credentials credentials) {
+ logger.info(credentials.getUsername() + " is attempting to login");
+
+ if (!isValidPassword(credentials.getPassword())) {
+ logger.info("User " + credentials.getUsername() + " failed to login");
+ throw new WebApplicationException("Invalid password", Response.Status.UNAUTHORIZED);
+ }
+
+ logger.info("User " + credentials.getUsername() + " successfully logged in");
+
+ return new AuthResponse();
+ }
+
+ private boolean isValidPassword(String password) {
+ return "admin123".equals(password) || "support123".equals(password);
+ }
+
+ public static class Credentials {
+ private String username;
+ private String password;
+
+ // Getter pour username
+ public String getUsername() {
+ return username;
+ }
+
+ // Setter pour username
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ // Getter pour password
+ public String getPassword() {
+ return password;
+ }
+
+ // Setter pour password
+ public void setPassword(String password) {
+ this.password = password;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java
index e0cadc8..25a29f4 100644
--- a/src/main/java/com/example/services/StoreService.java
+++ b/src/main/java/com/example/services/StoreService.java
@@ -4,6 +4,7 @@ import com.example.services.store.*;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
@@ -40,9 +41,9 @@ public class StoreService {
* @return a response containing the store information in JSON format
*/
@GET
- @Path("/get")
+ @Path("/{storeId}")
@Produces(MediaType.APPLICATION_JSON)
- public Response getStoreById(@QueryParam("storeId") String storeId) {
+ public Response getStoreById(@PathParam("storeId") String storeId) {
if (storeId == null) {
return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build();
}
@@ -50,13 +51,26 @@ public class StoreService {
DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes
try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) {
- String query = "SELECT st.id_structure,TRIM(st.nom) as nom,'xxx.xxx.xxx.xxx' AS ip, st.tel1 as telephone, st.enseigne, " +
- "'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " +
- "ELSE '0/0' END || '-small.JPG' as photoLink " +
- "FROM COM02.structure st " +
- "LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure " +
- "LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale " +
- "WHERE st.id_structure = ?";
+ String query = "SELECT st.id_structure," +
+ " TRIM(st.nom) as nom," +
+ " st.tel1 as telephone," +
+ " st.enseigne," +
+ " 'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " + "ELSE '0/0' END || '-small.JPG' as photoLink," +
+ " TRIM(pp.nom) AS pays, " +
+ " (" +
+ " SELECT" +
+ " NVL(STRAGG(hsc2.id_caisse || '|' || hsc2.ip),'0|0.0.0.0')" +
+ " FROM" +
+ " com02.HOTLINE_STRUCTURE_CAISSE hsc2" +
+ " WHERE" +
+ " hsc2.id_structure = st.id_structure" +
+ " AND hsc2.id_caisse BETWEEN 20 AND 39) AS caisses," +
+ " REPLACE(REPLACE(TRIM(st.adresse1), chr(10), ''), chr(13), '') AS adresse" +
+ " FROM COM02.structure st" +
+ " JOIN com02.PARAM_PAYS pp ON pp.id_pays = st.id_pays" +
+ " LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure" +
+ " LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale" +
+ " WHERE st.id_structure = ?";
logger.info(query);
@@ -69,6 +83,7 @@ public class StoreService {
ObjectMapper objectMapper = new ObjectMapper();
String jsonResponse = objectMapper.writeValueAsString(store);
+
return Response.ok(jsonResponse).build();
} else {
return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"No store found\"}").build();
@@ -91,7 +106,6 @@ public class StoreService {
* @return A JSON response containing the list of stores
*/
@GET
- @Path("/getAll")
@Produces(MediaType.APPLICATION_JSON)
public Response getAllStores() {
if (cachedStoreList == null) {
@@ -128,13 +142,28 @@ public class StoreService {
DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes
try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) {
- String query = "SELECT st.id_structure, TRIM(st.nom) as nom, hsc.ip, " +
- "st.tel1 AS telephone, st.enseigne, null AS photoLink " +
- "FROM COM02.STRUCTURE st " +
- "LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " +
- "JOIN COM02.hotline_structure_caisse hsc ON hsc.id_structure = st.id_structure AND hsc.id_caisse = 1 " +
- "WHERE axs.date_stock is not null and st.id_structure < 9999 AND hsc.ip IS NOT NULL AND st.ID_NIVEAU=4 AND st.STATUT=2 " +
- "ORDER BY st.id_structure";
+ String query = "SELECT st.id_structure," +
+ " TRIM(st.nom) as nom," +
+ " st.tel1 as telephone," +
+ " st.enseigne," +
+ " 'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " + "ELSE '0/0' END || '-small.JPG' as photoLink," +
+ " TRIM(pp.nom) AS pays, " +
+ " (" +
+ " SELECT" +
+ " NVL(STRAGG(hsc2.id_caisse || '|' || hsc2.ip),'0|0.0.0.0')" +
+ " FROM" +
+ " com02.HOTLINE_STRUCTURE_CAISSE hsc2" +
+ " WHERE" +
+ " hsc2.id_structure = st.id_structure" +
+ " AND hsc2.id_caisse BETWEEN 20 AND 39) AS caisses," +
+ " REPLACE(REPLACE(TRIM(st.adresse1), chr(10), ''), chr(13), '') AS adresse" +
+ " FROM COM02.structure st" +
+ " JOIN com02.PARAM_PAYS pp ON pp.id_pays = st.id_pays" +
+ " LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure" +
+ " LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale" +
+ " LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " +
+ " WHERE axs.date_stock is not null AND st.ID_NIVEAU=4 AND st.STATUT=2 AND st.id_canal_distribution = 1 and st.magasin_demo = 0" +
+ " ORDER BY st.id_structure";
logger.info(query);
@@ -308,20 +337,22 @@ public class StoreService {
store.setId_structure(resultSet.getInt("ID_STRUCTURE"));
store.setNom(resultSet.getString("NOM"));
- store.setIp(resultSet.getString("IP"));
store.setTelephone(resultSet.getString("TELEPHONE"));
store.setEnseigne(resultSet.getString("ENSEIGNE"));
store.setPhotoLink(resultSet.getString("PHOTOLINK"));
+ store.setPays(resultSet.getString("PAYS"));
+ store.setCaisses(resultSet.getString("CAISSES"));
+ store.setAdresse(resultSet.getString("ADRESSE"));
return store;
}
@GET
- @Path("/getStoreDetails")
+ @Path("/{storeId}/details")
@Produces(MediaType.APPLICATION_JSON)
public Response getStoreDetails(
- @QueryParam("dbHost") String dbHost,
- @QueryParam("storeId") Integer storeId) {
+ @PathParam("storeId") Integer storeId,
+ @QueryParam("dbHost") String dbHost) {
if (dbHost == null) {
return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build();
@@ -359,17 +390,30 @@ public class StoreService {
private StoreDetails retrieveStoreDetails(String dbHost, Integer storeId) {
DriverManager.setLoginTimeout(5);
- StoreDetails storeDetails = new StoreDetails(); // Déclarer l'objet en dehors des blocs try
+ StoreDetails storeDetails = new StoreDetails(); // Declare object outside try blocks
try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) {
- // Store section
- String storeQuery = "SELECT st.id_structure,TRIM(st.nom) as nom,'xxx.xxx.xxx.xxx' AS ip, st.tel1 as telephone, st.enseigne, " +
- "'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " +
- "ELSE '0/0' END || '-small.JPG' as photoLink " +
- "FROM COM02.structure st " +
- "LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure " +
- "LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale " +
- "WHERE st.id_structure = ?";
+ // Store section FRED
+ String storeQuery = "SELECT st.id_structure," +
+ " TRIM(st.nom) as nom," +
+ " st.tel1 as telephone," +
+ " st.enseigne," +
+ " 'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " + "ELSE '0/0' END || '-small.JPG' as photoLink," +
+ " TRIM(pp.nom) AS pays, " +
+ " (" +
+ " SELECT" +
+ " NVL(STRAGG(hsc2.id_caisse || '|' || hsc2.ip),'0|0.0.0.0')" +
+ " FROM" +
+ " com02.HOTLINE_STRUCTURE_CAISSE hsc2" +
+ " WHERE" +
+ " hsc2.id_structure = st.id_structure" +
+ " AND hsc2.id_caisse BETWEEN 20 AND 39) AS caisses," +
+ " REPLACE(REPLACE(TRIM(st.adresse1), chr(10), ''), chr(13), '') AS adresse" +
+ " FROM COM02.structure st" +
+ " JOIN com02.PARAM_PAYS pp ON pp.id_pays = st.id_pays" +
+ " LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure" +
+ " LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale" +
+ " WHERE st.id_structure = ?";
logger.info(storeQuery);
try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(storeQuery)) {
@@ -445,12 +489,14 @@ public class StoreService {
private Store mapResultSetToStore(ResultSet resultSet) throws SQLException {
Integer id_structure = resultSet.getInt("id_structure");
String nom = resultSet.getString("nom");
- String ip = resultSet.getString("ip");
String telephone = resultSet.getString("telephone");
String photoLink = resultSet.getString("photoLink");
String enseigne = resultSet.getString("enseigne");
-
- return new Store(id_structure, nom, ip, telephone, photoLink, enseigne);
+ String pays = resultSet.getString("pays");
+ String caisses = resultSet.getString("caisses");
+ String adresse = resultSet.getString("adresse");
+
+ return new Store(id_structure, nom, telephone, photoLink, enseigne, pays, caisses, adresse);
}
private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException {
diff --git a/src/main/java/com/example/services/store/Store.java b/src/main/java/com/example/services/store/Store.java
index a9acb60..284ecfd 100644
--- a/src/main/java/com/example/services/store/Store.java
+++ b/src/main/java/com/example/services/store/Store.java
@@ -1,13 +1,21 @@
package com.example.services.store;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
public class Store {
private Integer id_structure;
private String nom;
- private String ip;
+ private String ip_master;
private String telephone;
private String photoLink;
private String enseigne;
-
+ private String pays;
+ private Integer nbcaisses;
+ private String adresse;
+ private List caisses;
// Default constructor
public Store() {
@@ -15,13 +23,16 @@ public class Store {
}
// Constructor with parameters
- public Store(Integer id_structure, String nom, String ip, String telephone, String photoLink, String enseigne) {
+ public Store(Integer id_structure, String nom, String telephone, String photoLink, String enseigne, String pays, String caisses, String adresse) {
this.id_structure = id_structure;
this.nom = nom;
- this.ip = ip;
this.telephone = telephone;
this.photoLink = photoLink;
this.enseigne = enseigne;
+ this.pays = pays;
+ this.adresse = adresse;
+
+ setCaisses(caisses);
}
public Integer getId_structure() {
@@ -40,12 +51,12 @@ public class Store {
this.nom = nom;
}
- public String getIp() {
- return ip;
- }
+ public String getIp_master() {
+ if (!this.caisses.isEmpty()) {
+ return this.caisses.get(0).getIp();
+ }
- public void setIp(String ip) {
- this.ip = ip;
+ return "";
}
public String getTelephone() {
@@ -71,4 +82,64 @@ public class Store {
public void setEnseigne(String enseigne) {
this.enseigne = enseigne;
}
+
+ public String getPays() {
+ return pays;
+ }
+
+ public void setPays(String pays) {
+ this.pays = pays;
+ }
+
+ public Integer getNbcaisses() {
+ return this.caisses.size();
+ }
+
+ public void setAdresse(String adresse) {
+ this.adresse = adresse;
+ }
+
+ public String getAdresse() {
+ return this.adresse;
+ }
+
+ public List getCaisses() {
+ return this.caisses;
+ }
+
+ public void setCaisses(String caisses) {
+ this.caisses = new ArrayList<>();
+ for (String caisse : caisses.split(",")) {
+ String[] parts = caisse.split("\\|");
+ this.caisses.add(new Caisse(Integer.parseInt(parts[0]), parts[1]));
+ }
+
+ Collections.sort(this.caisses, Comparator.comparing(Caisse::getId_caisse));
+ }
+
+ public class Caisse {
+ private Integer id_caisse;
+ private String ip;
+
+ public Caisse(Integer id_caisse, String ip) {
+ this.id_caisse = id_caisse;
+ this.ip = ip;
+ }
+
+ public Integer getId_caisse() {
+ return id_caisse;
+ }
+
+ public void setId_caisse(Integer id_caisse) {
+ this.id_caisse = id_caisse;
+ }
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+ }
}
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 7cc252d..21d9ef3 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -15,6 +15,10 @@
jersey.config.server.provider.packages
com.example.services
+
+ jersey.config.server.provider.classnames
+ org.glassfish.jersey.jackson.JacksonFeature
+
1