-- | Blockfrost API definitions

{-# OPTIONS_HADDOCK hide #-}

module Blockfrost.API
  ( BlockfrostAPI (..)
  , BlockfrostV0API (..)
  , CommonAPI (..)
  , CardanoAPI (..)
  , IPFSAPI (..)
  , NutLinkAPI (..)
  , module Blockfrost.API.Cardano
  , api
  , api0
  , ServantBlockfrostAPI
  , BlockfrostAuth
  , Project (..)
  , Form (..)
  ) where

import Data.Proxy (Proxy (..))
import Servant.API
import Servant.API.Generic

import Blockfrost.API.Cardano
import Blockfrost.API.Common
import Blockfrost.API.IPFS
import Blockfrost.API.NutLink
import Blockfrost.Auth
import Blockfrost.Types
import Blockfrost.Util.Tag (Tag)
import Blockfrost.Util.UserAgent (UserAgent)

-- * API

-- ** Our custom auth

type BlockfrostAuth = ProjectAuth '[APIKeyInHeader "project_id"] Project

-- ** Generic API types

-- *** Toplevel

newtype BlockfrostAPI route =
  BlockfrostAPI
    {
      forall route.
BlockfrostAPI route
-> route
   :- ("api"
       :> ("v0"
           :> (BlockfrostAuth
               :> (UserAgent :> ToServantApi BlockfrostV0API))))
_apiV0 :: route
      :- "api"
      :> "v0"
      :> BlockfrostAuth
      :> UserAgent
      :> ToServantApi BlockfrostV0API
    } deriving ((forall x. BlockfrostAPI route -> Rep (BlockfrostAPI route) x)
-> (forall x. Rep (BlockfrostAPI route) x -> BlockfrostAPI route)
-> Generic (BlockfrostAPI route)
forall x. Rep (BlockfrostAPI route) x -> BlockfrostAPI route
forall x. BlockfrostAPI route -> Rep (BlockfrostAPI route) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall route x. Rep (BlockfrostAPI route) x -> BlockfrostAPI route
forall route x. BlockfrostAPI route -> Rep (BlockfrostAPI route) x
$cfrom :: forall route x. BlockfrostAPI route -> Rep (BlockfrostAPI route) x
from :: forall x. BlockfrostAPI route -> Rep (BlockfrostAPI route) x
$cto :: forall route x. Rep (BlockfrostAPI route) x -> BlockfrostAPI route
to :: forall x. Rep (BlockfrostAPI route) x -> BlockfrostAPI route
Generic)

-- *** V0, requiring auth

data BlockfrostV0API route =
  BlockfrostV0API
    {
      forall route.
BlockfrostV0API route -> route :- ToServantApi CommonAPI
_common  :: route :- ToServantApi CommonAPI
    , forall route.
BlockfrostV0API route -> route :- ToServantApi CardanoAPI
_cardano :: route :- ToServantApi CardanoAPI
    , forall route.
BlockfrostV0API route -> route :- ("ipfs" :> ToServantApi IPFSAPI)
_ipfs    :: route :- "ipfs" :> ToServantApi IPFSAPI
    , forall route.
BlockfrostV0API route
-> route
   :- ("nutlink" :> (Tag "Nut.link" :> ToServantApi NutLinkAPI))
_nutLink :: route :- "nutlink"  :> Tag "Nut.link" :> ToServantApi NutLinkAPI
    } deriving ((forall x. BlockfrostV0API route -> Rep (BlockfrostV0API route) x)
-> (forall x.
    Rep (BlockfrostV0API route) x -> BlockfrostV0API route)
-> Generic (BlockfrostV0API route)
forall x. Rep (BlockfrostV0API route) x -> BlockfrostV0API route
forall x. BlockfrostV0API route -> Rep (BlockfrostV0API route) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall route x.
Rep (BlockfrostV0API route) x -> BlockfrostV0API route
forall route x.
BlockfrostV0API route -> Rep (BlockfrostV0API route) x
$cfrom :: forall route x.
BlockfrostV0API route -> Rep (BlockfrostV0API route) x
from :: forall x. BlockfrostV0API route -> Rep (BlockfrostV0API route) x
$cto :: forall route x.
Rep (BlockfrostV0API route) x -> BlockfrostV0API route
to :: forall x. Rep (BlockfrostV0API route) x -> BlockfrostV0API route
Generic)

-- *** Services

data CardanoAPI route =
  CardanoAPI
    {
      forall route.
CardanoAPI route
-> route
   :- ("accounts"
       :> (Tag "Cardano \187 Accounts" :> ToServantApi AccountsAPI))
_accounts
      :: route
      :- "accounts"
      :> Tag "Cardano » Accounts"
      :> ToServantApi AccountsAPI
    , forall route.
CardanoAPI route
-> route
   :- ("addresses"
       :> (Tag "Cardano \187 Addresses" :> ToServantApi AddressesAPI))
_addresses
      :: route
      :- "addresses"
      :> Tag "Cardano » Addresses"
      :> ToServantApi AddressesAPI
    , forall route.
CardanoAPI route
-> route
   :- ("assets"
       :> (Tag "Cardano \187 Assets" :> ToServantApi AssetsAPI))
_assets
      :: route
      :- "assets"
      :> Tag "Cardano » Assets"
      :> ToServantApi AssetsAPI
    , forall route.
CardanoAPI route
-> route
   :- ("blocks"
       :> (Tag "Cardano \187 Blocks" :> ToServantApi BlocksAPI))
_blocks
      :: route
      :- "blocks"
      :> Tag "Cardano » Blocks"
      :> ToServantApi BlocksAPI
    , forall route.
CardanoAPI route
-> route
   :- ("epochs"
       :> (Tag "Cardano \187 Epochs" :> ToServantApi EpochsAPI))
_epochs
      :: route
      :- "epochs"
      :> Tag "Cardano » Epochs"
      :> ToServantApi EpochsAPI
    , forall route.
CardanoAPI route
-> route
   :- ("genesis"
       :> (Tag "Cardano \187 Ledger" :> ToServantApi LedgerAPI))
_ledger
      :: route
      :- "genesis"
      :> Tag "Cardano » Ledger"
      :> ToServantApi LedgerAPI
    , forall route.
CardanoAPI route
-> route
   :- ("mempool"
       :> (Tag "Cardano \187 Mempool" :> ToServantApi MempoolAPI))
_mempool
      :: route
      :- "mempool"
      :> Tag "Cardano » Mempool"
      :> ToServantApi MempoolAPI
    , forall route.
CardanoAPI route
-> route
   :- ("metadata"
       :> (Tag "Cardano \187 Metadata" :> ToServantApi MetadataAPI))
_metadata
      :: route
      :- "metadata"
      :> Tag "Cardano » Metadata"
      :> ToServantApi MetadataAPI
    , forall route.
CardanoAPI route
-> route
   :- ("network"
       :> (Tag "Cardano \187 Network" :> ToServantApi NetworkAPI))
_network
      :: route
      :- "network"
      :> Tag "Cardano » Network"
      :> ToServantApi NetworkAPI
    , forall route.
CardanoAPI route
-> route
   :- ("pools" :> (Tag "Cardano \187 Pools" :> ToServantApi PoolsAPI))
_pools
      :: route
      :- "pools"
      :> Tag "Cardano » Pools"
      :> ToServantApi PoolsAPI
    , forall route.
CardanoAPI route
-> route
   :- ("scripts"
       :> (Tag "Cardano \187 Scripts" :> ToServantApi ScriptsAPI))
_scripts
      :: route
      :- "scripts"
      :> Tag "Cardano » Scripts"
      :> ToServantApi ScriptsAPI
    , forall route.
CardanoAPI route
-> route
   :- ("txs"
       :> (Tag "Cardano \187 Transactions"
           :> ToServantApi TransactionsAPI))
_transactions
      :: route
      :- "txs"
      :> Tag "Cardano » Transactions"
      :> ToServantApi TransactionsAPI
    , forall route.
CardanoAPI route
-> route
   :- (Summary "Submit a transaction"
       :> (Description
             "Submit an already serialized transaction to the network."
           :> (Tag "Cardano \187 Transactions"
               :> ("tx"
                   :> ("submit"
                       :> (ReqBody '[CBOR] CBORString :> Post '[JSON] TxHash))))))
_txSubmit
      :: route
      :- Summary "Submit a transaction"
      :> Description "Submit an already serialized transaction to the network."
      :> Tag "Cardano » Transactions"
      :> "tx"
      :> "submit"
      :> ReqBody '[CBOR] CBORString
      :> Post '[JSON] TxHash
    , forall route.
CardanoAPI route
-> route
   :- ("utils"
       :> (Tag "Cardano \187 Utilities" :> ToServantApi UtilsAPI))
_utils
      :: route
      :- "utils"
      :> Tag "Cardano » Utilities"
      :> ToServantApi UtilsAPI
    } deriving ((forall x. CardanoAPI route -> Rep (CardanoAPI route) x)
-> (forall x. Rep (CardanoAPI route) x -> CardanoAPI route)
-> Generic (CardanoAPI route)
forall x. Rep (CardanoAPI route) x -> CardanoAPI route
forall x. CardanoAPI route -> Rep (CardanoAPI route) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall route x. Rep (CardanoAPI route) x -> CardanoAPI route
forall route x. CardanoAPI route -> Rep (CardanoAPI route) x
$cfrom :: forall route x. CardanoAPI route -> Rep (CardanoAPI route) x
from :: forall x. CardanoAPI route -> Rep (CardanoAPI route) x
$cto :: forall route x. Rep (CardanoAPI route) x -> CardanoAPI route
to :: forall x. Rep (CardanoAPI route) x -> CardanoAPI route
Generic)

type ServantBlockfrostAPI = ToServantApi BlockfrostAPI

api :: Proxy (ToServantApi BlockfrostAPI)
api :: Proxy (ToServantApi BlockfrostAPI)
api = Proxy BlockfrostAPI -> Proxy (ToServantApi BlockfrostAPI)
forall (routes :: * -> *).
GenericServant routes AsApi =>
Proxy routes -> Proxy (ToServantApi routes)
genericApi (Proxy BlockfrostAPI
forall {k} (t :: k). Proxy t
Proxy :: Proxy BlockfrostAPI)

api0 :: Proxy (ToServantApi BlockfrostV0API)
api0 :: Proxy (ToServantApi BlockfrostV0API)
api0 = Proxy BlockfrostV0API -> Proxy (ToServantApi BlockfrostV0API)
forall (routes :: * -> *).
GenericServant routes AsApi =>
Proxy routes -> Proxy (ToServantApi routes)
genericApi (Proxy BlockfrostV0API
forall {k} (t :: k). Proxy t
Proxy :: Proxy BlockfrostV0API)