module Coinbase.Exchange.Private
( getAccountList
, getAccount
, getAccountLedger
, getAccountHolds
, createOrder
, cancelOrder
, cancelAllOrders
, getOrderList
, getOrder
, getFills
, createTransfer
, createCryptoWithdrawal
, createReport
, getReportStatus
, module Coinbase.Exchange.Types.Private
) where
import Control.Monad.Except
import Control.Monad.Reader
import Control.Monad.Trans.Resource
import Data.Char
import Data.List
import qualified Data.Text as T
import Data.UUID
import Coinbase.Exchange.Rest
import Coinbase.Exchange.Types
import Coinbase.Exchange.Types.Core
import Coinbase.Exchange.Types.Private
getAccountList :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> m [Account]
getAccountList = coinbaseGet True "/accounts" voidBody
getAccount :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> AccountId -> m Account
getAccount (AccountId i) = coinbaseGet True ("/accounts/" ++ toString i) voidBody
getAccountLedger :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> AccountId -> m [Entry]
getAccountLedger (AccountId i) = coinbaseGet True ("/accounts/" ++ toString i ++ "/ledger") voidBody
getAccountHolds :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> AccountId -> m [Hold]
getAccountHolds (AccountId i) = coinbaseGet True ("/accounts/" ++ toString i ++ "/holds") voidBody
createOrder :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> NewOrder -> m OrderId
createOrder = liftM ocId . coinbasePost True "/orders" . Just
cancelOrder :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> OrderId -> m ()
cancelOrder (OrderId o) = coinbaseDeleteDiscardBody True ("/orders/" ++ toString o) voidBody
cancelAllOrders :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> Maybe ProductId -> m [OrderId]
cancelAllOrders prodId = coinbaseDelete True ("/orders" ++ opt prodId) voidBody
where opt Nothing = ""
opt (Just id) = "?product_id=" ++ T.unpack (unProductId id)
getOrderList :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> [OrderStatus] -> m [Order]
getOrderList os = coinbaseGet True ("/orders?" ++ query os) voidBody
where query [] = "status=open&status=pending&status=active"
query xs = intercalate "&" $ map (\x -> "status=" ++ map toLower (show x)) xs
getOrder :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> OrderId -> m Order
getOrder (OrderId o) = coinbaseGet True ("/orders/" ++ toString o) voidBody
getFills :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> Maybe OrderId -> Maybe ProductId -> m [Fill]
getFills moid mpid = coinbaseGet True ("/fills?" ++ oid ++ "&" ++ pid) voidBody
where oid = case moid of Just v -> "order_id=" ++ toString (unOrderId v)
Nothing -> ""
pid = case mpid of Just v -> "product_id=" ++ T.unpack (unProductId v)
Nothing -> ""
createTransfer :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> TransferToCoinbase -> m TransferToCoinbaseResponse
createTransfer = coinbasePost True "/transfers" . Just
createCryptoWithdrawal
:: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> CryptoWithdrawal
-> m CryptoWithdrawalResp
createCryptoWithdrawal = coinbasePost True "/withdrawals/crypto" . Just
createReport :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> ReportRequest -> m ReportInfo
createReport = coinbasePost True "/reports" . Just
getReportStatus :: (MonadResource m, MonadReader ExchangeConf m, MonadError ExchangeFailure m)
=> ReportId -> m ReportInfo
getReportStatus (ReportId r) = coinbaseGet True ("/reports/" ++ toString r) voidBody