module Web.MangoPay.Cards where
import Web.MangoPay.Documents
import Web.MangoPay.Monad
import Web.MangoPay.Types
import Web.MangoPay.Users
import Data.Text
import Data.Typeable (Typeable)
import Data.Aeson
import Data.Time.Clock.POSIX (POSIXTime)
import Control.Applicative
import qualified Data.HashMap.Lazy as HM
type CardRegistrationId=Text
createCardRegistration :: (MPUsableMonad m) => CardRegistration -> AccessToken -> MangoPayT m CardRegistration
createCardRegistration = createGeneric "/cardregistrations"
modifyCardRegistration :: (MPUsableMonad m) => CardRegistration -> AccessToken -> MangoPayT m CardRegistration
modifyCardRegistration cr = modifyGGeneric
(Just $ HM.filterWithKey (\k _->k=="RegistrationData")) "/cardregistrations/" cr crId
data CardInfo = CardInfo {
ciNumber :: Text
,ciExpire :: CardExpiration
,ciCSC :: Text
} deriving (Show,Read,Eq,Ord,Typeable)
mkCardRegistration :: AnyUserId -> Currency -> CardRegistration
mkCardRegistration uid currency=CardRegistration Nothing Nothing Nothing uid currency Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
data CardRegistration = CardRegistration {
crId :: Maybe CardRegistrationId
,crCreationDate :: Maybe POSIXTime
,crTag :: Maybe Text
,crUserId :: AnyUserId
,crCurrency :: Currency
,crAccessKey :: Maybe Text
,crPreregistrationData :: Maybe Text
,crCardRegistrationURL :: Maybe Text
,crRegistrationData :: Maybe Text
,crCardType :: Maybe Text
,crCardId :: Maybe CardId
,crResultCode :: Maybe Text
,crResultMessage :: Maybe Text
,crStatus :: Maybe DocumentStatus
} deriving (Show,Eq,Ord,Typeable)
instance ToJSON CardRegistration where
toJSON cr=object ["Id".= crId cr
, "Tag" .= crTag cr,"UserId" .= crUserId cr
,"Currency" .= crCurrency cr,"RegistrationData" .= crRegistrationData cr
,"CardRegistrationURL" .= crCardRegistrationURL cr]
instance FromJSON CardRegistration where
parseJSON (Object v) =CardRegistration <$>
v .: "Id" <*>
v .:? "CreationDate" <*>
v .:? "Tag" <*>
v .: "UserId" <*>
v .: "Currency" <*>
v .:? "AccessKey" <*>
v .:? "PreregistrationData" <*>
v .:? "CardRegistrationURL" <*>
v .:? "RegistrationData" <*>
v .:? "CardType" <*>
v .:? "CardId" <*>
v .:? "ResultCode" <*>
v .:? "ResultMessage" <*>
v .:? "Status"
parseJSON _=fail "CardRegistration"
fetchCard :: (MPUsableMonad m) => CardId -> AccessToken -> MangoPayT m Card
fetchCard = fetchGeneric "/cards/"
listCards :: (MPUsableMonad m) => AnyUserId -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Card)
listCards uid = genericList ["/users/",uid,"/cards"]
data CardValidity=UNKNOWN | VALID | INVALID
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON CardValidity where
toJSON =toJSON . show
instance FromJSON CardValidity where
parseJSON (String s)=pure $ read $ unpack s
parseJSON _ =fail "CardValidity"
data Card=Card {
cId :: CardId
,cCreationDate :: POSIXTime
,cTag :: Maybe Text
,cExpirationDate :: CardExpiration
,cAlias :: Text
,cCardProvider :: Text
,cCardType :: Text
,cProduct :: Maybe Text
,cBankCode :: Maybe Text
,cActive :: Bool
,cCurrency :: Currency
,cValidity :: CardValidity
,cCountry :: Text
,cUserId :: AnyUserId
} deriving (Show,Eq,Ord,Typeable)
instance FromJSON Card where
parseJSON (Object v) =Card <$>
v .: "Id" <*>
v .: "CreationDate" <*>
v .:? "Tag" <*>
v .: "ExpirationDate" <*>
v .: "Alias" <*>
v .: "CardProvider" <*>
v .: "CardType" <*>
v .:? "Product" <*>
v .:? "BankCode" <*>
v .: "Active" <*>
v .: "Currency" <*>
v .: "Validity" <*>
v .: "Country" <*>
v .: "UserId"
parseJSON _=fail "Card"
instance ToJSON Card where
toJSON Card {..} = object
[ "Id" .= cId
, "CreationDate" .= cCreationDate
, "Tag" .= cTag
, "ExpirationDate" .= cExpirationDate
, "Alias" .= cAlias
, "CardProvider" .= cCardProvider
, "CardType" .= cCardType
, "Product" .= cProduct
, "BankCode" .= cBankCode
, "Active" .= cActive
, "Currency" .= cCurrency
, "Validity" .= cValidity
, "Country" .= cCountry
, "UserId" .= cUserId ]