Feature: Slack integration (#783)

- Integrations architecture
- Slack integration
This commit is contained in:
Subin T P
2020-06-12 23:12:47 +05:30
committed by GitHub
parent 4f3b483066
commit ed1c871633
44 changed files with 867 additions and 7 deletions

View File

@@ -47,6 +47,7 @@ class Account < ApplicationRecord
has_many :webhooks, dependent: :destroy
has_many :labels, dependent: :destroy
has_many :notification_settings, dependent: :destroy
has_many :hooks, dependent: :destroy, class_name: 'Integrations::Hook'
has_flags ACCOUNT_SETTINGS_FLAGS.merge(column: 'settings_flags').merge(DEFAULT_QUERY_SETTING)
enum locale: LANGUAGES_CONFIG.map { |key, val| [val[:iso_639_1_code], key] }.to_h

View File

@@ -5,6 +5,7 @@
# id :integer not null, primary key
# additional_attributes :jsonb
# agent_last_seen_at :datetime
# identifier :string
# locked :boolean default(FALSE)
# status :integer default("open"), not null
# user_last_seen_at :datetime

View File

@@ -42,6 +42,7 @@ class Inbox < ApplicationRecord
has_one :agent_bot_inbox, dependent: :destroy
has_one :agent_bot, through: :agent_bot_inbox
has_many :webhooks, dependent: :destroy
has_many :hooks, dependent: :destroy, class_name: 'Integrations::Hook'
after_destroy :delete_round_robin_agents

View File

@@ -0,0 +1,5 @@
module Integrations
def self.table_name_prefix
'integrations_'
end
end

View File

@@ -0,0 +1,51 @@
class Integrations::App
attr_accessor :params
def initialize(params)
@params = params
end
def id
params[:id]
end
def name
params[:name]
end
def description
params[:description]
end
def logo
params[:logo]
end
def fields
params[:fields]
end
def button
params[:button]
end
def enabled?(account)
account.hooks.where(app_id: id).exists?
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

View File

@@ -0,0 +1,36 @@
# == Schema Information
#
# Table name: integrations_hooks
#
# id :bigint not null, primary key
# access_token :string
# hook_type :integer default("account")
# settings :text
# status :integer default("disabled")
# created_at :datetime not null
# updated_at :datetime not null
# account_id :integer
# app_id :string
# inbox_id :integer
# reference_id :string
#
class Integrations::Hook < ApplicationRecord
validates :account_id, presence: true
validates :app_id, presence: true
enum status: { disabled: 0, enabled: 1 }
belongs_to :account
belongs_to :inbox, optional: true
has_secure_token :access_token
enum hook_type: { account: 0, inbox: 1 }
def app
@app ||= Integrations::App.find(id: app_id)
end
def slack?
app_id == 'cw_slack'
end
end