packages feed

acme-not-a-joke-0.1.0.0: src/Acme/NotAJoke/Api/Directory.hs

{-# LANGUAGE DeriveGeneric #-}

module Acme.NotAJoke.Api.Directory where

import Control.Lens hiding ((.=))
import Data.Aeson (FromJSON (..))
import Data.Coerce (coerce)
import GHC.Generics (Generic)
import qualified Network.Wreq as Wreq

import Acme.NotAJoke.Api.Endpoint
import Acme.NotAJoke.Api.Meta

{- | RFC-defined directory structure.

Mainly contains a series of endpoints.
-}
data Directory
    = Directory
    { meta :: Meta
    , newNonce :: Endpoint "newNonce"
    , newAccount :: Endpoint "newAccount"
    , newOrder :: Endpoint "newOrder"
    , keyChange :: Endpoint "keyChange"
    , renewalInfo :: Endpoint "renewalInfo"
    , revokeCert :: Endpoint "revokeCert"
    }
    deriving (Show, Generic)

instance FromJSON Directory

directory :: BaseUrl -> Endpoint "directory"
directory baseUrl = coerce $ baseUrl <> "directory"

-- | Fetches the server's directory.
fetchDirectory :: Endpoint "directory" -> IO Directory
fetchDirectory ep = do
    r <- Wreq.asJSON =<< get ep
    pure $ r ^. Wreq.responseBody