module Web.MangoPay.Wallets where
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 (delete)
storeWallet :: (MPUsableMonad m) => Wallet -> AccessToken -> MangoPayT m Wallet
storeWallet w at=
case wId w of
Nothing-> do
url<-getClientURL "/wallets"
postExchange url (Just at) w
Just i-> do
url<-getClientURLMultiple ["/wallets/",i]
let Object m=toJSON w
putExchange url (Just at) (Object $ HM.delete "Currency" m)
fetchWallet :: (MPUsableMonad m) => WalletID -> AccessToken -> MangoPayT m Wallet
fetchWallet wid at=do
url<-getClientURLMultiple ["/wallets/",wid]
req<-getGetRequest url (Just at) ([]::HT.Query)
getJSONResponse req
listWallets :: (MPUsableMonad m) => AnyUserID -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Wallet)
listWallets uid mp at=do
url<-getClientURLMultiple ["/users/",uid,"/wallets"]
req<-getGetRequest url (Just at) (paginationAttributes mp)
getJSONList req
createTransfer :: (MPUsableMonad m) => Transfer -> AccessToken -> MangoPayT m Transfer
createTransfer t at= do
url<-getClientURL "/transfers"
postExchange url (Just at) t
fetchTransfer :: (MPUsableMonad m) => TransferID -> AccessToken -> MangoPayT m Transfer
fetchTransfer wid at=do
url<-getClientURLMultiple ["/transfers/",wid]
req<-getGetRequest url (Just at) ([]::HT.Query)
getJSONResponse req
listTransactions :: (MPUsableMonad m) => WalletID -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Transaction)
listTransactions wid mp at=do
url<-getClientURLMultiple ["/wallets/",wid,"/transactions"]
req<-getGetRequest url (Just at) (paginationAttributes mp)
getJSONList req
listTransactionsForUser :: (MPUsableMonad m) => AnyUserID -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Transaction)
listTransactionsForUser uid mp at=do
url<-getClientURLMultiple ["/users/",uid,"/transactions"]
req<-getGetRequest url (Just at) (paginationAttributes mp)
getJSONList req
type WalletID=Text
data Wallet = Wallet {
wId:: Maybe WalletID
,wCreationDate :: Maybe POSIXTime
,wTag :: Maybe Text
,wOwners :: [Text]
,wDescription :: Text
,wCurrency :: Currency
,wBalance :: Maybe Amount
}
deriving (Show,Eq,Ord,Typeable)
instance ToJSON Wallet where
toJSON w=object ["Tag" .= wTag w,"Owners" .= wOwners w,"Description" .= wDescription w,"Currency" .= wCurrency w]
instance FromJSON Wallet where
parseJSON (Object v) =Wallet <$>
v .: "Id" <*>
v .: "CreationDate" <*>
v .:? "Tag" <*>
v .: "Owners" <*>
v .: "Description" <*>
v .: "Currency" <*>
v .: "Balance"
parseJSON _=fail "Wallet"
type TransferID=Text
data TransferStatus= Created | Succeeded | Failed
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON TransferStatus where
toJSON Created="CREATED"
toJSON Succeeded="SUCCEEDED"
toJSON Failed="FAILED"
instance FromJSON TransferStatus where
parseJSON (String "CREATED") =pure Created
parseJSON (String "SUCCEEDED") =pure Succeeded
parseJSON (String "FAILED") =pure Failed
parseJSON _= fail "TransferStatus"
data Transfer = Transfer{
tId :: Maybe TransferID
,tCreationDate :: Maybe POSIXTime
,tTag :: Maybe Text
,tAuthorId :: AnyUserID
,tCreditedUserId :: Maybe AnyUserID
,tDebitedFunds :: Amount
,tFees :: Amount
,tDebitedWalletID :: WalletID
,tCreditedWalletID:: WalletID
,tCreditedFunds :: Maybe Amount
,tStatus :: Maybe TransferStatus
,tResultCode :: Maybe Text
,tResultMessage :: Maybe Text
,tExecutionDate :: Maybe POSIXTime
}
deriving (Show,Eq,Ord,Typeable)
instance ToJSON Transfer where
toJSON t=object ["AuthorId" .= tAuthorId t,"CreditedUserId" .= tCreditedUserId t,"DebitedFunds" .= tDebitedFunds t,
"Fees" .= tFees t,"DebitedWalletID" .= tDebitedWalletID t,"CreditedWalletID" .= tCreditedWalletID t,
"Tag" .= tTag t]
instance FromJSON Transfer where
parseJSON (Object v) =Transfer <$>
v .: "Id" <*>
v .: "CreationDate" <*>
v .:? "Tag" <*>
v .: "AuthorId" <*>
v .: "CreditedUserId" <*>
v .: "DebitedFunds" <*>
v .: "Fees" <*>
v .: "DebitedWalletId" <*>
v .: "CreditedWalletId" <*>
v .:? "CreditedFunds" <*>
v .:? "Status" <*>
v .:? "ResultCode" <*>
v .:? "ResultMessage" <*>
v .:? "ExecutionDate"
parseJSON _=fail "Transfer"
data TransactionType = PAYIN
| PAYOUT
| TRANSFER
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON TransactionType where
toJSON =toJSON . show
instance FromJSON TransactionType where
parseJSON (String s)
| ((a,_):_)<-reads $ unpack s=pure a
parseJSON _ =fail "TransactionType"
data TransactionNature = REGULAR
| REFUND
| REPUDIATION
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON TransactionNature where
toJSON =toJSON . show
instance FromJSON TransactionNature where
parseJSON (String s)
| ((a,_):_)<-reads $ unpack s=pure a
parseJSON _ =fail "TransactionNature"
type TransactionID = Text
data Transaction = Transaction{
txId :: Maybe TransactionID
,txCreationDate :: Maybe POSIXTime
,txTag :: Maybe Text
,txAuthorId :: AnyUserID
,txCreditedUserId :: Maybe AnyUserID
,txDebitedFunds :: Amount
,txFees :: Amount
,txDebitedWalletID :: Maybe WalletID
,txCreditedWalletID:: Maybe WalletID
,txCreditedFunds :: Maybe Amount
,txStatus :: Maybe TransferStatus
,txResultCode :: Maybe Text
,txResultMessage :: Maybe Text
,txExecutionDate :: Maybe POSIXTime
,txType :: TransactionType
,txNature :: TransactionNature
}
deriving (Show,Eq,Ord,Typeable)
instance ToJSON Transaction where
toJSON t=object ["AuthorId" .= txAuthorId t,"CreditedUserId" .= txCreditedUserId t,"DebitedFunds" .= txDebitedFunds t,
"Fees" .= txFees t,"DebitedWalletID" .= txDebitedWalletID t,"CreditedWalletID" .= txCreditedWalletID t,
"Tag" .= txTag t,"Type" .= txType t,"Nature" .= txNature t]
instance FromJSON Transaction where
parseJSON (Object v) =Transaction <$>
v .: "Id" <*>
v .: "CreationDate" <*>
v .:? "Tag" <*>
v .: "AuthorId" <*>
v .: "CreditedUserId" <*>
v .: "DebitedFunds" <*>
v .: "Fees" <*>
v .:? "DebitedWalletId" <*>
v .:? "CreditedWalletId" <*>
v .:? "CreditedFunds" <*>
v .:? "Status" <*>
v .:? "ResultCode" <*>
v .:? "ResultMessage" <*>
v .:? "ExecutionDate" <*>
v .: "Type" <*>
v .: "Nature"
parseJSON _=fail "Transfer"