module Facebook.Graph
( getObject
, postObject
, Id(..)
, searchObjects
, SearchResultPage(..)
) where
import Control.Applicative
import Control.Monad.Trans.Control (MonadBaseControl)
import Control.Monad (mzero)
import Data.ByteString.Char8 (ByteString)
import Data.Typeable (Typeable)
import qualified Data.Aeson as A
import qualified Data.Conduit as C
import qualified Network.HTTP.Conduit as H
import qualified Network.HTTP.Types as HT
import Facebook.Types
import Facebook.Monad
import Facebook.Base
getObject :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>
ByteString
-> [Argument]
-> Maybe (AccessToken anyKind)
-> FacebookT anyAuth m a
getObject path query mtoken =
runResourceInFb $
asJson =<< fbhttp =<< fbreq path mtoken query
postObject :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>
ByteString
-> [Argument]
-> AccessToken anyKind
-> FacebookT Auth m a
postObject path query token =
runResourceInFb $ do
req <- fbreq path (Just token) query
asJson =<< fbhttp req { H.method = HT.methodPost }
newtype Id = Id { idCode :: ByteString }
deriving (Eq, Ord, Show, Read, Typeable)
instance A.FromJSON Id where
parseJSON (A.Object v) = Id <$> v A..: "id"
parseJSON other = Id <$> A.parseJSON other
searchObjects :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a)
=> ByteString
-> ByteString
-> [Argument]
-> Maybe UserAccessToken
-> FacebookT anyAuth m (SearchResultPage a)
searchObjects objectType keyword query = getObject "/search" query'
where query' = ("q", keyword) : ("type", objectType) : query
data SearchResultPage a = SearchResultPage
{ searchResults :: [a]
, searchPage :: Maybe Pager
} deriving (Eq, Ord, Show, Read, Typeable)
instance (A.FromJSON a) => A.FromJSON (SearchResultPage a) where
parseJSON (A.Object v) = SearchResultPage
<$> v A..: "data"
<*> v A..:? "paging"
parseJSON _ = mzero
data Pager = Pager { previousPage :: Maybe ByteString
, nextPage :: Maybe ByteString
} deriving (Eq, Ord, Show, Read, Typeable)
instance A.FromJSON Pager where
parseJSON (A.Object v) = Pager
<$> v A..:? "previous"
<*> v A..:? "next"
parseJSON _ = mzero