Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
129
research/chatwoot/app/models/integrations/app.rb
Normal file
129
research/chatwoot/app/models/integrations/app.rb
Normal file
@@ -0,0 +1,129 @@
|
||||
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 short_description
|
||||
I18n.t("integration_apps.#{params[:i18n_key]}.short_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'
|
||||
client_id = GlobalConfigService.load('SLACK_CLIENT_ID', nil)
|
||||
"#{params[:action]}&client_id=#{client_id}&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'
|
||||
GlobalConfigService.load('SLACK_CLIENT_SECRET', nil).present?
|
||||
when 'linear'
|
||||
account.feature_enabled?('linear_integration') && GlobalConfigService.load('LINEAR_CLIENT_ID', nil).present?
|
||||
when 'shopify'
|
||||
shopify_enabled?(account)
|
||||
when 'leadsquared'
|
||||
account.feature_enabled?('crm_integration')
|
||||
when 'notion'
|
||||
notion_enabled?(account)
|
||||
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',
|
||||
'actor=app'
|
||||
].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
|
||||
|
||||
private
|
||||
|
||||
def shopify_enabled?(account)
|
||||
account.feature_enabled?('shopify_integration') && GlobalConfigService.load('SHOPIFY_CLIENT_ID', nil).present?
|
||||
end
|
||||
|
||||
def notion_enabled?(account)
|
||||
account.feature_enabled?('notion_integration') && GlobalConfigService.load('NOTION_CLIENT_ID', nil).present?
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user