Skip to content

Commit 467f737

Browse files
committed
Enhance AddBone and AddCluster handlers with improved validation and error handling; implement new GetIDCluster route and handler; add SyncEngine for peer synchronization; introduce PeerTable in DatabaseService for managing peer URLs
1 parent 1a2c2af commit 467f737

15 files changed

Lines changed: 578 additions & 230 deletions

File tree

src/main/java/io/nodelink/server/app/cluster/ClusterStarter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.nodelink.server.app.cluster;
22

33
import io.javalin.Javalin;
4+
import io.javalin.plugin.bundled.CorsPluginConfig;
45
import io.nodelink.server.NodeLink;
56
import io.nodelink.server.app.infra.RouteHandler;
67
import org.slf4j.LoggerFactory;
@@ -26,6 +27,10 @@ public void startServer() {
2627
app = Javalin.create(config -> {
2728
config.showJavalinBanner = false;
2829
config.router.contextPath = "/cluster";
30+
31+
config.bundledPlugins.enableCors(cors -> {
32+
cors.addRule(CorsPluginConfig.CorsRule::anyHost);
33+
});
2934
}).start(8080);
3035

3136
RouteHandler.registerAllRoutes(app, "io.nodelink.server.app.cluster.api.routes");

src/main/java/io/nodelink/server/app/cluster/api/routes/v1/definition/AddCluster.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.javalin.http.HandlerType;
44
import io.javalin.http.Context;
5+
import io.nodelink.server.app.cluster.api.routes.v1.handler.AddClusterH;
56
import io.nodelink.server.app.infra.RouteDefinition;
67

78
public class AddCluster implements RouteDefinition {
@@ -16,6 +17,6 @@ public class AddCluster implements RouteDefinition {
1617

1718
@Override
1819
public void handle(Context ctx) throws Exception {
19-
new AddCluster().handle(ctx);
20+
new AddClusterH().handle(ctx);
2021
}
2122
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.nodelink.server.app.cluster.api.routes.v1.definition;
2+
3+
import io.javalin.http.Context;
4+
import io.javalin.http.HandlerType;
5+
import io.nodelink.server.app.infra.RouteDefinition;
6+
import io.nodelink.server.app.node.api.routes.v1.handler.GetIDH;
7+
8+
public class GetIDCluster implements RouteDefinition {
9+
@Override public HandlerType method() { return HandlerType.GET; }
10+
@Override public String path() { return "/getId"; }
11+
@Override public boolean enabled() { return true; }
12+
13+
@Override
14+
public void handle(Context ctx) throws Exception {
15+
new GetIDH().handle(ctx);
16+
}
17+
}

src/main/java/io/nodelink/server/app/cluster/api/routes/v1/definition/SyncRoute.java

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,70 @@
11
package io.nodelink.server.app.cluster.api.routes.v1.handler;
22

3-
import io.javalin.http.Context;
3+
import com.fasterxml.jackson.databind.JsonNode;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.fasterxml.jackson.databind.node.ObjectNode;
6+
import io.javalin.http.Context;
67
import io.nodelink.server.app.data.BONE_LOCATION;
78
import io.nodelink.server.app.data.CLUSTER_LOCATION;
89
import io.nodelink.server.app.infra.ApiHandler;
910
import io.nodelink.server.app.infra.DatabaseService;
1011

11-
import java.util.Random;
12-
1312
public class AddClusterH implements ApiHandler {
1413
private final ObjectMapper mapper = new ObjectMapper();
15-
private final Random random = new Random();
1614

1715
@Override
1816
public void handle(Context ctx) throws Exception {
19-
ObjectNode requestBody = (ObjectNode) mapper.readTree(ctx.body());
20-
21-
// 1. Validation de la localisation du Cluster (ex: "NBG_DE_EU_CLUSTER")
22-
String locParam = requestBody.get("location").asText();
23-
CLUSTER_LOCATION loc;
2417
try {
25-
loc = CLUSTER_LOCATION.valueOf(locParam);
26-
} catch (IllegalArgumentException e) {
27-
ctx.status(400).result("Erreur : CLUSTER_LOCATION invalide.");
28-
return;
29-
}
18+
// 1. Lecture du JSON entrant
19+
JsonNode requestBody = mapper.readTree(ctx.body());
3020

31-
// 2. Validation du Bone Parent (ex: "EUROPE_WEST")
32-
String boneParam = requestBody.get("parentBone").asText();
33-
BONE_LOCATION boneLoc;
34-
try {
35-
boneLoc = BONE_LOCATION.valueOf(boneParam);
36-
} catch (IllegalArgumentException e) {
37-
ctx.status(400).result("Erreur : BONE_LOCATION parent invalide.");
38-
return;
39-
}
21+
// 2. Vérification des champs obligatoires
22+
if (requestBody == null || !requestBody.has("id") || !requestBody.has("location") || !requestBody.has("parentBone")) {
23+
ctx.status(400).result("Erreur : Les champs 'id', 'location' et 'parentBone' sont requis.");
24+
return;
25+
}
26+
27+
// 3. Extraction et formatage
28+
String rawId = requestBody.get("id").asText();
29+
String clusterId = "C" + rawId;
30+
31+
// Validation des enums (lance une IllegalArgumentException si invalide)
32+
CLUSTER_LOCATION loc = CLUSTER_LOCATION.valueOf(requestBody.get("location").asText().toUpperCase());
33+
BONE_LOCATION boneLoc = BONE_LOCATION.valueOf(requestBody.get("parentBone").asText().toUpperCase());
4034

41-
// 3. Génération ID "C" + random
42-
String clusterId = "C" + random.nextInt(10000);
35+
// 4. Préparation de l'objet final à stocker
36+
String finalUrl = String.format("http://%s.%s.nodelinkapp.xyz", rawId, loc.getLocationCluster());
4337

44-
// 4. Construction de l'objet final
45-
ObjectNode clusterData = mapper.createObjectNode();
46-
clusterData.put("id", clusterId);
47-
clusterData.put("type", "Cluster");
48-
clusterData.put("name", loc.getNameCluster());
49-
clusterData.put("url", loc.getLocationCluster());
38+
ObjectNode clusterData = mapper.createObjectNode();
39+
clusterData.put("id", clusterId);
40+
clusterData.put("type", "Cluster");
41+
clusterData.put("name", loc.getNameCluster());
42+
clusterData.put("url", finalUrl);
43+
clusterData.put("parentBone", boneLoc.getLocation());
5044

51-
// On récupère ici la propriété "locationBone" (ex: west.eu.bone)
52-
clusterData.put("parentBone", boneLoc.getLocation());
45+
clusterData.putArray("coords")
46+
.add(loc.getLatitude())
47+
.add(loc.getLongitude());
5348

54-
// Coordonnées auto depuis l'Enum Cluster
55-
clusterData.putArray("coords")
56-
.add(loc.getLatitude())
57-
.add(loc.getLongitude());
49+
String link = requestBody.has("link") ? requestBody.get("link").asText() : "NONE";
50+
clusterData.put("link", link);
5851

59-
// Le lien technique (souvent l'ID du Bone ou d'un autre Cluster)
60-
clusterData.put("link", requestBody.get("link").asText());
52+
// 5. Appel du SAVE LOCAL (Simple SQLite)
53+
// On utilise saveCluster qui est déjà défini dans ton DatabaseService
54+
DatabaseService.saveCluster(clusterId, clusterData.toString());
6155

62-
// 5. Sauvegarde
63-
DatabaseService.saveCluster(clusterId, clusterData.toString());
56+
System.out.println("[INFO] Cluster " + clusterId + " sauvegardé localement.");
6457

65-
ctx.status(201).json(clusterData);
58+
// 6. Réponse au client
59+
ctx.status(201).json(clusterData);
60+
61+
} catch (IllegalArgumentException e) {
62+
ctx.status(400).result("Erreur : Localisation invalide.");
63+
} catch (Exception e) {
64+
System.err.println("--- CRASH SERVEUR ---");
65+
System.err.println("Cause : " + e.getMessage());
66+
e.printStackTrace(); // <--- C'est cette ligne qui va te dire la ligne exacte du bug
67+
ctx.status(500).result("Erreur : " + e.getMessage());
68+
}
6669
}
6770
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.nodelink.server.app.cluster.api.routes.v1.handler;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.databind.node.ObjectNode;
5+
import io.javalin.http.Context;
6+
import io.nodelink.server.app.infra.ApiHandler;
7+
8+
import java.util.Random;
9+
10+
public class GetIDClusterH implements ApiHandler {
11+
private final Random random = new Random();
12+
13+
@Override
14+
public void handle(Context ctx) throws Exception {
15+
int idNumber = random.nextInt(10000);
16+
17+
ObjectNode response = new ObjectMapper().createObjectNode();
18+
response.put("id", idNumber);
19+
20+
ctx.json(response);
21+
}
22+
}

src/main/java/io/nodelink/server/app/cluster/api/routes/v1/handler/SyncHandler.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)