Skip to content

Commit 0e70907

Browse files
authored
Merge pull request #22 from Sandro642/feature/schematic
Feature/schematic Major 0.2.0 Version
2 parents aee8d5a + aed1161 commit 0e70907

12 files changed

Lines changed: 235 additions & 509 deletions

File tree

.idea/discord.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55
}
66

77
group = 'fr.sandro642.github'
8-
version = '0.1.9.2-STABLE' // Version de votre projet
8+
version = '0.2.0-STABLE' // Version de votre projet
99

1010
// Ajoutez cette tâche à votre build.gradle
1111
tasks.register('printVersion') {

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Et si vous pensiez que les API étaient compliquées, détrompez-vous ! Avec Con
77
---
88

99
```java
10-
Stable Version : 0.1.9.2-STABLE
10+
Stable Version : 0.2.0-STABLE
1111
```
1212

1313
---

src/main/java/fr/sandro642/github/ConnectorAPI.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ public class ConnectorAPI {
3030
private static final Map<String,String> routes = new HashMap<>();
3131

3232
/**
33-
* Initialise le ConnectorAPI avec le type de ressource spécifié
33+
* Initialise le ConnectorAPI avec le type de ressource, les routes et les schémas
34+
* @param resourceType Le type de ressource à utiliser
35+
* @param routes Les classes d'énumération contenant les routes
3436
*/
3537
public static void initialize(ResourceType resourceType, Class<? extends Enum<?>>... routes) {
3638

@@ -40,7 +42,7 @@ public static void initialize(ResourceType resourceType, Class<? extends Enum<?>
4042
throw new IllegalArgumentException("Les routes ne peuvent pas être null");
4143
}
4244

43-
routesEnums.putAll(ConvertEnum.convert(route));
45+
routesEnums.putAll(ConvertEnum.convertRouteImport(route));
4446
}
4547

4648
logger = new Logger();
@@ -69,6 +71,10 @@ public static void initialize(ResourceType resourceType, Class<? extends Enum<?>
6971
}
7072
}
7173

74+
/**
75+
* Retourne une map contenant les routes définies dans le ConnectorAPI
76+
* @return une map de routes
77+
*/
7278
public static String getRoute(String routeName) {
7379
if (routes.containsKey(routeName)) {
7480
return routes.get(routeName);
@@ -77,6 +83,10 @@ public static String getRoute(String routeName) {
7783
}
7884
}
7985

86+
/**
87+
* Retourne une map contenant les schémas définis dans le ConnectorAPI
88+
* @return une map de schémas
89+
*/
8090
public static String getRoute(Enum<?> routeEnum) {
8191
return getRoute(routeEnum.name().toLowerCase());
8292
}

src/main/java/fr/sandro642/github/api/ApiClient.java

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Permet d'effectuer des requêtes GET et POST.
1616
*/
1717

18-
public class ApiClient {
18+
public class ApiClient extends ApiFactory {
1919

2020
/**
2121
* WebClient est utilisé pour effectuer les requêtes HTTP vers l'API.
@@ -24,11 +24,10 @@ public class ApiClient {
2424
*/
2525
private final WebClient webClient;
2626

27-
private final AtomicReference<ApiResponse> lastResponse = new AtomicReference<>();
28-
29-
// private final AtomicReference<Map<String, Object>> lastRawResponse = new AtomicReference<>();
27+
private final AtomicReference<ApiFactory> lastResponse = new AtomicReference<>();
3028

3129
private final Logger logger = new Logger();
30+
private final ApiFactory response = new ApiFactory();
3231

3332
/**
3433
* Constructeur de ApiClient qui initialise WebClient avec l'URL de base.
@@ -51,18 +50,22 @@ public ApiClient() {
5150
* @param routeName c'est le nom de la route à appeler.
5251
* @return la réponse de l'API encapsulée.
5352
*/
54-
public Mono<ApiResponse> callAPIGet(String routeName) {
53+
public Mono<ApiFactory> callAPIGet(String routeName) {
5554
logger.INFO("Appel GET vers: " + routeName);
5655
return webClient.get()
57-
.uri(routeName)
58-
.retrieve()
59-
.bodyToMono(new ParameterizedTypeReference<ApiResponse>() {
60-
})
61-
.subscribeOn(Schedulers.boundedElastic())
62-
.doOnNext(lastResponse::set)
63-
.doOnError(error -> logger.ERROR("Erreur lors de l'appel GET: " + error.getMessage()));
56+
.uri(routeName)
57+
.retrieve()
58+
.bodyToMono(String.class) // Récupère le JSON brut comme String
59+
.subscribeOn(Schedulers.boundedElastic())
60+
.map(rawJson -> {
61+
response.parseFromRawJson(rawJson);
62+
return response;
63+
})
64+
.doOnNext(lastResponse::set)
65+
.doOnError(error -> logger.CRITICAL("Erreur lors de l'appel GET: " + error.getMessage()));
6466
}
6567

68+
6669
/**
6770
* Méthode pour appeler l'API avec une requête POST.
6871
*
@@ -71,17 +74,20 @@ public Mono<ApiResponse> callAPIGet(String routeName) {
7174
* corps).
7275
* @return la réponse de l'API encapsulée.
7376
*/
74-
public Mono<ApiResponse> callAPIPost(String routeName, Map<String, Object> body) {
77+
public Mono<ApiFactory> callAPIPost(String routeName, Map<String, Object> body) {
7578
logger.INFO("Appel POST vers: " + routeName);
7679
return webClient.post()
7780
.uri(routeName)
7881
.bodyValue(body != null ? body : Map.of())
7982
.retrieve()
80-
.bodyToMono(new ParameterizedTypeReference<ApiResponse>() {
81-
})
83+
.bodyToMono(String.class)
8284
.subscribeOn(Schedulers.boundedElastic())
83-
.doOnNext(lastResponse::set)
84-
.doOnError(error -> logger.ERROR("Erreur lors de l'appel POST: " + error.getMessage()));
85+
.map(rawJson -> {
86+
response.parseFromRawJson(rawJson);
87+
return response;
88+
})
89+
.doOnNext(lastResponse::set)
90+
.doOnError(error -> logger.CRITICAL("Erreur lors de l'appel POST: " + error.getMessage()));
8591
}
8692

8793
/**
@@ -91,17 +97,20 @@ public Mono<ApiResponse> callAPIPost(String routeName, Map<String, Object> body)
9197
* @param body Corps de la requête (peut être null pour une requête sans corps).
9298
* @return la réponse de l'API encapsulée.
9399
*/
94-
public Mono<ApiResponse> callAPIPut(String routeName, Map<String, Object> body) {
100+
public Mono<ApiFactory> callAPIPut(String routeName, Map<String, Object> body) {
95101
logger.INFO("Appel PUT vers: " + routeName);
96102
return webClient.put()
97103
.uri(routeName)
98104
.bodyValue(body != null ? body : Map.of())
99105
.retrieve()
100-
.bodyToMono(new ParameterizedTypeReference<ApiResponse>() {
101-
})
102-
.subscribeOn(Schedulers.boundedElastic())
103-
.doOnNext(lastResponse::set)
104-
.doOnError(error -> logger.ERROR("Erreur lors de l'appel PUT: " + error.getMessage()));
106+
.bodyToMono(String.class)
107+
.subscribeOn(Schedulers.boundedElastic())
108+
.map(rawJson -> {
109+
response.parseFromRawJson(rawJson);
110+
return response;
111+
})
112+
.doOnNext(lastResponse::set)
113+
.doOnError(error -> logger.CRITICAL("Erreur lors de l'appel PUT: " + error.getMessage()));
105114
}
106115

107116
/**
@@ -111,17 +120,20 @@ public Mono<ApiResponse> callAPIPut(String routeName, Map<String, Object> body)
111120
* @param body Corps de la requête (peut être null pour une requête sans corps).
112121
* @return la réponse de l'API encapsulée.
113122
*/
114-
public Mono<ApiResponse> callAPIPatch(String routeName, Map<String, Object> body) {
123+
public Mono<ApiFactory> callAPIPatch(String routeName, Map<String, Object> body) {
115124
logger.INFO("Appel PATCH vers: " + routeName);
116125
return webClient.patch()
117126
.uri(routeName)
118127
.bodyValue(body != null ? body : Map.of())
119128
.retrieve()
120-
.bodyToMono(new ParameterizedTypeReference<ApiResponse>() {
121-
})
122-
.subscribeOn(Schedulers.boundedElastic())
123-
.doOnNext(lastResponse::set)
124-
.doOnError(error -> logger.ERROR("Erreur lors de l'appel PATCH: " + error.getMessage()));
129+
.bodyToMono(String.class)
130+
.subscribeOn(Schedulers.boundedElastic())
131+
.map(rawJson -> {
132+
response.parseFromRawJson(rawJson);
133+
return response;
134+
})
135+
.doOnNext(lastResponse::set)
136+
.doOnError(error -> logger.CRITICAL("Erreur lors de l'appel PATCH: " + error.getMessage()));
125137
}
126138

127139
/**
@@ -130,15 +142,18 @@ public Mono<ApiResponse> callAPIPatch(String routeName, Map<String, Object> body
130142
* @param routeName Nom de la route à appeler.
131143
* @return la réponse de l'API encapsulée.
132144
*/
133-
public Mono<ApiResponse> callAPIDelete(String routeName) {
145+
public Mono<ApiFactory> callAPIDelete(String routeName) {
134146
logger.INFO("Appel DELETE vers: " + routeName);
135147
return webClient.delete()
136148
.uri(routeName)
137149
.retrieve()
138-
.bodyToMono(new ParameterizedTypeReference<ApiResponse>() {
139-
})
140-
.subscribeOn(Schedulers.boundedElastic())
141-
.doOnNext(lastResponse::set)
142-
.doOnError(error -> logger.ERROR("Erreur lors de l'appel PATCH: " + error.getMessage()));
150+
.bodyToMono(String.class)
151+
.subscribeOn(Schedulers.boundedElastic())
152+
.map(rawJson -> {
153+
response.parseFromRawJson(rawJson);
154+
return response;
155+
})
156+
.doOnNext(lastResponse::set)
157+
.doOnError(error -> logger.CRITICAL("Erreur lors de l'appel DELETE: " + error.getMessage()));
143158
}
144159
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package fr.sandro642.github.api;
2+
3+
import com.fasterxml.jackson.core.type.TypeReference;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import fr.sandro642.github.ConnectorAPI;
6+
7+
import java.util.Map;
8+
9+
public class ApiFactory {
10+
private Map<String, Object> rawData;
11+
private String rawJson;
12+
13+
14+
15+
/**
16+
* Parse le JSON brut et stocke les données
17+
*/
18+
protected void parseFromRawJson(String rawJson) {
19+
this.rawJson = rawJson;
20+
try {
21+
ObjectMapper mapper = new ObjectMapper();
22+
this.rawData = mapper.readValue(rawJson, new TypeReference<Map<String, Object>>() {});
23+
} catch (Exception e) {
24+
throw new RuntimeException("Erreur lors du parsing: " + e.getMessage(), e);
25+
}
26+
}
27+
28+
public <O> Object getData(O type) {
29+
try {
30+
if (rawData == null) {
31+
throw new IllegalStateException("Les données n'ont pas été initialisées. Veuillez appeler parseFromRawJson() d'abord.");
32+
}
33+
34+
return rawData.get(type.toString().toLowerCase());
35+
} catch (Exception e) {
36+
ConnectorAPI.Logger().ERROR("Impossible de récupérer les données pour le type: " + type + ".");
37+
}
38+
return null;
39+
}
40+
41+
public <O, K> Object getSpecData(O type, K value) {
42+
try {
43+
if (rawData == null) {
44+
throw new IllegalStateException("Les données n'ont pas été initialisées. Veuillez appeler parseFromRawJson() d'abord.");
45+
}
46+
47+
Object nested = rawData.get(type.toString().toLowerCase());
48+
if (nested instanceof Map) {
49+
Map<?, ?> nestedMap = (Map<?, ?>) nested;
50+
return nestedMap.get(value.toString().toLowerCase());
51+
}
52+
} catch (Exception e) {
53+
ConnectorAPI.Logger().ERROR("Impossible de récupérer les données pour le type: " + type + ".");
54+
}
55+
return null;
56+
}
57+
58+
59+
public Object display() {
60+
try {
61+
if (rawData == null) {
62+
throw new IllegalStateException("Les données n'ont pas été initialisées. Veuillez appeler parseFromRawJson() d'abord.");
63+
}
64+
return rawData;
65+
} catch (Exception e) {
66+
ConnectorAPI.Logger().ERROR("Impossible de récupérer les données.");
67+
}
68+
return null;
69+
}
70+
71+
}

0 commit comments

Comments
 (0)