module Twilio.Message
(
Message(..)
, Twilio.Message.get
, MessageDirection(..)
, MessageStatus(..)
) where
import Control.Applicative
import Control.Monad
import Control.Monad.Catch
import Data.Aeson
import Data.Monoid
import Data.Text (Text)
import Data.Time.Clock
import Network.URI
import Control.Monad.Twilio
import Twilio.Internal.Parser
import Twilio.Internal.Request
import Twilio.Internal.Resource as Resource
import Twilio.Types
data Message = Message
{ sid :: !MessageSID
, dateCreated :: !UTCTime
, dateUpdated :: !UTCTime
, dateSent :: !(Maybe UTCTime)
, accountSID :: !AccountSID
, to :: !Text
, from :: !Text
, body :: !Text
, status :: !MessageStatus
, direction :: !MessageDirection
, priceUnit :: !PriceUnit
, apiVersion :: !APIVersion
, uri :: !URI
} deriving (Show, Eq)
instance FromJSON Message where
parseJSON (Object v) = Message
<$> v .: "sid"
<*> (v .: "date_created" >>= parseDateTime)
<*> (v .: "date_updated" >>= parseDateTime)
<*> (v .:? "date_sent" >>= parseMaybeDateTime)
<*> v .: "account_sid"
<*> v .: "to"
<*> v .: "from"
<*> v .: "body"
<*> v .: "status"
<*> v .: "direction"
<*> v .: "price_unit"
<*> v .: "api_version"
<*> (v .: "uri" <&> parseRelativeReference
>>= maybeReturn)
parseJSON _ = mzero
instance Get1 MessageSID Message where
get1 (getSID -> sid) = request parseJSONFromResponse =<< makeTwilioRequest
("/Messages/" <> sid <> ".json")
get :: MonadThrow m => MessageSID -> TwilioT m Message
get = Resource.get
data MessageDirection
= Inbound
| OutboundAPI
| OutboundCall
| OutboundReply
deriving Eq
instance Show MessageDirection where
show Inbound = "inbound"
show OutboundAPI = "outbound-api"
show OutboundCall = "outbound-call"
show OutboundReply = "outbound-reply"
instance FromJSON MessageDirection where
parseJSON (String "inbound") = return Inbound
parseJSON (String "outbound-api") = return OutboundAPI
parseJSON (String "outbound-call") = return OutboundCall
parseJSON (String "outbound-reply") = return OutboundReply
parseJSON _ = mzero
data MessageStatus
= Queued
| Sending
| Sent
| Failed
| Received
| Delivered
| Undelivered
deriving Eq
instance Show MessageStatus where
show Queued = "queued"
show Sending = "sending"
show Sent = "sent"
show Failed = "failed"
show Received = "received"
show Delivered = "delivered"
show Undelivered = "undelivered"
instance FromJSON MessageStatus where
parseJSON (String "queued") = return Queued
parseJSON (String "sending") = return Sending
parseJSON (String "sent") = return Sent
parseJSON (String "failed") = return Failed
parseJSON (String "received") = return Received
parseJSON (String "delivered") = return Delivered
parseJSON (String "undelivered") = return Undelivered
parseJSON _ = mzero