com.xlrit.gears.server.graphql.GraphqlConfiguration Maven / Gradle / Ivy
package com.xlrit.gears.server.graphql;
import jakarta.persistence.EntityManager;
import com.xlrit.gears.base.model.User;
import com.xlrit.gears.engine.error.InputErrors;
import com.xlrit.gears.engine.facade.InProgress;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.flowable.engine.runtime.ProcessInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.graphql.GraphQlProperties;
import org.springframework.boot.autoconfigure.graphql.GraphQlSourceBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.graphql.execution.BatchLoaderRegistry;
import org.springframework.graphql.execution.ClassNameTypeResolver;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
import org.springframework.graphql.server.WebGraphQlHandler;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.*;
import static com.xlrit.gears.server.graphql.GraphqlMultipartHandler.SUPPORTED_RESPONSE_MEDIA_TYPES;
import static org.springframework.http.MediaType.MULTIPART_FORM_DATA;
@Configuration
public class GraphqlConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(GraphqlConfiguration.class);
public GraphqlConfiguration(BatchLoaderRegistry registry, EntityManager entityManager) {
new EntityBatchLoader<>(entityManager, User.class).registerSelf(registry);
}
@Bean
public RuntimeWiringConfigurer runtimeWiringConfigurer(ObjectMapper objectMapper) {
return wiringBuilder -> wiringBuilder
.scalar(CustomScalars.json(objectMapper))
.scalar(CustomScalars.upload())
.scalar(OffsetDateTimeScalar.INSTANCE);
}
@Bean
public GraphQlSourceBuilderCustomizer sourceBuilderCustomizer() {
ClassNameTypeResolver typeResolver = new ClassNameTypeResolver();
// union SubmitResult = SubmitInProgress | ProcessInstance | InputErrors
typeResolver.addMapping(InProgress.class, "SubmitInProgress");
typeResolver.addMapping(ProcessInstance.class, "ProcessInstance");
typeResolver.addMapping(InputErrors.class, "InputErrors");
return builder -> builder
.defaultTypeResolver(typeResolver)
.inspectSchemaMappings(schemaReport -> LOG.info("{}", schemaReport));
}
@Bean
@Order(1)
public RouterFunction graphQlMultipartRouterFunction(
GraphQlProperties properties,
WebGraphQlHandler webGraphQlHandler,
ObjectMapper objectMapper
) {
String path = properties.getPath();
GraphqlMultipartHandler graphqlMultipartHandler = new GraphqlMultipartHandler(webGraphQlHandler, objectMapper);
RequestPredicate predicate = RequestPredicates.contentType(MULTIPART_FORM_DATA)
.and(RequestPredicates.accept(SUPPORTED_RESPONSE_MEDIA_TYPES.toArray(MediaType[]::new)));
return RouterFunctions.route()
.POST(path, predicate, graphqlMultipartHandler::handleRequest)
.build();
}
}