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
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
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
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
type DocumentID = Text
data DocumentType= IDENTITY_PROOF
| REGISTRATION_PROOF
| ARTICLES_OF_ASSOCIATION
| SHAREHOLDER_DECLARATION
| ADDRESS_PROOF
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON DocumentType where
toJSON =toJSON . show
instance FromJSON DocumentType where
parseJSON (String s)=pure $ read $ unpack s
parseJSON _ =fail "DocumentType"
data DocumentStatus=CREATED
| VALIDATION_ASKED
| VALIDATED
| REFUSED
deriving (Show,Read,Eq,Ord,Bounded,Enum,Typeable)
instance ToJSON DocumentStatus where
toJSON =toJSON . show
instance FromJSON DocumentStatus where
parseJSON (String s)=pure $ read $ unpack s
parseJSON _ =fail "DocumentStatus"
data Document = Document {
dId :: Maybe DocumentID
,dCreationDate :: Maybe POSIXTime
,dTag :: Maybe Text
,dType :: DocumentType
,dStatus :: Maybe DocumentStatus
,dRefusedReasonType :: Maybe Text
,dRefusedReasonMessage :: Maybe Text
} deriving (Show,Ord,Eq,Typeable)
instance ToJSON Document where
toJSON d=object ["Tag" .= dTag d,
"Type" .= dType d,"Status" .= dStatus d]
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"