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>
110 lines
2.4 KiB
Ruby
110 lines
2.4 KiB
Ruby
class Integrations::App
|
|
include Linear::IntegrationHelper
|
|
attr_accessor :params
|
|
|
|
def initialize(params)
|
|
@params = params
|
|
end
|
|
|
|
def id
|
|
params[:id]
|
|
end
|
|
|
|
def name
|
|
I18n.t("integration_apps.#{params[:i18n_key]}.name")
|
|
end
|
|
|
|
def description
|
|
I18n.t("integration_apps.#{params[:i18n_key]}.description")
|
|
end
|
|
|
|
def logo
|
|
params[:logo]
|
|
end
|
|
|
|
def fields
|
|
params[:fields]
|
|
end
|
|
|
|
# There is no way to get the account_id from the linear callback
|
|
# so we are using the generate_linear_token method to generate a token and encode it in the state parameter
|
|
def encode_state
|
|
generate_linear_token(Current.account.id)
|
|
end
|
|
|
|
def action
|
|
case params[:id]
|
|
when 'slack'
|
|
"#{params[:action]}&client_id=#{ENV.fetch('SLACK_CLIENT_ID', nil)}&redirect_uri=#{self.class.slack_integration_url}"
|
|
when 'linear'
|
|
build_linear_action
|
|
else
|
|
params[:action]
|
|
end
|
|
end
|
|
|
|
def active?(account)
|
|
case params[:id]
|
|
when 'slack'
|
|
ENV['SLACK_CLIENT_SECRET'].present?
|
|
when 'linear'
|
|
GlobalConfigService.load('LINEAR_CLIENT_ID', nil).present?
|
|
when 'shopify'
|
|
account.feature_enabled?('shopify_integration') && GlobalConfigService.load('SHOPIFY_CLIENT_ID', nil).present?
|
|
else
|
|
true
|
|
end
|
|
end
|
|
|
|
def build_linear_action
|
|
app_id = GlobalConfigService.load('LINEAR_CLIENT_ID', nil)
|
|
[
|
|
"#{params[:action]}?response_type=code",
|
|
"client_id=#{app_id}",
|
|
"redirect_uri=#{self.class.linear_integration_url}",
|
|
"state=#{encode_state}",
|
|
'scope=read,write',
|
|
'prompt=consent'
|
|
].join('&')
|
|
end
|
|
|
|
def enabled?(account)
|
|
case params[:id]
|
|
when 'webhook'
|
|
account.webhooks.exists?
|
|
when 'dashboard_apps'
|
|
account.dashboard_apps.exists?
|
|
else
|
|
account.hooks.exists?(app_id: id)
|
|
end
|
|
end
|
|
|
|
def hooks
|
|
Current.account.hooks.where(app_id: id)
|
|
end
|
|
|
|
def self.slack_integration_url
|
|
"#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{Current.account.id}/settings/integrations/slack"
|
|
end
|
|
|
|
def self.linear_integration_url
|
|
"#{ENV.fetch('FRONTEND_URL', nil)}/linear/callback"
|
|
end
|
|
|
|
class << self
|
|
def apps
|
|
Hashie::Mash.new(APPS_CONFIG)
|
|
end
|
|
|
|
def all
|
|
apps.values.each_with_object([]) do |app, result|
|
|
result << new(app)
|
|
end
|
|
end
|
|
|
|
def find(params)
|
|
all.detect { |app| app.id == params[:id] }
|
|
end
|
|
end
|
|
end
|