いつもの作ってみたシリーズ。今回はHaskell x Salesforceでございます。
使い方
まぁREADMEの通りなんですがこんな感じでログインしてimport HSForce
import Data.Maybe
import Data.Aeson as JSON -- CRUDで使う
import Data.Proxy -- queryで使う
main :: IO ()
main = do
-- get parameter from environment variables by default
loginRequest <- defaultLoginRequest
-- modify login paramter
let loginRequest' = loginRequest{
sfUsername = Just username,
sfPassword = Just password,
sfEndpoint = Just "test.salesforce.com",
sfVersion = Just "v44.0"
}
-- login
client <- login loginRequest'
こんな感じでSObjectのデータ型を定義しつつ、SObject/FromJSON/ToJSONのインスタンスを実装して
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NamedFieldPuns #-}
data Account = Account{
accId :: Maybe String,
accName :: Maybe String,
accEx :: Maybe String
} deriving Show
instance SObject Account where
typeName a = "Account"
getSfid = fromJust . accId
instance FromJSON Account where
parseJSON = withObject "Account" $ \v -> do
accId <- v .:? "Id"
accName <- v .:? "Name"
accEx <- v .:? "Ex__c"
return Account{..}
instance ToJSON Account where
toJSON (Account{accId, accName, accEx}) =
object ["Name" .= accName, "Ex__c" .= accEx]
こんな感じでCRUDします
-- insert object
insert client Account{accId = Nothing, accName = Just "hogehoge", accEx = Nothing}
-- update object
update client Account{accId = Just "xxxx", accName = Just "foobar", accEx = Nothing}
-- upsert object
upsert client Account{accId = Nothing, accName = Just "foobar", accEx = Just "aaa"} "Ex__c" "aaa"
-- delete object
delete client Account{accId = Just "xxxx"}
-- query
query client "SELECT Id, Name FROM Account WHERE Name = 'foobar'" (Proxy :: Proxy Account)
loginはSOAPログインとOAuth2.0(Resource Owner Password Credentials Grant)の両方に対応していて、クライアントID・クライアントシークレットが設定されているかどうかでディスパッチしてます。
今のところはREST APIを叩いていて、バルク処理(TreeとかBatchRequest)はまだ未対応。よく使うAPIはそれなりに揃えたつもりですがtooling APIとか入れると幅が広がりそうなので気が向いたら追加しますw
その他
HaXmlとfast-tagsoupを使っているのですが、どちらもstackageに登録されていないのでstackを使っている場合はextra-depsに追加するなりしてくださいませ。また、hsforce自体もstackageに登録されていないので(ry他のライブラリだと Haskforceやhs-salesforceがあるのですが、そのどちらもドキュメントが無かったりそもそもhackage登録されていません。hackage登録されていてドキュメントもあるライブラリはhsforceだけです!
ということで、HaskellでSalesforceのAPIを叩きたいという奇特な方はぜひ利用くださいませ。