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 Data.HashMap.Lazy as HM (delete)
createWallet :: (MPUsableMonad m) => Wallet -> AccessToken -> MangoPayT m Wallet
createWallet = createGeneric "/wallets"
modifyWallet :: (MPUsableMonad m) => Wallet -> AccessToken -> MangoPayT m Wallet
modifyWallet w = modifyGGeneric (Just $ HM.delete "Currency") "/wallets/" w wId
fetchWallet :: (MPUsableMonad m) => WalletID -> AccessToken -> MangoPayT m Wallet
fetchWallet = fetchGeneric "/wallets/"
listWallets :: (MPUsableMonad m) => AnyUserID -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Wallet)
listWallets uid = genericList ["/users/",uid,"/wallets"]
createTransfer :: (MPUsableMonad m) => Transfer -> AccessToken -> MangoPayT m Transfer
createTransfer = createGeneric "/transfers"
fetchTransfer :: (MPUsableMonad m) => TransferID -> AccessToken -> MangoPayT m Transfer
fetchTransfer = fetchGeneric "/transfers/"
listTransactions :: (MPUsableMonad m) => WalletID -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Transaction)
listTransactions wid = genericList ["/wallets/",wid,"/transactions"]
listTransactionsForUser :: (MPUsableMonad m) => AnyUserID -> Maybe Pagination -> AccessToken -> MangoPayT m (PagedList Transaction)
listTransactionsForUser uid = genericList ["/users/",uid,"/transactions"]
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"