コンスタント コンタクト v3 APIに接続し、現在のユーザーの電子メール アドレスをコンスタント コンタクトのリストに追加するコントローラーを Rails アプリに正常に作成しました。ただし、これは、ユーザーがログインしていて、ブラウザのリンクをクリックしてプロセスをトリガーする場合にのみ機能します。
これをリファクタリングする方法 (after_create
たとえば、User モデルのコールバックを使用) やバックグラウンド ジョブがわかりません。新しいユーザーがサインアップしたときに、これが舞台裏で行われることを望みます。Constant Contact API ドキュメントのOAuth2.0 サーバー フローに従っています。
現在の動作は次のとおりです。
- ユーザーはサインアップして
constant_contact#index
ページ (/constant-contact) にアクセスし、そこでリンクをクリックして私の Constant Contact API キーを Constant Contact に送信します。 constant_contact#callback
Constant Contact は、 (/constant-contact/callback)に設定したリダイレクト URL に認証コードで応答します。- 私の
constant_contact#callback
アクションでは、params から認証コードを取得し、それを使用して JSON 投稿を作成し、認証コードを Constant Contact API に送信して、Constant Contact が正しいドメインと通信していることを認識できるようにします。 - すると、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 アカウントの特定のリストに追加したいだけです。