packages feed

powerdns-0.1: PowerDNS/API/Metadata.hs

-- |
-- Module: PowerDNS.API.Metadata
-- Description: Metadata endpoints for PowerDNS API
--
-- This module implements the endpoints described at [Metadata API](https://doc.powerdns.com/authoritative/http-api/metadata.html#)

{-# LANGUAGE DataKinds          #-}
{-# LANGUAGE DeriveAnyClass     #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE TypeOperators      #-}
module PowerDNS.API.Metadata
  (
  -- * API
    MetadataAPI(..)

  -- * Data types
  , Metadata(..)
  )
where

import           Control.DeepSeq (NFData)
import           Data.Aeson ( FromJSON(..), ToJSON(..)
                            , defaultOptions, fieldLabelModifier
                            , genericParseJSON, genericToJSON
                            )

import           Data.Data (Data)
import qualified Data.Text as T
import           Servant.API
import           Servant.API.Generic

import           PowerDNS.Internal.Utils (strip)

data MetadataAPI f = MetadataAPI
  { apiListMetadata   :: f :- "servers" :> Capture "server_id" T.Text :> "zones" :> Capture "zone_id" T.Text :> "metadata"
                           :> Get '[JSON] [Metadata]

  , apiCreateMetadata :: f :- "servers" :> Capture "server_id" T.Text :> "zones" :> Capture "zone_id" T.Text :> "metadata"
                           :> ReqBody '[JSON] Metadata
                           :> PostNoContent

  , apiGetMetadata    :: f :- "servers" :> Capture "server_id" T.Text :> "zones" :> Capture "zone_id" T.Text :> "metadata" :> Capture "kind" T.Text
                           :> Get '[JSON] Metadata

  , apiUpdateMetadata    :: f :- "servers" :> Capture "server_id" T.Text :> "zones" :> Capture "zone_id" T.Text :> "metadata" :> Capture "kind" T.Text
                           :> ReqBody '[JSON] Metadata
                           :> Put '[JSON] Metadata

  , apiDeleteMetadata    :: f :- "servers" :> Capture "server_id" T.Text :> "zones" :> Capture "zone_id" T.Text :> "metadata" :> Capture "kind" T.Text
                           :> DeleteNoContent
  } deriving Generic

data Metadata = Metadata
  { md_kind :: T.Text
  , md_metadata :: [T.Text]
  } deriving (Eq, Ord, Show, Generic, NFData, Data)

instance ToJSON Metadata where
  toJSON = genericToJSON defaultOptions { fieldLabelModifier = strip "md_"}

instance FromJSON Metadata where
  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = strip "md_"}