mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-29 18:22:53 +00:00
This PR adds native integration with Shopify. No more dashboard apps. The support agents can view the orders, their status and the link to the order page on the conversation sidebar. This PR does the following: - Create an integration with Shopify (a new app is added in the integrations tab) - Option to configure it in SuperAdmin - OAuth endpoint and the callbacks. - Frontend component to render the orders. (We might need to cache it in the future) --------- Co-authored-by: iamsivin <iamsivin@gmail.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
73 lines
1.5 KiB
Ruby
73 lines
1.5 KiB
Ruby
class Shopify::CallbacksController < ApplicationController
|
|
include Shopify::IntegrationHelper
|
|
|
|
def show
|
|
verify_account!
|
|
|
|
@response = oauth_client.auth_code.get_token(
|
|
params[:code],
|
|
redirect_uri: '/shopify/callback'
|
|
)
|
|
|
|
handle_response
|
|
rescue StandardError => e
|
|
Rails.logger.error("Shopify callback error: #{e.message}")
|
|
redirect_to "#{redirect_uri}?error=true"
|
|
end
|
|
|
|
private
|
|
|
|
def verify_account!
|
|
@account_id = verify_shopify_token(params[:state])
|
|
raise StandardError, 'Invalid state parameter' if account.blank?
|
|
end
|
|
|
|
def handle_response
|
|
account.hooks.create!(
|
|
app_id: 'shopify',
|
|
access_token: parsed_body['access_token'],
|
|
status: 'enabled',
|
|
reference_id: params[:shop],
|
|
settings: {
|
|
scope: parsed_body['scope']
|
|
}
|
|
)
|
|
|
|
redirect_to shopify_integration_url
|
|
end
|
|
|
|
def parsed_body
|
|
@parsed_body ||= @response.response.parsed
|
|
end
|
|
|
|
def oauth_client
|
|
OAuth2::Client.new(
|
|
client_id,
|
|
client_secret,
|
|
{
|
|
site: "https://#{params[:shop]}",
|
|
authorize_url: '/admin/oauth/authorize',
|
|
token_url: '/admin/oauth/access_token'
|
|
}
|
|
)
|
|
end
|
|
|
|
def account
|
|
@account ||= Account.find(@account_id)
|
|
end
|
|
|
|
def account_id
|
|
@account_id ||= params[:state].split('_').first
|
|
end
|
|
|
|
def shopify_integration_url
|
|
"#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{account.id}/settings/integrations/shopify"
|
|
end
|
|
|
|
def redirect_uri
|
|
return shopify_integration_url if account
|
|
|
|
ENV.fetch('FRONTEND_URL', nil)
|
|
end
|
|
end
|