{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE InstanceSigs #-} module Network.Cloudflare.Zone where import Control.Lens hiding ((.=)) import Data.Aeson import Data.Text (Text) import qualified Data.Text.Encoding as Text import Data.Time import Network.Cloudflare.Types import Network.Wreq import Network.Wreq.Types (Auth (OAuth2Bearer)) listZones :: CloudflareAuth -> IO (Either String (ResultWithInfo [Zone])) listZones authInfo = do let opts = defaults & auth .~ Just (OAuth2Bearer (Text.encodeUtf8 (cloudflareAuthToken authInfo))) r <- getWith opts "https://api.cloudflare.com/client/v4/zones" pure $ r ^. responseBody . to eitherDecode data Zone = Zone { zoneAccount :: Account , zoneActivatedOn :: UTCTime , zoneCreatedOn :: UTCTime , zoneDevelopmentMode :: Int , zoneId :: Text -- TODO maybe make this a specific type , zoneMeta :: Object -- TODO maybe make this a specific type , zoneModifiedOn :: UTCTime , zoneName :: Text , zoneOriginalDNSHost :: Maybe Text -- This is marked as required but can be Null? , zoneOriginalNameServers :: Maybe [Text] -- This is marked as required but can be Null? , zoneOriginalRegistrar :: Maybe Text , zoneOwner :: Object -- TODO maybe make this a specific type , zoneVanityNameServers :: Maybe [Text] } deriving (Eq, Ord, Show) instance FromJSON Zone where parseJSON = withObject "Zone" $ \o -> do account <- o .: "account" activatedOn <- o .: "activated_on" createdOn <- o .: "created_on" developmentMode <- o .: "development_mode" id' <- o .: "id" meta <- o .: "meta" modifiedOn <- o .: "modified_on" name <- o .: "name" originalDNSHost <- o .:? "original_dnshost" originalNameServers <- o .:? "original_name_servers" originalRegistrar <- o .:? "original_registrar" owner <- o .: "owner" vanityNameServers <- o .:? "vanity_name_servers" pure $ Zone account activatedOn createdOn developmentMode id' meta modifiedOn name originalDNSHost originalNameServers originalRegistrar owner vanityNameServers