module SMSAero.Types (
SMSAeroAuth(..),
Signature(..),
MessageId(..),
MessageBody(..),
Group(..),
Phone(..),
SMSAeroDate(..),
SendType(..),
DigitalChannel(..),
Name(..),
BirthDate(..),
ChannelName,
) where
import Control.Applicative (empty)
import Data.Aeson
import Data.Int (Int64)
import Data.Monoid
import Data.Time (UTCTime)
import Data.Time.Calendar (Day)
import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds, posixSecondsToUTCTime)
import Data.Text (Text)
import qualified Data.Text as Text
import Web.HttpApiData
newtype Signature = Signature { getSignature :: Text } deriving (Eq, Show, FromJSON, ToJSON, ToHttpApiData, FromHttpApiData)
newtype MessageId = MessageId Int64
deriving (Eq, Show, Ord, FromJSON, ToJSON, ToHttpApiData, FromHttpApiData
#if MIN_VERSION_aeson(1,0,0)
, ToJSONKey, FromJSONKey
#endif
)
newtype MessageBody = MessageBody Text deriving (Eq, Show, FromJSON, ToJSON, ToHttpApiData, FromHttpApiData)
newtype Group = Group Text deriving (Eq, Show, FromJSON, ToJSON, ToHttpApiData, FromHttpApiData)
type ChannelName = Text
data SMSAeroAuth = SMSAeroAuth
{ authUser :: Text
, authPassword :: Text
}
instance FromJSON SMSAeroAuth where
parseJSON (Object o) = SMSAeroAuth
<$> o .: "user"
<*> o .: "password"
parseJSON _ = empty
instance ToJSON SMSAeroAuth where
toJSON SMSAeroAuth{..} = object
[ "user" .= authUser
, "password" .= authPassword ]
newtype Phone = Phone { getPhone :: Int64 } deriving (Eq, Show, ToHttpApiData, FromHttpApiData)
newtype SMSAeroDate = SMSAeroDate { getSMSAeroDate :: UTCTime } deriving (Eq, Show)
instance ToHttpApiData SMSAeroDate where
toQueryParam (SMSAeroDate dt) = Text.pack (show (utcTimeToPOSIXSeconds dt))
instance FromHttpApiData SMSAeroDate where
parseQueryParam s = do
n <- fromInteger <$> parseQueryParam s
return (SMSAeroDate (posixSecondsToUTCTime n))
data SendType
= PaidSignature
| FreeSignatureExceptMTC
| FreeSignature
| InfoSignature
| International
deriving (Eq, Show, Bounded, Enum)
data DigitalChannel = DigitalChannel
instance ToHttpApiData DigitalChannel where
toQueryParam _ = "1"
instance FromHttpApiData DigitalChannel where
parseQueryParam "1" = Right DigitalChannel
parseQueryParam x = Left ("expected 1 for digital channel (but got " <> x <> ")")
instance ToHttpApiData SendType where
toQueryParam PaidSignature = "1"
toQueryParam FreeSignatureExceptMTC = "2"
toQueryParam FreeSignature = "3"
toQueryParam InfoSignature = "4"
toQueryParam International = "6"
instance FromHttpApiData SendType where
parseQueryParam = parseBoundedQueryParam
newtype Name = Name Text deriving (Eq, Show, ToHttpApiData, FromHttpApiData)
newtype BirthDate = BirthDate Day deriving (Eq, Show, ToHttpApiData, FromHttpApiData)