-- |
-- Module: PowerDNS.API
-- Description: Servant based wrapper for PowerDNS.
--
-- This module exports a complete servant API description of the PowerDNS. May be useful to some.

{-# LANGUAGE DataKinds     #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}
module PowerDNS.API
  ( API
  , api
  , PowerDNS(..)
  , module PowerDNS.API.Version
  , module PowerDNS.API.Zones
  , module PowerDNS.API.Servers
  , module PowerDNS.API.Cryptokeys
  , module PowerDNS.API.Metadata
  , module PowerDNS.API.TSIGKeys
  )
where

import Data.Proxy (Proxy(..))
import GHC.Generics (Generic)

import Servant.API

import PowerDNS.API.Cryptokeys
import PowerDNS.API.Metadata
import PowerDNS.API.Servers
import PowerDNS.API.TSIGKeys
import PowerDNS.API.Version
import PowerDNS.API.Zones

api :: Proxy API
api :: Proxy API
api = Proxy
  ((("api" :> Verb 'GET 200 '[JSON] [Version])
    :<|> (("api"
           :> ("v1"
               :> ((("servers" :> Get '[JSON] [Server])
                    :<|> ("servers"
                          :> (Capture "server_id" Text :> Get '[JSON] Server)))
                   :<|> (("servers"
                          :> (Capture "server_id" Text
                              :> ("search-data"
                                  :> (QueryParamReq "q" Text
                                      :> (QueryParamReq "max" Integer
                                          :> (QueryParam "object_type" ObjectType
                                              :> Get '[JSON] [SearchResult]))))))
                         :<|> (("servers"
                                :> (Capture "server_id" Text
                                    :> (QueryParamReq "domain" Text
                                        :> Put '[JSON] CacheFlushResult)))
                               :<|> ("servers"
                                     :> (Capture "server_id" Text
                                         :> ("statistics"
                                             :> (QueryParam "statistic" Text
                                                 :> (QueryParam "includerings" Bool
                                                     :> Get '[JSON] [AnyStatisticItem]))))))))))
          :<|> ("api"
                :> ("v1"
                    :> (((("servers"
                           :> (Capture "server_id" Text
                               :> ("zones"
                                   :> (QueryParam "zone" Text
                                       :> (QueryParam "dnssec" Bool :> Get '[JSON] [Zone])))))
                          :<|> ("servers"
                                :> (Capture "server_id" Text
                                    :> ("zones"
                                        :> (QueryParam "rrset" Bool
                                            :> (ReqBody '[JSON] Zone
                                                :> PostCreated '[JSON] Zone))))))
                         :<|> (("servers"
                                :> (Capture "server_id" Text
                                    :> ("zones"
                                        :> (Capture "zone_id" Text
                                            :> (QueryParam "rrsets" Bool :> Get '[JSON] Zone)))))
                               :<|> (("servers"
                                      :> (Capture "server_id" Text
                                          :> ("zones"
                                              :> (Capture "zone_id" Text :> DeleteNoContent))))
                                     :<|> ("servers"
                                           :> (Capture "server_id" Text
                                               :> ("zones"
                                                   :> (Capture "zone_id" Text
                                                       :> (ReqBody '[JSON] RRSets
                                                           :> PatchNoContent))))))))
                        :<|> ((("servers"
                                :> (Capture "server_id" Text
                                    :> ("zones"
                                        :> (Capture "zone_id" Text
                                            :> (ReqBody '[JSON] Zone :> PutNoContent)))))
                               :<|> ("servers"
                                     :> (Capture "server_id" Text
                                         :> ("zones"
                                             :> (Capture "zone_id" Text
                                                 :> ("axfr-retrieve" :> Put '[JSON] Result))))))
                              :<|> (("servers"
                                     :> (Capture "server_id" Text
                                         :> ("zones"
                                             :> (Capture "zone_id" Text
                                                 :> ("notify" :> Put '[JSON] Result)))))
                                    :<|> (("servers"
                                           :> (Capture "server_id" Text
                                               :> ("zones"
                                                   :> (Capture "zone_id" Text
                                                       :> ("export" :> Get '[JSON] Result)))))
                                          :<|> ("servers"
                                                :> (Capture "server_id" Text
                                                    :> ("zones"
                                                        :> (Capture "zone_id" Text
                                                            :> ("rectify"
                                                                :> Put '[JSON] Result)))))))))))))
   :<|> (("api"
          :> ("v1"
              :> ((("servers"
                    :> (Capture "server_id" Text
                        :> ("zones"
                            :> (Capture "zone_id" Text
                                :> ("cryptokeys" :> Get '[JSON] [Cryptokey])))))
                   :<|> ("servers"
                         :> (Capture "server_id" Text
                             :> ("zones"
                                 :> (Capture "zone_id" Text
                                     :> ("cryptokeys"
                                         :> (ReqBody '[JSON] Cryptokey
                                             :> PostCreated '[JSON] Cryptokey)))))))
                  :<|> (("servers"
                         :> (Capture "server_id" Text
                             :> ("zones"
                                 :> (Capture "zone_id" Text
                                     :> ("cryptokeys"
                                         :> (Capture "cryptokey_id" Text
                                             :> Get '[JSON] Cryptokey))))))
                        :<|> (("servers"
                               :> (Capture "server_id" Text
                                   :> ("zones"
                                       :> (Capture "zone_id" Text
                                           :> ("cryptokeys"
                                               :> (Capture "cryptokey_id" Text
                                                   :> (ReqBody '[JSON] Cryptokey
                                                       :> PutNoContent)))))))
                              :<|> ("servers"
                                    :> (Capture "server_id" Text
                                        :> ("zones"
                                            :> (Capture "zone_id" Text
                                                :> ("cryptokeys"
                                                    :> (Capture "cryptokey_id" Text
                                                        :> DeleteNoContent)))))))))))
         :<|> (("api"
                :> ("v1"
                    :> ((("servers"
                          :> (Capture "server_id" Text
                              :> ("zones"
                                  :> (Capture "zone_id" Text
                                      :> ("metadata" :> Get '[JSON] [Metadata])))))
                         :<|> ("servers"
                               :> (Capture "server_id" Text
                                   :> ("zones"
                                       :> (Capture "zone_id" Text
                                           :> ("metadata"
                                               :> (ReqBody '[JSON] Metadata :> PostNoContent)))))))
                        :<|> (("servers"
                               :> (Capture "server_id" Text
                                   :> ("zones"
                                       :> (Capture "zone_id" Text
                                           :> ("metadata"
                                               :> (Capture "kind" Text :> Get '[JSON] Metadata))))))
                              :<|> (("servers"
                                     :> (Capture "server_id" Text
                                         :> ("zones"
                                             :> (Capture "zone_id" Text
                                                 :> ("metadata"
                                                     :> (Capture "kind" Text
                                                         :> (ReqBody '[JSON] Metadata
                                                             :> Put '[JSON] Metadata)))))))
                                    :<|> ("servers"
                                          :> (Capture "server_id" Text
                                              :> ("zones"
                                                  :> (Capture "zone_id" Text
                                                      :> ("metadata"
                                                          :> (Capture "kind" Text
                                                              :> DeleteNoContent)))))))))))
               :<|> ("api"
                     :> ("v1"
                         :> ((("servers"
                               :> (Capture "server_id" Text
                                   :> ("tsigkeys" :> Get '[JSON] [TSIGKey])))
                              :<|> ("servers"
                                    :> (Capture "server_id" Text
                                        :> ("tsigkeys"
                                            :> (ReqBody '[JSON] TSIGKey
                                                :> PostCreated '[JSON] TSIGKey)))))
                             :<|> (("servers"
                                    :> (Capture "server_id" Text
                                        :> ("tsigkeys"
                                            :> (Capture "tsigkey_id" Text :> Get '[JSON] TSIGKey))))
                                   :<|> (("servers"
                                          :> (Capture "server_id" Text
                                              :> ("tsigkeys"
                                                  :> (Capture "tsigkey_id" Text
                                                      :> (ReqBody '[JSON] TSIGKey
                                                          :> Put '[JSON] TSIGKey)))))
                                         :<|> ("servers"
                                               :> (Capture "server_id" Text
                                                   :> ("tsigkeys"
                                                       :> (Capture "tsigkey_id" Text
                                                           :> DeleteNoContent))))))))))))
Proxy API
forall {k} (t :: k). Proxy t
Proxy

type API = ToServantApi PowerDNS

data PowerDNS f = PowerDNS
  { forall f. PowerDNS f -> f :- ("api" :> ToServantApi VersionsAPI)
versions   :: f :- "api" :>         ToServantApi VersionsAPI
  , forall f.
PowerDNS f -> f :- ("api" :> ("v1" :> ToServantApi ServersAPI))
servers    :: f :- "api" :> "v1" :> ToServantApi ServersAPI
  , forall f.
PowerDNS f -> f :- ("api" :> ("v1" :> ToServantApi ZonesAPI))
zones      :: f :- "api" :> "v1" :> ToServantApi ZonesAPI
  , forall f.
PowerDNS f -> f :- ("api" :> ("v1" :> ToServantApi CryptokeysAPI))
cryptokeys :: f :- "api" :> "v1" :> ToServantApi CryptokeysAPI
  , forall f.
PowerDNS f -> f :- ("api" :> ("v1" :> ToServantApi MetadataAPI))
metadata   :: f :- "api" :> "v1" :> ToServantApi MetadataAPI
  , forall f.
PowerDNS f -> f :- ("api" :> ("v1" :> ToServantApi TSIGKeysAPI))
tsigkeys   :: f :- "api" :> "v1" :> ToServantApi TSIGKeysAPI
  } deriving (forall x. PowerDNS f -> Rep (PowerDNS f) x)
-> (forall x. Rep (PowerDNS f) x -> PowerDNS f)
-> Generic (PowerDNS f)
forall x. Rep (PowerDNS f) x -> PowerDNS f
forall x. PowerDNS f -> Rep (PowerDNS f) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall f x. Rep (PowerDNS f) x -> PowerDNS f
forall f x. PowerDNS f -> Rep (PowerDNS f) x
$cfrom :: forall f x. PowerDNS f -> Rep (PowerDNS f) x
from :: forall x. PowerDNS f -> Rep (PowerDNS f) x
$cto :: forall f x. Rep (PowerDNS f) x -> PowerDNS f
to :: forall x. Rep (PowerDNS f) x -> PowerDNS f
Generic