module DigitalOcean.Base (
Authentication(..),
requestGet,
requestPost
) where
import Control.Applicative ((<$>))
import Control.Monad.IO.Class
import Data.Aeson ( ToJSON, encode)
import qualified Data.ByteString.Lazy.Char8 as BS
import Data.ByteString.Lazy(ByteString)
import Network.HTTP.Conduit
import Network.HTTP.Types.Header
import Data.ByteString.Char8(pack)
import Network.HTTP.Types.Method(methodPost, methodGet, Method)
data Authentication = Authentication {
token :: String
} deriving (Show)
url :: String
url = "https://api.digitalocean.com/v2"
simpleHttp' :: MonadIO m => String -> Authentication -> Method -> Maybe(ByteString) -> m BS.ByteString
simpleHttp' url' auth reqMethod reqBody = liftIO $ withManager $ \man -> do
initReq <- liftIO $ parseUrl url'
let req = initReq {
method = reqMethod,
requestHeaders = [(hContentType, Data.ByteString.Char8.pack "application/json"),
(hAuthorization, Data.ByteString.Char8.pack $ "Bearer " ++ (token auth))],
responseTimeout = Just 10000000,
requestBody = case reqBody of Just b -> RequestBodyLBS b
Nothing -> requestBody initReq
}
responseBody <$> httpLbs req man
requestGet :: String -> Authentication -> (MonadIO m) => m BS.ByteString
requestGet suburl auth = simpleHttp' (url ++ "/" ++ suburl) auth methodGet Nothing
requestPost :: (ToJSON b) => String -> Authentication -> b -> (MonadIO m) => m BS.ByteString
requestPost suburl auth body = simpleHttp' (url ++ "/" ++ suburl) auth methodPost $ Just (encode body)