packages feed

api-rpc-accumulate-0.1.0.0: src/Accumulate/RPC/Api.hs

{-# LANGUAGE DataKinds                  #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE FlexibleInstances          #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE ScopedTypeVariables        #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeFamilies               #-}
{-# LANGUAGE TypeOperators              #-}

module Accumulate.RPC.Api
  ( runTCPClient
  , reqGetData
  ) where

import           Control.Concurrent
import           Control.Exception                     (bracket)
import           Control.Monad.IO.Class
import           Control.Remote.Monad.JSON
import           Control.Remote.Monad.JSON.Client
import           Control.Remote.Monad.JSON.Router
import           Control.Remote.Monad.JSON.Trace
import           Data.Aeson
import           Data.Aeson.Types
import           Data.Text                             as T
import           Network.Socket                        (HostName, ServiceName,
                                                        SocketType (Stream),
                                                        addrAddress, addrFamily,
                                                        addrProtocol,
                                                        addrSocketType, close,
                                                        connect, defaultHints,
                                                        getAddrInfo, socket)

import           Accumulate.RPC.JsonRpc                    (JsonRpcT, runJsonRpcT)
import           Accumulate.RPC.Types.ApiDataResponse
import           Accumulate.RPC.Types.ApiDataMetricsResponse
import           Accumulate.RPC.Types.ApiDataVersionResponse

--------------------------------------------------------------------------------

endpoint = "http://95.141.37.250:35554/v1"

runTCPClient :: HostName -> ServiceName -> JsonRpcT IO a -> IO a
runTCPClient host port f = do
  addr <- resolve host port
  bracket (open addr) close talk
  where
    resolve host' port' = do
      let hints = defaultHints {addrSocketType = Stream}
      addr:_ <- getAddrInfo (Just hints) (Just host') (Just port')
      return addr
    open addr = do
      sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
      connect sock $ addrAddress addr
      return sock
    talk sock = runJsonRpcT sock f


-- Options to convert internal types into Aeson values
-- $ Named [("jsonrpc", String "2.0"), ("id", toJSON (0::Int))]

--------------------------------------------------------------------------------
-- Data retrieval methods

-- |  getData returns Accumulate Object by URL
--
reqGetData :: Text -> RPC APIDataResponse
reqGetData url = method "get" $ Named [("url", String url)] --  Named [("wait", Bool False), ("url", String url)]

-- |  GetDirectory returns ADI directory entries
--
reqGetDirectory :: Text -> RPC ()
reqGetDirectory url = method "get-directory" $ List [String url]

--------------------------------------------------------------------------------
-- ADIs

-- |
--
reqGetADI :: Text -> RPC ()
reqGetADI url = method "adi" $ List [String url]

-- |
--
reqCreateADI :: Text -> RPC ()
reqCreateADI url = method "adi-create" $ List [String url]


--------------------------------------------------------------------------------
-- Key Management

-- |
--
reqGetKeyBook :: Text -> RPC ()
reqGetKeyBook url = method "sig-spec-group" $ List [String url]


--------------------------------------------------------------------------------
-- Tokens

-- | Get infromation about token
--
reqGetToken :: Text -> RPC ()
reqGetToken url = method "token" $ List [String url]


-- | Get information about token transaction
--
reqGetTokenTx :: Text -> RPC ()
reqGetTokenTx txid = method "token-tx" $ List [String txid]

-- | Create new token transaction
--
reqCreateTokenTx :: Text -> RPC ()
reqCreateTokenTx url = method "token-tx-create" $ List [String url]

--------------------------------------------------------------------------------
-- Metrics

-- |
--
reqGetMetrics :: Text -> Text -> RPC APIDataMetricsResponse
reqGetMetrics metricName duration =
  method "metrics" $ Named [ ("metric"  , String metricName)
                           , ("duration", String duration)
                           ]

reqGetVersion :: RPC APIDataVersionResponse
reqGetVersion = method "version" $ List []


--------------------------------------------------------------------------------
-- Faucet

-- |
--
reqFaucet :: Text -> RPC ()
reqFaucet url = method "faucet" $ Named [("url", String url)]


--------------------------------------------------------------------------------
-- Credits

-- |
--
reqAddCredits :: Text -> RPC ()
reqAddCredits url = method "add-credits" $ List [String url]


main = do
  let s = weakSession (traceSendAPI "" $ clientSendAPI endpoint)
  (m,v) <-
    send s $ do
      --h <- reqGetData "acc://c9359900016daa23da0f4c07e66be42c398fe2b10017cecb/ACME"
      --t <- reqGetTokenTx ""
      m <- reqGetMetrics "tps" "1h"
      v <- reqGetVersion
      return (m, v)
  putStrLn "-----------"
  print $ show $ m
  putStrLn "-----------"
  print $ show $ v