-- |
-- 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" :> (Summary "List versions" :> Get '[JSON] [Version]))
    :<|> (("api"
           :> ("v1"
               :> (((Summary "List servers"
                     :> ("servers" :> Get '[JSON] [Server]))
                    :<|> (Summary "Get server"
                          :> ("servers"
                              :> (Capture "server_id" Text :> Get '[JSON] Server))))
                   :<|> ((Summary "Search"
                          :> ("servers"
                              :> (Capture "server_id" Text
                                  :> ("search-data"
                                      :> (QueryParamReq "q" Text
                                          :> (QueryParamReq "max" Integer
                                              :> (QueryParam "object_type" ObjectType
                                                  :> Get '[JSON] [SearchResult])))))))
                         :<|> ((Summary "Flush cache"
                                :> ("servers"
                                    :> (Capture "server_id" Text
                                        :> (QueryParamReq "domain" Text
                                            :> Put '[JSON] CacheFlushResult))))
                               :<|> (Summary "Statistics"
                                     :> ("servers"
                                         :> (Capture "server_id" Text
                                             :> ("statistics"
                                                 :> (QueryParam "statistic" Text
                                                     :> (QueryParam "includerings" Bool
                                                         :> Get
                                                              '[JSON] [AnyStatisticItem])))))))))))
          :<|> ("api"
                :> ("v1"
                    :> ((((Summary "List zones"
                           :> ("servers"
                               :> (Capture "server_id" Text
                                   :> ("zones"
                                       :> (QueryParam "zone" Text
                                           :> (QueryParam "dnssec" Bool :> Get '[JSON] [Zone]))))))
                          :<|> (Summary "Create zone"
                                :> ("servers"
                                    :> (Capture "server_id" Text
                                        :> ("zones"
                                            :> (QueryParam "rrset" Bool
                                                :> (ReqBody '[JSON] Zone
                                                    :> PostCreated '[JSON] Zone)))))))
                         :<|> ((Summary "Get zone"
                                :> ("servers"
                                    :> (Capture "server_id" Text
                                        :> ("zones"
                                            :> (Capture "zone_id" Text
                                                :> (QueryParam "rrsets" Bool
                                                    :> Get '[JSON] Zone))))))
                               :<|> ((Summary "Delete zone"
                                      :> ("servers"
                                          :> (Capture "server_id" Text
                                              :> ("zones"
                                                  :> (Capture "zone_id" Text :> DeleteNoContent)))))
                                     :<|> (Summary "Update records"
                                           :> ("servers"
                                               :> (Capture "server_id" Text
                                                   :> ("zones"
                                                       :> (Capture "zone_id" Text
                                                           :> (ReqBody '[JSON] RRSets
                                                               :> PatchNoContent)))))))))
                        :<|> (((Summary "Update zone"
                                :> ("servers"
                                    :> (Capture "server_id" Text
                                        :> ("zones"
                                            :> (Capture "zone_id" Text
                                                :> (ReqBody '[JSON] Zone :> PutNoContent))))))
                               :<|> (Summary "Trigger AXFR"
                                     :> ("servers"
                                         :> (Capture "server_id" Text
                                             :> ("zones"
                                                 :> (Capture "zone_id" Text
                                                     :> ("axfr-retrieve"
                                                         :> Put '[JSON] Result)))))))
                              :<|> ((Summary "Notify slaves"
                                     :> ("servers"
                                         :> (Capture "server_id" Text
                                             :> ("zones"
                                                 :> (Capture "zone_id" Text
                                                     :> ("notify" :> Put '[JSON] Result))))))
                                    :<|> ((Summary "Get zone AXFR"
                                           :> ("servers"
                                               :> (Capture "server_id" Text
                                                   :> ("zones"
                                                       :> (Capture "zone_id" Text
                                                           :> ("export" :> Get '[JSON] Result))))))
                                          :<|> (Summary "Rectify zone"
                                                :> ("servers"
                                                    :> (Capture "server_id" Text
                                                        :> ("zones"
                                                            :> (Capture "zone_id" Text
                                                                :> ("rectify"
                                                                    :> Put
                                                                         '[JSON]
                                                                         Result))))))))))))))
   :<|> (("api"
          :> ("v1"
              :> (((Summary "List cryptokeys"
                    :> ("servers"
                        :> (Capture "server_id" Text
                            :> ("zones"
                                :> (Capture "zone_id" Text
                                    :> ("cryptokeys" :> Get '[JSON] [Cryptokey]))))))
                   :<|> (Summary "Create cryptokey"
                         :> ("servers"
                             :> (Capture "server_id" Text
                                 :> ("zones"
                                     :> (Capture "zone_id" Text
                                         :> ("cryptokeys"
                                             :> (ReqBody '[JSON] Cryptokey
                                                 :> PostCreated '[JSON] Cryptokey))))))))
                  :<|> ((Summary "Get cryptokey"
                         :> ("servers"
                             :> (Capture "server_id" Text
                                 :> ("zones"
                                     :> (Capture "zone_id" Text
                                         :> ("cryptokeys"
                                             :> (Capture "cryptokey_id" Text
                                                 :> Get '[JSON] Cryptokey)))))))
                        :<|> ((Summary "Update cryptokey"
                               :> ("servers"
                                   :> (Capture "server_id" Text
                                       :> ("zones"
                                           :> (Capture "zone_id" Text
                                               :> ("cryptokeys"
                                                   :> (Capture "cryptokey_id" Text
                                                       :> (ReqBody '[JSON] Cryptokey
                                                           :> PutNoContent))))))))
                              :<|> (Summary "Delete cryptokey"
                                    :> ("servers"
                                        :> (Capture "server_id" Text
                                            :> ("zones"
                                                :> (Capture "zone_id" Text
                                                    :> ("cryptokeys"
                                                        :> (Capture "cryptokey_id" Text
                                                            :> DeleteNoContent))))))))))))
         :<|> (("api"
                :> ("v1"
                    :> (((Summary "List metadata"
                          :> ("servers"
                              :> (Capture "server_id" Text
                                  :> ("zones"
                                      :> (Capture "zone_id" Text
                                          :> ("metadata" :> Get '[JSON] [Metadata]))))))
                         :<|> (Summary "Create metadata"
                               :> ("servers"
                                   :> (Capture "server_id" Text
                                       :> ("zones"
                                           :> (Capture "zone_id" Text
                                               :> ("metadata"
                                                   :> (ReqBody '[JSON] Metadata
                                                       :> PostNoContent))))))))
                        :<|> ((Summary "Get metadata"
                               :> ("servers"
                                   :> (Capture "server_id" Text
                                       :> ("zones"
                                           :> (Capture "zone_id" Text
                                               :> ("metadata"
                                                   :> (Capture "kind" Text
                                                       :> Get '[JSON] Metadata)))))))
                              :<|> ((Summary "Update metadata"
                                     :> ("servers"
                                         :> (Capture "server_id" Text
                                             :> ("zones"
                                                 :> (Capture "zone_id" Text
                                                     :> ("metadata"
                                                         :> (Capture "kind" Text
                                                             :> (ReqBody '[JSON] Metadata
                                                                 :> Put '[JSON] Metadata))))))))
                                    :<|> (Summary "Delete metadata"
                                          :> ("servers"
                                              :> (Capture "server_id" Text
                                                  :> ("zones"
                                                      :> (Capture "zone_id" Text
                                                          :> ("metadata"
                                                              :> (Capture "kind" Text
                                                                  :> DeleteNoContent))))))))))))
               :<|> ("api"
                     :> ("v1"
                         :> (((Summary "List TSIG keys"
                               :> ("servers"
                                   :> (Capture "server_id" Text
                                       :> ("tsigkeys" :> Get '[JSON] [TSIGKey]))))
                              :<|> (Summary "Create TSIG key"
                                    :> ("servers"
                                        :> (Capture "server_id" Text
                                            :> ("tsigkeys"
                                                :> (ReqBody '[JSON] TSIGKey
                                                    :> PostCreated '[JSON] TSIGKey))))))
                             :<|> ((Summary "Get TSIG key"
                                    :> ("servers"
                                        :> (Capture "server_id" Text
                                            :> ("tsigkeys"
                                                :> (Capture "tsigkey_id" Text
                                                    :> Get '[JSON] TSIGKey)))))
                                   :<|> ((Summary "Update TSIG key"
                                          :> ("servers"
                                              :> (Capture "server_id" Text
                                                  :> ("tsigkeys"
                                                      :> (Capture "tsigkey_id" Text
                                                          :> (ReqBody '[JSON] TSIGKey
                                                              :> Put '[JSON] TSIGKey))))))
                                         :<|> (Summary "DElete TSIG key"
                                               :> ("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