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 Network.HTTP.Types as HT
import qualified Data.HashMap.Lazy as HM
type CardRegistrationID=Text
storeCardRegistration :: (MPUsableMonad m) => CardRegistration -> AccessToken -> MangoPayT m CardRegistration
storeCardRegistration cr at=
case crId cr of
Nothing-> do
url<-getClientURL "/cardregistrations"
postExchange url (Just at) cr
Just i-> do
url<-getClientURLMultiple ["/cardregistrations/",i]
let Object m=toJSON cr
putExchange url (Just at) $ Object $ HM.filterWithKey (\k _->k=="RegistrationData") m
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 cid at=do
url<-getClientURLMultiple ["/cards/",cid]
req<-getGetRequest url (Just at) ([]::HT.Query)
getJSONResponse req
listCards :: (MPUsableMonad m) => AnyUserID -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Card)
listCards uid mp at=do
url<-getClientURLMultiple ["/users/",uid,"/cards"]
req<-getGetRequest url (Just at) (paginationAttributes mp)
getJSONList req
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"