module Fedora.Packages.API
(
StandardResults (..)
, Query (..)
, apiGet
, defaultQueryPagination
) where
import Fedora.Packages.Config
import Control.Applicative
import Control.Monad (mzero)
import Data.Aeson
import qualified Data.ByteString as S
import Data.Monoid
import Network.Http.Client
import OpenSSL (withOpenSSL)
data StandardResults a = StandardResults {
_srRows :: [a]
, _srRowsPerPage :: Int
, _srStartRow :: Int
, _srTotalRows :: Int
, _srVisibleRows :: Int
} deriving (Eq, Show)
instance FromJSON a => FromJSON (StandardResults a) where
parseJSON (Object v) = StandardResults <$>
v .: "rows"
<*> v .: "rows_per_page"
<*> v .: "start_row"
<*> v .: "total_rows"
<*> v .: "visible_rows"
parseJSON _ = mzero
prepareRequest :: Method -> S.ByteString -> RequestBuilder ()
prepareRequest m url = do
http m url
setAccept "application/json"
setContentType "application/json"
finishRequest :: FromJSON a => Connection -> IO a
finishRequest cnx = do
x <- receiveResponse cnx jsonHandler
closeConnection cnx
return x
apiGet :: FromJSON a => S.ByteString -> PackagesConfig -> IO a
apiGet url c = withOpenSSL $ do
cnx <- establishConnection (_baseurl c)
q <- buildRequest $ prepareRequest GET ("/packages/fcomm_connector/" <> url)
sendRequest cnx q emptyBody
finishRequest cnx
data Query a = Query {
_qSearch :: a
, _qRowsPerPage :: Int
, _qStartRow :: Int
} deriving (Eq, Show)
instance ToJSON a => ToJSON (Query a) where
toJSON (Query s r sr) = object [ "filters" .= s
, "rows_per_page" .= r
, "start_row" .= sr
]
defaultQueryPagination :: a -> Query a
defaultQueryPagination a = Query a 20 0