Skip to content

Commit bc94920

Browse files
committed
update graphql
1 parent aba8982 commit bc94920

File tree

8 files changed

+129
-60
lines changed

8 files changed

+129
-60
lines changed

ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/controller/GraphQLController.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import com.tvd12.ezyfox.builder.EzyBuilder;
55
import com.tvd12.ezyfox.util.EzyMapBuilder;
6+
import com.tvd12.ezyhttp.core.exception.HttpBadRequestException;
7+
import com.tvd12.ezyhttp.core.exception.HttpInternalServerErrorException;
68
import com.tvd12.ezyhttp.core.exception.HttpNotAcceptableException;
79
import com.tvd12.ezyhttp.core.exception.HttpNotFoundException;
810
import com.tvd12.ezyhttp.server.core.annotation.*;
@@ -12,7 +14,6 @@
1214
import com.tvd12.ezyhttp.server.graphql.data.GraphQLDataFilter;
1315
import com.tvd12.ezyhttp.server.graphql.data.GraphQLField;
1416
import com.tvd12.ezyhttp.server.graphql.data.GraphQLRequest;
15-
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLObjectMapperException;
1617
import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLDataFetcher;
1718
import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLDataFetcherManager;
1819
import com.tvd12.ezyhttp.server.graphql.interceptor.GraphQLInterceptor;
@@ -81,7 +82,7 @@ public Object doGet(
8182
Map.class
8283
);
8384
} catch (Exception e) {
84-
throw new GraphQLObjectMapperException(
85+
throw new HttpBadRequestException(
8586
singletonMap("variables", "invalid"),
8687
e
8788
);
@@ -118,7 +119,7 @@ public Object doPost(
118119
);
119120
}
120121

121-
@SuppressWarnings({"rawtypes", "unchecked", "MethodLength"})
122+
@SuppressWarnings("MethodLength")
122123
private Object fetch(
123124
RequestArguments arguments,
124125
String query,
@@ -127,15 +128,14 @@ private Object fetch(
127128
GraphQLSchema schema = schemaParser.parseQuery(query, variables);
128129
List<GraphQLQueryDefinition> queryDefinitions = schema
129130
.getQueryDefinitions();
130-
Map answer = new HashMap<>();
131-
131+
Map<String, Object> answer = new HashMap<>();
132132
for (GraphQLQueryDefinition queryDefinition : queryDefinitions) {
133133
String queryName = queryDefinition.getName();
134134
GraphQLDataFetcher dataFetcher = dataFetcherManager
135135
.getDataFetcher(queryName);
136136
if (dataFetcher == null) {
137137
throw new HttpNotFoundException(
138-
"not found data fetcher with queryName: " + queryName
138+
singletonMap("dataFetcher", "notFound")
139139
);
140140
}
141141
List<GraphQLInterceptor> interceptors = interceptorManager
@@ -177,15 +177,11 @@ private Object fetch(
177177
arguments,
178178
queryDefinition
179179
);
180-
try {
181-
Object currentResponse = mapToResponse(
182-
data,
183-
queryDefinition
184-
);
185-
answer.put(queryName, currentResponse);
186-
} catch (GraphQLObjectMapperException e) {
187-
answer.put(queryName, data);
188-
}
180+
Object currentResponse = mapToResponse(
181+
data,
182+
queryDefinition
183+
);
184+
answer.put(queryName, currentResponse);
189185
for (GraphQLInterceptor interceptor : interceptors) {
190186
interceptor.postHandle(
191187
arguments,
@@ -209,8 +205,9 @@ private Map mapToResponse(
209205
try {
210206
dataMap = objectMapper.convertValue(data, Map.class);
211207
} catch (Exception e) {
212-
throw new GraphQLObjectMapperException(
213-
singletonMap("response", "invalid")
208+
throw new HttpInternalServerErrorException(
209+
singletonMap("response", "invalid"),
210+
e
214211
);
215212
}
216213
return filterDataMap(dataMap, queryDefinition);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.tvd12.ezyhttp.server.graphql.controller;
2+
3+
import com.tvd12.ezyfox.util.EzyLoggable;
4+
import com.tvd12.ezyhttp.server.core.annotation.ExceptionHandler;
5+
import com.tvd12.ezyhttp.server.core.annotation.TryCatch;
6+
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLFetcherException;
7+
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLInvalidSchemeException;
8+
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLObjectMapperException;
9+
10+
@ExceptionHandler
11+
public class GraphQLExceptionHandler extends EzyLoggable {
12+
13+
@TryCatch(GraphQLFetcherException.class)
14+
public Object handle(GraphQLFetcherException e) {
15+
logger.info("{}({})", e.getClass().getSimpleName(), e.getMessage());
16+
return e.toDataMap();
17+
}
18+
19+
@TryCatch(GraphQLInvalidSchemeException.class)
20+
public Object handle(GraphQLInvalidSchemeException e) {
21+
logger.info("{}({})", e.getClass().getSimpleName(), e.getMessage());
22+
return e.getErrors();
23+
}
24+
25+
@TryCatch(GraphQLObjectMapperException.class)
26+
public Object handle(GraphQLObjectMapperException e) {
27+
logger.info("{}({})", e.getClass().getSimpleName(), e.getMessage());
28+
return e.getErrors();
29+
}
30+
}

ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/data/GraphQLDataFilter.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.tvd12.ezyhttp.server.graphql.data;
22

3+
import com.tvd12.ezyfox.util.EzyMapBuilder;
34
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLInvalidSchemeException;
45
import lombok.AllArgsConstructor;
56

67
import java.util.*;
78

89
import static com.tvd12.ezyhttp.server.graphql.constants.GraphQLConstants.ALL_FIELDS;
9-
import static java.util.Collections.singletonMap;
1010

1111
public class GraphQLDataFilter {
1212

@@ -58,8 +58,10 @@ public Map filter(
5858
);
5959
} else {
6060
throw new GraphQLInvalidSchemeException(
61-
singletonMap("schema", "invalid"),
62-
"invalid schema at field: " + fieldName
61+
EzyMapBuilder.mapBuilder()
62+
.put("schema", "invalid")
63+
.put("field", fieldName)
64+
.toMap()
6365
);
6466
}
6567
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.tvd12.ezyhttp.server.graphql.data;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
@Getter
10+
@Builder
11+
public class GraphQLError {
12+
private String message;
13+
private List<Map<String, Object>> locations;
14+
private List<String> path;
15+
private Map<String, Object> extensions;
16+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.tvd12.ezyhttp.server.graphql.exception;
2+
3+
import com.tvd12.ezyhttp.server.graphql.data.GraphQLError;
4+
import lombok.Getter;
5+
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
@Getter
11+
public class GraphQLFetcherException extends RuntimeException {
12+
13+
private final Map<String, Object> data;
14+
private final List<GraphQLError> errors;
15+
16+
public GraphQLFetcherException(
17+
List<GraphQLError> errors
18+
) {
19+
this(null, errors);
20+
}
21+
22+
public GraphQLFetcherException(
23+
Map<String, Object> data,
24+
List<GraphQLError> errors
25+
) {
26+
super("data: " + data + ", errors: " + errors);
27+
this.data = data;
28+
this.errors = errors;
29+
}
30+
31+
public Map<String, Object> toDataMap() {
32+
Map<String, Object> answer = new HashMap<>();
33+
if (data != null) {
34+
answer.put("data", data);
35+
}
36+
answer.put("errors", errors);
37+
return answer;
38+
}
39+
}

ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/exception/GraphQLObjectMapperException.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,6 @@ public class GraphQLObjectMapperException extends IllegalArgumentException {
88

99
private final Object errors;
1010

11-
public GraphQLObjectMapperException(
12-
Object errors
13-
) {
14-
this(errors, errors.toString());
15-
}
16-
17-
public GraphQLObjectMapperException(
18-
Object errors,
19-
String message
20-
) {
21-
super(message);
22-
this.errors = errors;
23-
}
24-
2511
public GraphQLObjectMapperException(
2612
Object errors,
2713
Throwable cause

ezyhttp-server-graphql/src/main/java/com/tvd12/ezyhttp/server/graphql/scheme/GraphQLSchemaParser.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.tvd12.ezyhttp.server.graphql.scheme;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.tvd12.ezyfox.util.EzyMapBuilder;
45
import com.tvd12.ezyhttp.server.graphql.data.GraphQLField;
56
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLObjectMapperException;
67
import com.tvd12.ezyhttp.server.graphql.query.GraphQLQueryDefinition;
@@ -10,7 +11,6 @@
1011
import java.util.Stack;
1112

1213
import static com.tvd12.ezyfox.io.EzyStrings.EMPTY_STRING;
13-
import static java.util.Collections.singletonMap;
1414

1515
@AllArgsConstructor
1616
public final class GraphQLSchemaParser {
@@ -70,8 +70,10 @@ public GraphQLSchema parseQuery(
7070
);
7171
} catch (Exception e) {
7272
throw new GraphQLObjectMapperException(
73-
singletonMap("arguments", "invalid"),
74-
"invalid arguments json: " + arguments,
73+
EzyMapBuilder.mapBuilder()
74+
.put("arguments", "invalid")
75+
.put("message", e.getMessage())
76+
.toMap(),
7577
e
7678
);
7779
}

ezyhttp-server-graphql/src/test/java/com/tvd12/ezyhttp/server/graphql/test/controller/GraphQLControllerTest.java

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import com.tvd12.ezyfox.exception.EzyNotImplementedException;
5+
import com.tvd12.ezyhttp.core.exception.HttpBadRequestException;
6+
import com.tvd12.ezyhttp.core.exception.HttpInternalServerErrorException;
57
import com.tvd12.ezyhttp.core.exception.HttpNotAcceptableException;
68
import com.tvd12.ezyhttp.core.exception.HttpNotFoundException;
79
import com.tvd12.ezyhttp.server.core.request.RequestArguments;
810
import com.tvd12.ezyhttp.server.graphql.controller.GraphQLController;
911
import com.tvd12.ezyhttp.server.graphql.data.GraphQLDataFilter;
1012
import com.tvd12.ezyhttp.server.graphql.data.GraphQLRequest;
1113
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLInvalidSchemeException;
12-
import com.tvd12.ezyhttp.server.graphql.exception.GraphQLObjectMapperException;
1314
import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLDataFetcher;
1415
import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLDataFetcherManager;
1516
import com.tvd12.ezyhttp.server.graphql.interceptor.GraphQLInterceptor;
@@ -74,12 +75,14 @@ public void test() throws Exception {
7475

7576
// when
7677
Object meResult = controller.doPost(arguments, meRequest);
77-
Object heroResult = controller.doGet(arguments, heroQuery, null);
78+
Throwable e = Asserts.assertThrows(() ->
79+
controller.doGet(arguments, heroQuery, null)
80+
);
7881

7982
// then
8083
Asserts.assertFalse(controller.isAuthenticated());
8184
Asserts.assertEquals(meResult.toString(), "{me={bank={id=100}, name=Dzung, friends=[{name=Foo}, {name=Bar}]}}");
82-
Asserts.assertEquals(heroResult.toString(), "{hero=Hero 007}");
85+
Asserts.assertEqualsType(e, HttpInternalServerErrorException.class);
8386

8487
verify(interceptorManager, times(2)).getRequestInterceptors();
8588
verifyNoMoreInteractions(interceptorManager);
@@ -91,7 +94,7 @@ public void test() throws Exception {
9194
any(GraphQLQueryDefinition.class),
9295
any(GraphQLDataFetcher.class)
9396
);
94-
verify(interceptor, times(2)).postHandle(
97+
verify(interceptor, times(1)).postHandle(
9598
any(RequestArguments.class),
9699
any(String.class),
97100
any(String.class),
@@ -230,12 +233,14 @@ public void getAllFriendFields() {
230233

231234
// when
232235
Object meResult = controller.doPost(arguments, meRequest);
233-
Object heroResult = controller.doGet(arguments, heroQuery, null);
236+
Throwable e = Asserts.assertThrows(() ->
237+
controller.doGet(arguments, heroQuery, null)
238+
);
234239

235240
// then
236241
Asserts.assertFalse(controller.isAuthenticated());
237242
Asserts.assertEquals(meResult.toString(), "{me={bank={id=100}, name=Dzung, friends=[{name=Foo, id=1}, {name=Bar, id=1}]}}");
238-
Asserts.assertEquals(heroResult.toString(), "{hero=Hero 007}");
243+
Asserts.assertEqualsType(e, HttpInternalServerErrorException.class);
239244

240245
verify(interceptorManager, times(2)).getRequestInterceptors();
241246
verifyNoMoreInteractions(interceptorManager);
@@ -247,7 +252,7 @@ public void getAllFriendFields() {
247252
any(GraphQLQueryDefinition.class),
248253
any(GraphQLDataFetcher.class)
249254
);
250-
verify(interceptor, times(2)).postHandle(
255+
verify(interceptor, times(1)).postHandle(
251256
any(RequestArguments.class),
252257
any(String.class),
253258
any(String.class),
@@ -401,34 +406,26 @@ public void testQueryWithVariables() {
401406
welcomeRequest.setVariables(variables);
402407

403408
// when
404-
Object welcomeResult1 = controller.doGet(arguments, welcomeQuery, variablesString);
405-
Object welcomeResult2 = controller.doPost(arguments, welcomeRequest);
409+
Throwable e = Asserts.assertThrows(() ->
410+
controller.doGet(arguments, welcomeQuery, variablesString)
411+
);
406412

407413
// then
408-
Asserts.assertEquals(welcomeResult1.toString(), "{welcome=Welcome Foo}");
409-
Asserts.assertEquals(welcomeResult2.toString(), "{welcome=Welcome Foo}");
414+
Asserts.assertEqualsType(e, HttpInternalServerErrorException.class);
410415

411-
verify(interceptorManager, times(2)).getRequestInterceptors();
416+
verify(interceptorManager, times(1)).getRequestInterceptors();
412417
verifyNoMoreInteractions(interceptorManager);
413418

414-
verify(interceptor, times(2)).preHandle(
415-
any(RequestArguments.class),
416-
any(String.class),
417-
any(String.class),
418-
any(GraphQLQueryDefinition.class),
419-
any(GraphQLDataFetcher.class)
420-
);
421-
verify(interceptor, times(2)).postHandle(
419+
verify(interceptor, times(1)).preHandle(
422420
any(RequestArguments.class),
423421
any(String.class),
424422
any(String.class),
425423
any(GraphQLQueryDefinition.class),
426-
any(Object.class),
427424
any(GraphQLDataFetcher.class)
428425
);
429426
verifyNoMoreInteractions(interceptor);
430427

431-
verify(arguments, times(6)).setArgument(
428+
verify(arguments, times(3)).setArgument(
432429
any(Object.class),
433430
any(Object.class)
434431
);
@@ -609,6 +606,6 @@ public void doGetTestException() {
609606
Throwable e = Asserts.assertThrows(() -> controller.doGet(arguments, heroQuery, "abc"));
610607

611608
// then
612-
Asserts.assertEqualsType(e, GraphQLObjectMapperException.class);
609+
Asserts.assertEqualsType(e, HttpBadRequestException.class);
613610
}
614611
}

0 commit comments

Comments
 (0)