tzmfreedom/hsforce
  • hsforce: Salesforce API Client
  • " />
    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を叩きたいという奇特な方はぜひ利用くださいませ。

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