001package org.consensusj.jsonrpc.daemon;
002
003import com.fasterxml.jackson.databind.PropertyNamingStrategies;
004import io.micronaut.core.annotation.TypeHint;
005import io.micronaut.http.MediaType;
006import io.micronaut.http.annotation.Body;
007import io.micronaut.http.annotation.Controller;
008import io.micronaut.http.annotation.Post;
009import org.consensusj.jsonrpc.JsonRpcRequest;
010import org.consensusj.jsonrpc.JsonRpcResponse;
011import org.consensusj.jsonrpc.JsonRpcService;
012import org.slf4j.Logger;
013import org.slf4j.LoggerFactory;
014
015import java.util.ArrayList;
016import java.util.HashSet;
017import java.util.LinkedHashMap;
018import java.util.concurrent.CompletableFuture;
019
020/**
021 * Create a REST endpoint from a JsonRpcService
022 * Here we're using Micronaut annotations to wrap the JsonRpcService
023 * in an HTTP environment and to serialize JSON to and from Java POJOs.
024 */
025@TypeHint(
026        value = {
027                PropertyNamingStrategies.UpperCamelCaseStrategy.class,
028                ArrayList.class,
029                LinkedHashMap.class,
030                HashSet.class,
031                JsonRpcRequest.class,
032                JsonRpcResponse.class,
033                EchoJsonRpcService.class
034        },
035        accessType = {TypeHint.AccessType.ALL_DECLARED_CONSTRUCTORS, TypeHint.AccessType.ALL_DECLARED_METHODS}
036)
037@Controller("/")
038public class JsonRpcController {
039    private static final Logger log = LoggerFactory.getLogger(JsonRpcController.class);
040    private final JsonRpcService jsonRpcService;
041
042    public JsonRpcController(JsonRpcService jsonRpcService) {
043        log.info("Constructing JsonRpcController using {}", jsonRpcService);
044        this.jsonRpcService = jsonRpcService;
045    }
046
047    @Post(produces = MediaType.APPLICATION_JSON)
048    public CompletableFuture<JsonRpcResponse<Object>> index(@Body JsonRpcRequest request) {
049        log.debug("JSON-RPC call: {}", request.getMethod());
050        return jsonRpcService.call(request);
051    }
052}