mangopay-1.2: src/Web/MangoPay/Documents.hs
{-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables, OverloadedStrings, FlexibleContexts, FlexibleInstances, ConstraintKinds #-}
-- | handle documents and pages
module Web.MangoPay.Documents 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.ByteString as BS
import qualified Data.ByteString.Base64 as B64
import qualified Data.Text.Encoding as TE
-- | create or edit a document
storeDocument :: (MPUsableMonad m) => AnyUserID -> Document -> AccessToken -> MangoPayT m Document
storeDocument uid d at=
case dId d of
Nothing-> do
url<-getClientURLMultiple ["/users/",uid,"/KYC/documents/"]
postExchange url (Just at) d
Just i-> do
url<-getClientURLMultiple ["/users/",uid,"/KYC/documents/",i]
putExchange url (Just at) d
-- | fetch a document from its ID
fetchDocument :: (MPUsableMonad m) => AnyUserID -> DocumentID -> AccessToken -> MangoPayT m Document
fetchDocument uid did at=do
url<-getClientURLMultiple ["/users/",uid,"/KYC/documents/",did]
req<-getGetRequest url (Just at) ([]::HT.Query)
getJSONResponse req
-- | create a page
-- note that per the MangoPay API the document HAS to be in CREATED status
-- should we check it here? Since MangoPay returns a 500 Internal Server Error if the document is in another status...
storePage :: (MPUsableMonad m) => AnyUserID -> DocumentID -> BS.ByteString -> AccessToken -> MangoPayT m ()
storePage uid did contents at=do
let val=object ["File" .= TE.decodeUtf8 (B64.encode contents)]
url<-getClientURLMultiple ["/users/",uid,"/KYC/documents/",did,"/pages"]
postNoReply url (Just at) val
-- | ID of a document
type DocumentID = Text
-- | type of the document
data DocumentType= IDENTITY_PROOF -- ^ For legal and natural users
| REGISTRATION_PROOF -- ^ Only for legal users
| ARTICLES_OF_ASSOCIATION -- ^ Only for legal users
| SHAREHOLDER_DECLARATION -- ^ Only for legal users
| ADDRESS_PROOF -- ^ For legal and natural users
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
-- | to json as per MangoPay format
instance ToJSON DocumentType where
toJSON =toJSON . show
-- | from json as per MangoPay format
instance FromJSON DocumentType where
parseJSON (String s)=pure $ read $ unpack s
parseJSON _ =fail "DocumentType"
-- | status of a document
data DocumentStatus=CREATED
| VALIDATION_ASKED
| VALIDATED
| REFUSED
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
-- | to json as per MangoPay format
instance ToJSON DocumentStatus where
toJSON =toJSON . show
-- | from json as per MangoPay format
instance FromJSON DocumentStatus where
parseJSON (String s)=pure $ read $ unpack s
parseJSON _ =fail "DocumentStatus"
-- | a document
data Document = Document {
dId :: Maybe DocumentID
,dCreationDate :: Maybe POSIXTime
,dTag :: Maybe Text -- ^ custom data for client
,dType :: DocumentType
,dStatus :: Maybe DocumentStatus
,dRefusedReasonType :: Maybe Text
,dRefusedReasonMessage :: Maybe Text
} deriving (Show,Ord,Eq,Typeable)
-- | to json as per MangoPay format
instance ToJSON Document where
toJSON d=object ["Tag" .= dTag d,
"Type" .= dType d,"Status" .= dStatus d]
-- | from json as per MangoPay format
instance FromJSON Document where
parseJSON (Object v) =Document <$>
v .: "Id" <*>
v .: "CreationDate" <*>
v .:? "Tag" <*>
v .: "Type" <*>
v .: "Status" <*>
v .:? "RefusedReasonType" <*>
v .:? "RefusedReasonMessage"
parseJSON _=fail "Document"