1

コンスタント コンタクト v3 APIに接続し、現在のユーザーの電子メール アドレスをコンスタント コンタクトのリストに追加するコントローラーを Rails アプリに正常に作成しました。ただし、これは、ユーザーがログインしていて、ブラウザのリンクをクリックしてプロセスをトリガーする場合にのみ機能します。

これをリファクタリングする方法 (after_createたとえば、User モデルのコールバックを使用) やバックグラウンド ジョブがわかりません。新しいユーザーがサインアップしたときに、これが舞台裏で行われることを望みます。Constant Contact API ドキュメントのOAuth2.0 サーバー フローに従っています。

現在の動作は次のとおりです。

  1. ユーザーはサインアップしてconstant_contact#indexページ (/constant-contact) にアクセスし、そこでリンクをクリックして私の Constant Contact API キーを Constant Contact に送信します。
  2. constant_contact#callbackConstant Contact は、 (/constant-contact/callback)に設定したリダイレクト URL に認証コードで応答します。
  3. 私のconstant_contact#callbackアクションでは、params から認証コードを取得し、それを使用して JSON 投稿を作成し、認証コードを Constant Contact API に送信して、Constant Contact が正しいドメインと通信していることを認識できるようにします。
  4. すると、Constant Contact が私の /constant-contact/callback URL に返されるトークンで応答します。このトークンを使用して、Constant Contact API と対話できます。

これが私がそのすべてを行うために使用しているコントローラーです(読みやすい場合は要点バージョン):

require 'oauth2'

class ConstantContactController < ApplicationController

  before_action :set_constant_contact

  def index

    # Build the authorization url to request the authorization code

    auth_request_base_url = "https://api.cc.email/v3/idfed"
    auth_url = auth_request_base_url + "?client_id=" + @client_id + "&scope=account_read+contact_data&response_type=code" + "&redirect_uri=" + @redirect_uri

    # Send the authorization url by clicking link. Could also use HTTParty.get(auth_url)

    @send_auth_url = auth_url

  end

  def callback

    # Receive the initial response from Constant Contact at /constant-contact

    auth_code = params[:code]
    @auth_code = auth_code

    # Now build the authorization code url that we'll use to request a token

    auth_code_base_url = "https://idfed.constantcontact.com/as/token.oauth2"
    auth_code_request_url = auth_code_base_url + '?code=' + auth_code + '&redirect_uri=' + @redirect_uri + '&grant_type=authorization_code&scope=contact_data'

    # Build the token request with the authorization code request url
    # First, set up the Header (make string of "API_KEY:SECRET")

    auth = @client_id + ':' + @secret

    # Base64 encode it

    credentials = Base64.strict_encode64(auth)

    # Build and set the Authorization header to use the encoded credentials

    authorization = "Basic " + credentials

    # Send the request for a token

    token_response = HTTParty.post("#{auth_code_request_url}",
      :headers => {
                 "Content-Type" => 'application/json',
                 "Authorization" => "#{authorization}"
                }
    )

    # Parse the token response

    token_body = JSON.parse(token_response.body)
    token = token_body["access_token"]
    token_auth = "Bearer " + token

    @account_summary = HTTParty.get("https://api.cc.email/v3/account/summary",
      :headers => {
                 "Accept" => 'application/json',
                 "Authorization" => "#{token_auth}"
                }
    )

    # Add the current user's email to Constant Contact list

    list_uuid = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"

    @successful_response = HTTParty.post("https://api.cc.email/v3/contacts/sign_up_form",
      :headers => {
                 'Content-Type' => 'application/json',
                 "Authorization" => "#{token_auth}",
              },
      :body => {
        "email_address": "#{current_user.email}",
        "list_memberships": [ "#{list_uuid}" ],
      }.to_json
    )

  end

  private

  def set_constant_contact
    # set the constant contact account
    if Rails.env == "development"
      @redirect_uri = "https://xxxxxxxxx.ngrok.io/constant-contact/callback"
    elsif Rails.env == "production" # => "production"
      @redirect_uri = "https://xxxxxxx.herokuapp.com/constant-contact/callback"
    end

    @client_id = Rails.application.credentials.dig(:constant_contact, :api_key)
    @secret  = Rails.application.credentials.dig(:constant_contact, :app_secret)
  end
end

これらはすべてブラウザーで手動で機能しますが、ユーザーがサインアップしたときにこれらすべてを自動的に実行するバックグラウンド ジョブをトリガーするようにリファクタリングするにはどうすればよいでしょうか?

固定連絡先アカウントは変更されません。新しいユーザーがサインアップしたときに、Constant Contact アカウントの特定のリストに追加したいだけです。

4

0 に答える 0