2019-03-07

HaskellのSalesforceクライアントを作ってみた

いつもの作ってみたシリーズ。今回は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

他のライブラリだと Haskforcehs-salesforceがあるのですが、そのどちらもドキュメントが無かったりそもそもhackage登録されていません。hackage登録されていてドキュメントもあるライブラリはhsforceだけです!

ということで、HaskellでSalesforceのAPIを叩きたいという奇特な方はぜひ利用くださいませ。

このエントリーをはてなブックマークに追加