# How to ガイド - CLI におけるトリガーの実行

ここでは、Workato Gem を使用してトリガーを実行する方法について説明します。

# 前提条件

  • Workato SDK Gem がインストールされており、実行可能であること。詳細については、入門ガイドを参照してください。
  • 少なくとも1つのトリガーを備えた有効なコネクターがあること。ここでは以下のサンプルを使用します。
  • 有効な資格情報があること。サンプルコネクターのコードを使用する場合は、そのコネクターの適切な資格情報があることを確認してください。

# サンプルコネクター - Chargebee

connector.rb のコードを以下に示します。

{
  title: 'Chargebee-demo',

  connection: {
    fields: [
      {
        name: 'api_key',
        control_type: 'password',
        hint: 'You can find your API key final change3' \
          "under 'Settings'=>'Configure Chargebee'=>'API Keys and Webhooks'" \
          " in Chargebee's web console.",
        label: 'Your API Key'
      },
      {
        name: 'domain',
        control_type: 'subdomain',
        url: 'chargebee.com'
      }
    ],

    authorization: {
      type: 'basic_auth',  

      apply: lambda do |connection|
        user(connection['api_key'])
      end
    },

    base_uri: lambda do |connection|
      "https://#{connection['domain']}.chargebee.com"
    end
  },

  test: lambda do |_connection|
    get('/api/v2/plans', limit: 1)
  end,

  triggers: {
    new_updated_object: {

      description: lambda do |_input, picklist_label|
        "New/updated <span class='provider'>#{picklist_label['object'] || 'object'}</span> in <span class='provider'>Chargebee</span>"
      end,

      config_fields: [
        {
          name: 'object',
          control_type: 'select',
          pick_list: 'objects',
          optional: false
        }
      ],

      input_fields: lambda do
        [
          {
            name: 'since',
            type: :date_time,
            optional: true, 
            sticky: true
          }
        ]
      end,

      poll: lambda do |_connection, input, closure|
        page_size = 100
        closure = {} if closure.blank?
        closure['updated_since'] = (closure['updated_since'] || input['since'] || 1.hour.ago).to_time.utc.to_i

        params = {
          "sort_by[asc]": 'updated_at',
          limit: page_size,
          "updated_at[after]": closure['updated_since']
        }

        params['offset'] = closure['offset']

        response = get("/api/v2/#{input['object'].pluralize}", params)

        if response['next_offset'].present?
          closure['offset'] = response['next_offset']
        else
          closure['offset'] = nil
          unless response['list'].size == 0
            closure['updated_since'] =
              response['list'].last[input['object']]['updated_at']
          end
        end

        {
          events: response['list'],
          next_poll: closure,
          can_poll_more: response['next_offset'].present?
        }
      end,

      dedup: lambda do |event|
        if event['subscription'].present?
          "#{event['subscription']['id']}@#{event['subscription']['updated_at']}"
        else
          "#{event['customer']['id']}@#{event['customer']['updated_at']}"
        end
      end,

      output_fields: lambda do |object_definitions|
        object_definitions['new_updated_object_output']
      end
    },

  },
}

settings.yaml.enc に格納されている資格情報です。

api_key: valid_api_key
domain: valid_domain

TIP

暗号化された settings.yaml ファイルを使用する場合は、workato edit <PATH> を使用してファイルを編集または作成する必要があります。詳細については、こちらを参照してください。

SDK Gem を使用すると、アクションの lambda 関数を個別に呼び出して、各部の動作をより詳細に制御することができます。たとえば、input_fields lambda とは独立して execute lambda 関数を実行することができます。

# input_fields lambda と output_fields lambda の実行

このガイドでは、output_fields lambda を取り上げますが、input_fields lambda も同じように実行することができます。

TIP

サンプルのペイロードのリクエストやレスポンスを入手できることがあります。workato generate schema CLI コマンドを使用して、このペイロードを簡単に Workato スキーマに変換することもできます。Workato CLI のスキーマ生成の詳細については、こちらを参照してください。

output_fields lambda は、ユーザーに表示すべき入力項目 (input_fields) に対応する Workato のスキーマを返すことが予期されています。上記コードでは、output_fields lambda を呼び出すと、参照したダウンストリームの object_definitions または methods の評価を Gem が処理します。

$ workato exec triggers.new_updated_object.output_fields --config-fields='fixtures/triggers/new_updated_object/customer_config.json'

[
  {
    "name": "customer",
    "type": "object",
    "properties": [
      {
        "control_type": "text",
        "label": "ID",
        "type": "string",
        "name": "id"
      },
      # More Schema here
    ]
  }
]

TIP

ここでは他のオプションも使うことができます。たとえば、--verbose を指定すると output_fields の構築時に送信された HTTP リクエストの詳細なログが表示され、--output を指定すると関数の出力が JSON ファイルに保存されます。

object_definitions 引数には何も渡す必要はありません。これは、Gem がコネクターを検査する際にその情報を参照できるからです。

# poll lambda の実行

poll lambda は、poll lambda の出力を表すハッシュを返すことが予期されています。poll lambda を実行して機能をテストする方法は2つあります。

  1. ページネーションありの poll lambda の実行
  2. ページネーションなしの poll lambda の実行

# ページネーションありの poll lambda の実行

これには .poll コマンドを使用します。このコマンドは、can_poll_more が true であればすべてのレコードをページネーションするよう SDK Gem に指示します。以下の例では、.poll を指定し、since の入力に 6/09/2021 を指定していることがわかります。これにより SDK Gem は、ポーリングメカニズムのシミュレートに必要な数のリクエストを送信します。fixtures フォルダーに格納される JSON ファイルを指すコマンドで input を参照していることがわかります。このファイルには、input_fieldsconfig_fields から poll lambda に渡される実際の値が格納されているはずです。

この場合、ファイル fixtures/triggers/new_updated_object/customer_input_poll.json の内容は以下のとおりです。

{
  "object": "customer",
  "since": "6/09/2021"
}
$ workato exec triggers.new_updated_object.poll --input='fixtures/triggers/new_updated_object/customer_input_poll.json' --verbose

SETTINGS
{
  "api_key": "valid_api_key",
  "domain": "valid_domain"
}
INPUT
{
  "object": "customer",
  "since": "6/09/2021"
}

RestClient.get "https://live_Zbaoo7hGqvi3cqrza8WiXxQa8kBPAPQF@empressporridge.chargebee.com/api/v2/customers?limit=10&offset=&sort_by%5Basc%5D=updated_at&updated_at%5Bafter%5D=1630857600", "Accept"=>"application/json", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client/2.0.2 (darwin19.6.0 x86_64) ruby/2.4.10p364"
# => 200 OK | application/json 2608 bytes                                                                                           
RestClient.get "https://live_Zbaoo7hGqvi3cqrza8WiXxQa8kBPAPQF@empressporridge.chargebee.com/api/v2/customers?limit=10&offset=%5B%221630857607410%22%2C%2240736845%22%5D&sort_by%5Basc%5D=updated_at&updated_at%5Bafter%5D=1630857600", "Accept"=>"application/json", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client/2.0.2 (darwin19.6.0 x86_64) ruby/2.4.10p364"
# => 200 OK | application/json 1800 bytes                                                                                           
Progress: |=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---|

OUTPUT
{
  "events": [
    {
      "customer": {
        "id": "abc",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john@example.com",
        "phone": "+100",
        "auto_collection": "on",
        "net_term_days": 0,
        "allow_direct_debit": false,
        "created_at": 1629814951,
        "taxability": "taxable",
        "updated_at": 1630857613,
        "locale": "en-SG",
        "pii_cleared": "active",
        "resource_version": 1630857613348,
        "deleted": false,
        "object": "customer",
        "card_status": "valid",
        "promotional_credits": 0,
        "refundable_credits": 0,
        "excess_payments": 0,
        "unbilled_charges": 0,
        "preferred_currency_code": "SGD",
      },
    },
    # More customers here
  ],
  "can_poll_more": false,
  "next_poll": {
    "updated_since": 1630857613,
    "offset": null
  }
}

--verbose を使用すると、SDK Gem が、API リクエストやレスポンスなど、より多くの情報を出力することに注意してください。

TIP

--output などのオプションを使用して、関数の出力を JSON ファイルに保存することもできます。

config_field (object) が入力 JSON で渡されていることがわかります。Workato では、config_fields が executepoll、または webhook lambda で受信されると、通常の input_fields とマージされます。

# ページネーションなしの poll lambda の実行

これには .poll_page コマンドを使用します。このコマンドは、can_poll_more の値にかかわらず、poll lambda を一度だけ呼び出すよう SDK Gem に指示します。以下の例では、.poll を指定し、since の入力に 6/09/2021 を指定していることがわかります。SDK Gem はリクエストを1つだけ送信し、最初のリクエストが完了すると実行を停止します。

workato exec triggers.new_updated_object.poll_page --input='fixtures/triggers/new_updated_object/customer_input_poll.json' --verbose

SETTINGS
{
  "api_key": "valid_api_key",
  "domain": "valid_domain"
}
INPUT
{
  "object": "customer",
  "since": "6/09/2021"
}

RestClient.get "https://live_Zbaoo7hGqvi3cqrza8WiXxQa8kBPAPQF@empressporridge.chargebee.com/api/v2/customers?limit=10&offset=&sort_by%5Basc%5D=updated_at&updated_at%5Bafter%5D=1630857600", "Accept"=>"application/json", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client/2.0.2 (darwin19.6.0 x86_64) ruby/2.4.10p364"
# => 200 OK | application/json 2608 bytes 

Progress: |=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---|

OUTPUT
{
  "events": [
    {
      "customer": {
        "id": "abc",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john@example.com",
        "phone": "+100",
        "auto_collection": "on",
        "net_term_days": 0,
        "allow_direct_debit": false,
        "created_at": 1629814951,
        "taxability": "taxable",
        "updated_at": 1630857613,
        "locale": "en-SG",
        "pii_cleared": "active",
        "resource_version": 1630857613348,
        "deleted": false,
        "object": "customer",
        "card_status": "valid",
        "promotional_credits": 0,
        "refundable_credits": 0,
        "excess_payments": 0,
        "unbilled_charges": 0,
        "preferred_currency_code": "SGD",
      },
    },
    # More customers here
  ],
  "next_poll": {
    "updated_since": 1630857600,
    "offset": "[\"1630857607410\",\"40736845\"]"
  },
  "can_poll_more": true
}

--verbose を使用すると、SDK Gem が、API リクエストやレスポンスなど、より多くの情報を出力することに注意してください。

TIP

--output などのオプションを使用して、関数の出力を JSON ファイルに保存することもできます。

config_field (object) が入力 JSON で渡されていることがわかります。Workato では、config_fields が executepoll、または webhook lambda で受信されると、通常の input_fields とマージされます。


Last updated: 2023/8/31 1:07:14