rest-api/src/jetbrains/buildServer/server/graphql/GraphQLEndpoint.java (61 lines of code) (raw):
/*
* Copyright 2000-2024 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.buildServer.server.graphql;
import com.fasterxml.jackson.databind.ObjectMapper;
import graphql.*;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import jetbrains.buildServer.server.graphql.util.GraphQLRequestBody;
import jetbrains.buildServer.server.rest.request.Constants;
import jetbrains.buildServer.util.NamedThreadFactory;
import jetbrains.buildServer.web.util.SessionUser;
import org.jetbrains.annotations.NotNull;
@Path(Constants.GRAPHQL_API_URL)
public class GraphQLEndpoint {
@NotNull
@Inject
private GraphQL myGraphQL;
@NotNull
private final ObjectMapper myObjectMapper = new ObjectMapper();
@GET
@Produces({MediaType.APPLICATION_JSON})
public String get(@QueryParam("query") String query,
@QueryParam("operationName") String operationName,
@QueryParam("variables") String variables,
@Context HttpServletRequest request)
throws Exception {
return handle(new GraphQLRequestBody(query, operationName, variables), request);
}
@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public String post(String json, @Context HttpServletRequest request) throws Exception {
return handle(GraphQLRequestBody.fromJson(json), request);
}
@NotNull
private String handle(@NotNull GraphQLRequestBody body, @NotNull HttpServletRequest request) throws Exception {
ExecutionResult result;
if(body.query == null) {
result = ExecutionResultImpl.newExecutionResult()
.addError(GraphqlErrorException.newErrorException()
.message("Query can't be empty.")
.build())
.build();
} else {
ExecutionInput.Builder inputBuilder = ExecutionInput
.newExecutionInput()
.graphQLContext(builder -> builder.of(jetbrains.buildServer.server.graphql.util.Context.CURRENT_USER, SessionUser.getUser(request)).build())
.query(body.query);
if (body.operationName != null) {
inputBuilder.operationName(body.operationName);
}
if (body.variables != null) {
inputBuilder.variables(body.variables);
}
ExecutionInput input = inputBuilder.build();
result = NamedThreadFactory.executeWithNewThreadName("Processing GraphQL request", () -> myGraphQL.execute(input));
}
return myObjectMapper.writeValueAsString(result.toSpecification());
}
}