module Facebook.Object.Order
( Order(..)
, OrderId
, OrderStatus(..)
, OrderApplication(..)
, getOrder
) where
import Control.Applicative
import Control.Monad (mzero)
import Control.Monad.Trans.Control (MonadBaseControl)
import Data.Text (Text)
import Data.Aeson ((.:), (.:?))
import Data.Typeable (Typeable)
import Data.Time.LocalTime (ZonedTime)
import qualified Data.Aeson as A
import qualified Data.Conduit as C
import Facebook.Types
import Facebook.Monad
import Facebook.Graph
type OrderId = Id
data Order = Order {
orderId :: OrderId,
orderFrom :: UserId,
orderTo :: UserId,
orderAmount :: Integer,
orderStatus :: OrderStatus,
orderApplication :: OrderApplication,
orderCountry :: Text,
orderRefundCode :: Maybe Text,
orderCreatedTime :: ZonedTime,
orderUpdatedTime :: ZonedTime
} deriving (Show, Typeable)
data OrderStatus =
OrderPlaced
| OrderSettled
| OrderRefunded
| OrderDisputed
| OrderCancelled
deriving (Show, Enum, Eq, Typeable)
data OrderApplication = OrderApplication {
appId :: Text,
appName :: Text
} deriving (Show, Typeable)
instance A.FromJSON OrderApplication where
parseJSON (A.Object v) =
OrderApplication <$> v .: "id"
<*> v .: "name"
parseJSON _ = mzero
instance A.FromJSON Order where
parseJSON (A.Object v) =
Order <$> v .: "id"
<*> v .: "from"
<*> v .: "to"
<*> v .: "amount"
<*> v .: "status"
<*> v .: "application"
<*> v .: "country"
<*> v .:? "refund_reason_code"
<*> v .: "created_time"
<*> v .: "updated_time"
parseJSON _ = mzero
instance A.FromJSON OrderStatus where
parseJSON (A.String "placed") = return OrderPlaced
parseJSON (A.String "settled") = return OrderSettled
parseJSON (A.String "refunded") = return OrderRefunded
parseJSON (A.String "disputed") = return OrderDisputed
parseJSON (A.String "cancelled") = return OrderCancelled
parseJSON _ = mzero
getOrder :: (C.MonadResource m, MonadBaseControl IO m) =>
OrderId
-> UserAccessToken
-> FacebookT anyAuth m Order
getOrder id_ mtoken = getObject ("/" <> idCode id_) [] (Just mtoken)