package spring.verticles; import io.vertx.core.AbstractVerticle; import io.vertx.core.Future; import io.vertx.core.Promise; import io.vertx.core.buffer.Buffer; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.Router; import io.vertx.ext.web.client.HttpResponse; import io.vertx.ext.web.client.WebClient; import io.vertx.ext.web.handler.BodyHandler; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class ProxyVerticle extends AbstractVerticle { @Value(value = "${http.port}") private int httpPort; @Value(value = "${tdg.port}") private int tdgPort; @Value(value = "${server.host}") private String serverHost; private Router router; @Override public void start() throws Exception { super.start(); this.router = Router.router(vertx); createHttpServer(); bodyHandlerEnabler(); buildPostRoute(); } private void bodyHandlerEnabler() { router.route().handler(BodyHandler.create()); } private void createHttpServer() { vertx.createHttpServer() .requestHandler(router) .listen(httpPort); } private void buildPostRoute() { router.post("/post") .handler(rc -> { this.graphql(rc.getBodyAsJson()) .onSuccess(httpResp -> { if (httpResp.statusCode() == 200) { rc.end(httpResp.bodyAsBuffer()); } }); }); } private Future> graphql(JsonObject request) { Promise> promise = Promise.promise(); WebClient.create(vertx) .post(tdgPort, serverHost, "/graphql") .putHeader("Content-Type", "application/json") .sendJson(request, t -> { if (t.succeeded()) { promise.complete(t.result()); } }); return promise.future(); } }