Skip to content

Commit c0faf27

Browse files
committed
Use Exceptions for Failure
1 parent e6236d0 commit c0faf27

19 files changed

Lines changed: 180 additions & 213 deletions

backend/src/main/java/club/devcord/devmarkt/auth/OwnApplicationDirective.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import club.devcord.devmarkt.auth.error.UnauthorizedError;
2020
import club.devcord.devmarkt.entities.auth.User;
21-
import club.devcord.devmarkt.responses.Failure;
21+
import club.devcord.devmarkt.responses.FailureException;
2222
import club.devcord.devmarkt.responses.failure.application.ErrorCode;
2323
import club.devcord.devmarkt.services.ApplicationService;
2424
import graphql.execution.DataFetcherResult;
@@ -69,11 +69,10 @@ public GraphQLFieldDefinition onField(
6969
}
7070
LOGGER.info("Rejecting request because user {} doesn't own application id: {}",
7171
user.id(), value);
72-
return fieldBooleanReturn
73-
? false
74-
: DataFetcherResult.newResult()
75-
.data(new Failure<>(ErrorCode.NOT_FOUND))
76-
.build();
72+
if (fieldBooleanReturn) {
73+
return false;
74+
}
75+
throw new FailureException(ErrorCode.NOT_FOUND);
7776
};
7877

7978
environment.setFieldDataFetcher(authDataFetcher);

backend/src/main/java/club/devcord/devmarkt/auth/RoleDirective.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public GraphQLFieldDefinition onField(
5353
}
5454

5555
if (user.role() == expectedRole || user.role() == Role.ADMIN) {
56-
return originalDataFetcher.get(env);
56+
return originalDataFetcher.get(env);
5757
}
5858
LOGGER.info("Rejecting forbidden request for user {}", user.id());
5959
return DataFetcherResult.newResult()

backend/src/main/java/club/devcord/devmarkt/responses/Response.java renamed to backend/src/main/java/club/devcord/devmarkt/graphql/CustomInstrumentation.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@
1414
* limitations under the License.
1515
*/
1616

17-
package club.devcord.devmarkt.responses;
17+
package club.devcord.devmarkt.graphql;
1818

19-
public sealed interface Response<T> permits Failure, Success {
19+
import graphql.execution.instrumentation.SimpleInstrumentation;
20+
import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters;
21+
import graphql.schema.DataFetcher;
22+
import jakarta.inject.Singleton;
2023

21-
default Object graphQlUnion() {
22-
return this instanceof Success<T> success
23-
? success.value()
24-
: this;
25-
}
24+
@Singleton
25+
public class CustomInstrumentation extends SimpleInstrumentation {
2626

27+
@Override
28+
public DataFetcher<?> instrumentDataFetcher(DataFetcher<?> dataFetcher,
29+
InstrumentationFieldFetchParameters parameters) {
30+
return new ErrorHandlingDataFetcher<>(dataFetcher);
31+
}
2732
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2022 Contributors to the Devmarkt-Backend project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package club.devcord.devmarkt.graphql;
18+
19+
import club.devcord.devmarkt.responses.Failure;
20+
import club.devcord.devmarkt.responses.FailureException;
21+
import graphql.execution.DataFetcherResult;
22+
import graphql.schema.DataFetcher;
23+
import graphql.schema.DataFetchingEnvironment;
24+
25+
public class ErrorHandlingDataFetcher<T> implements DataFetcher<Object> {
26+
27+
private final DataFetcher<T> originalDataFetcher;
28+
29+
public ErrorHandlingDataFetcher(DataFetcher<T> originalDataFetcher) {
30+
this.originalDataFetcher = originalDataFetcher;
31+
}
32+
33+
@Override
34+
public Object get(DataFetchingEnvironment environment) throws Exception {
35+
try {
36+
return originalDataFetcher.get(environment);
37+
} catch (FailureException exception) {
38+
return DataFetcherResult.newResult()
39+
.data(new Failure(exception.errors()))
40+
.build();
41+
}
42+
}
43+
}

backend/src/main/java/club/devcord/devmarkt/graphql/GraphQLFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ public GraphQL graphQL(
5454
ResourceResolver resourceResolver,
5555
BeanContext context,
5656
RoleDirective roleDirective,
57-
OwnApplicationDirective ownApplicationDirective) {
57+
OwnApplicationDirective ownApplicationDirective,
58+
CustomInstrumentation customInstrumentation) {
5859
var builder = new SchemaParserBuilder()
5960
.scalars(JavaPrimitives.GraphQLLong, TemplateNameScalar.TEMPLATE_NAME,
6061
ExtendedScalars.NonNegativeInt, ExtendedScalars.PositiveInt, ExtendedScalars.DateTime,
@@ -72,6 +73,7 @@ public GraphQL graphQL(
7273
.makeExecutableSchema();
7374

7475
return GraphQL.newGraphQL(schema)
76+
.instrumentation(customInstrumentation)
7577
.build();
7678
}
7779

backend/src/main/java/club/devcord/devmarkt/graphql/application/ApplicationMutation.java

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
package club.devcord.devmarkt.graphql.application;
1818

1919
import club.devcord.devmarkt.entities.application.Answer;
20+
import club.devcord.devmarkt.entities.application.Application;
2021
import club.devcord.devmarkt.entities.application.ApplicationStatus;
2122
import club.devcord.devmarkt.entities.auth.User;
22-
import club.devcord.devmarkt.logging.LoggingUtil;
2323
import club.devcord.devmarkt.services.ApplicationService;
2424
import graphql.kickstart.tools.GraphQLMutationResolver;
2525
import graphql.schema.DataFetchingEnvironment;
@@ -39,33 +39,22 @@ public ApplicationMutation(ApplicationService service) {
3939
this.service = service;
4040
}
4141

42-
public Object createApplication(String templateName, ArrayList<Answer> answers,
42+
public Application createApplication(String templateName, ArrayList<Answer> answers,
4343
DataFetchingEnvironment environment) {
4444
var user = (User) environment.getGraphQlContext().get("user");
45-
var response = service.createApplication(templateName, answers, user);
46-
LOGGER.info("Application creation: User: {}, TemplateName: {}, Successful: {}",
47-
user.id(), templateName, LoggingUtil.responseStatus(response));
48-
return response.graphQlUnion();
45+
return service.createApplication(templateName, answers, user);
4946
}
5047

5148
public boolean deleteApplication(int id) {
52-
var response = service.deleteApplication(id);
53-
LOGGER.info("Application deletion. ID: {}, Successful: {}", id, response);
54-
return response;
49+
return service.deleteApplication(id);
5550
}
5651

57-
public Object updateApplication(int id, ArrayList<Answer> updatedAnswers) {
58-
var response = service.updateApplication(id, updatedAnswers);
59-
LOGGER.info("Application update. ID: {}, AnswerNumbers: {}, Response: {}", id,
60-
updatedAnswers.stream().map(Answer::number).toArray(),
61-
LoggingUtil.responseStatus(response));
62-
return response.graphQlUnion();
52+
public Application updateApplication(int id, ArrayList<Answer> updatedAnswers) {
53+
return service.updateApplication(id, updatedAnswers);
6354
}
6455

6556
public boolean processApplication(int id, ApplicationStatus status) {
66-
var response = service.processApplication(id, status);
67-
LOGGER.info("Application process. ID: {}, Successful: {}, Status: {}", id, response, status);
68-
return response;
57+
return service.processApplication(id, status);
6958
}
7059

7160
}

backend/src/main/java/club/devcord/devmarkt/graphql/application/ApplicationQuery.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package club.devcord.devmarkt.graphql.application;
1818

19-
import club.devcord.devmarkt.logging.LoggingUtil;
19+
import club.devcord.devmarkt.entities.application.Application;
2020
import club.devcord.devmarkt.services.ApplicationService;
2121
import graphql.kickstart.tools.GraphQLQueryResolver;
2222
import jakarta.inject.Singleton;
@@ -34,10 +34,7 @@ public ApplicationQuery(ApplicationService service) {
3434
this.service = service;
3535
}
3636

37-
public Object application(int id) {
38-
var response = service.application(id);
39-
LOGGER.info("Application fetched with id: {} Successful: {}", id,
40-
LoggingUtil.responseStatus(response));
41-
return response.graphQlUnion();
37+
public Application application(int id) {
38+
return service.application(id);
4239
}
4340
}

backend/src/main/java/club/devcord/devmarkt/graphql/role/RoleQuery.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public class RoleQuery implements GraphQLQueryResolver {
2828
private static final Logger LOGGER = LoggerFactory.getLogger(RoleQuery.class);
2929

3030
public Role[] roles() {
31-
LOGGER.info("All roles fetched.");
3231
return Role.values();
3332
}
3433
}

backend/src/main/java/club/devcord/devmarkt/graphql/template/TemplateMutation.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package club.devcord.devmarkt.graphql.template;
1818

1919
import club.devcord.devmarkt.entities.template.Question;
20+
import club.devcord.devmarkt.entities.template.Template;
2021
import club.devcord.devmarkt.entities.template.TemplateUpdateInput;
21-
import club.devcord.devmarkt.logging.LoggingUtil;
2222
import club.devcord.devmarkt.services.TemplateService;
2323
import graphql.kickstart.tools.GraphQLMutationResolver;
2424
import jakarta.inject.Singleton;
@@ -37,11 +37,8 @@ public TemplateMutation(TemplateService service) {
3737
this.service = service;
3838
}
3939

40-
public Object createTemplate(String name, List<Question> questions) {
41-
var response = service.create(name, questions);
42-
LOGGER.info("template creation. Response: {}, Name: {}", LoggingUtil.responseStatus(response),
43-
name);
44-
return response.graphQlUnion();
40+
public Template createTemplate(String name, List<Question> questions) {
41+
return service.create(name, questions);
4542
}
4643

4744
public boolean deleteTemplate(String name) {
@@ -50,10 +47,7 @@ public boolean deleteTemplate(String name) {
5047
return response;
5148
}
5249

53-
public Object updateTemplate(String templateName, TemplateUpdateInput updatedTemplate) {
54-
var response = service.update(templateName, updatedTemplate);
55-
LOGGER.info("Template update. Successful: {}, Updated: {}",
56-
LoggingUtil.responseStatus(response), updatedTemplate);
57-
return response.graphQlUnion();
50+
public Template updateTemplate(String templateName, TemplateUpdateInput updatedTemplate) {
51+
return service.update(templateName, updatedTemplate);
5852
}
5953
}

backend/src/main/java/club/devcord/devmarkt/graphql/template/TemplateQuery.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package club.devcord.devmarkt.graphql.template;
1818

1919
import club.devcord.devmarkt.entities.template.Template;
20-
import club.devcord.devmarkt.logging.LoggingUtil;
2120
import club.devcord.devmarkt.services.TemplateService;
2221
import graphql.kickstart.tools.GraphQLQueryResolver;
2322
import graphql.schema.DataFetchingEnvironment;
@@ -38,11 +37,8 @@ public TemplateQuery(TemplateService service) {
3837
this.service = service;
3938
}
4039

41-
public Object template(String name) {
42-
var response = service.find(name);
43-
LOGGER.info("Template fetching. Response: {}, Name: {}", LoggingUtil.responseStatus(response),
44-
name);
45-
return response.graphQlUnion();
40+
public Template template(String name) {
41+
return service.find(name);
4642
}
4743

4844
public List<Template> templates(DataFetchingEnvironment environment) {

0 commit comments

Comments
 (0)