module Facebook.Types
( Credentials(..)
, AccessToken(..)
, UserAccessToken
, AppAccessToken
, AccessTokenData
, UserId
, accessTokenData
, accessTokenExpires
, accessTokenUserId
, UserKind
, AppKind
, Argument
, (<>)
, FbUTCTime(..)
) where
import Data.ByteString (ByteString)
import Data.Monoid (Monoid, mappend)
import Data.Time (UTCTime, parseTime)
import Data.Typeable (Typeable, Typeable1)
import System.Locale (defaultTimeLocale)
import qualified Data.Aeson as A
import qualified Data.Text as T
data Credentials =
Credentials { appName :: ByteString
, appId :: ByteString
, appSecret :: ByteString
}
deriving (Eq, Ord, Show, Read, Typeable)
data AccessToken kind where
UserAccessToken :: UserId -> AccessTokenData -> UTCTime -> AccessToken UserKind
AppAccessToken :: AccessTokenData -> AccessToken AppKind
type UserAccessToken = AccessToken UserKind
type AppAccessToken = AccessToken AppKind
deriving instance Eq (AccessToken kind)
deriving instance Ord (AccessToken kind)
deriving instance Show (AccessToken kind)
deriving instance Typeable1 AccessToken
type AccessTokenData = ByteString
type UserId = ByteString
accessTokenData :: AccessToken anyKind -> AccessTokenData
accessTokenData (UserAccessToken _ d _) = d
accessTokenData (AppAccessToken d) = d
accessTokenExpires :: AccessToken anyKind -> Maybe UTCTime
accessTokenExpires (UserAccessToken _ _ expt) = Just expt
accessTokenExpires (AppAccessToken _) = Nothing
accessTokenUserId :: UserAccessToken -> UserId
accessTokenUserId (UserAccessToken uid _ _) = uid
data UserKind deriving (Typeable)
data AppKind deriving (Typeable)
type Argument = (ByteString, ByteString)
(<>) :: Monoid a => a -> a -> a
(<>) = mappend
newtype FbUTCTime = FbUTCTime { unFbUTCTime :: UTCTime }
instance A.FromJSON FbUTCTime where
parseJSON (A.String t) =
case parseTime defaultTimeLocale "%FT%T%z" (T.unpack t) of
Just d -> return (FbUTCTime d)
_ -> fail $ "could not parse FbUTCTime string " ++ show t
parseJSON _ = fail "could not parse FbUTCTime from something which is not a string"