mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-02 12:08:01 +00:00
chore: Upgrade rails and ruby versions (#2400)
ruby version: 3.0.2 rails version: 6.1.4
This commit is contained in:
@@ -7,7 +7,7 @@ defaults: &defaults
|
|||||||
working_directory: ~/build
|
working_directory: ~/build
|
||||||
docker:
|
docker:
|
||||||
# specify the version you desire here
|
# specify the version you desire here
|
||||||
- image: circleci/ruby:2.7.3-node-browsers
|
- image: circleci/ruby:3.0.2-node-browsers
|
||||||
|
|
||||||
# Specify service dependencies here if necessary
|
# Specify service dependencies here if necessary
|
||||||
# CircleCI maintains a library of pre-built images
|
# CircleCI maintains a library of pre-built images
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# pre-build stage
|
# pre-build stage
|
||||||
ARG VARIANT=2.7
|
ARG VARIANT=3
|
||||||
FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
|
FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
|
||||||
|
|
||||||
# Update args in docker-compose.yaml to set the UID/GID of the "vscode" user.
|
# Update args in docker-compose.yaml to set the UID/GID of the "vscode" user.
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ services:
|
|||||||
context: ..
|
context: ..
|
||||||
dockerfile: .devcontainer/Dockerfile
|
dockerfile: .devcontainer/Dockerfile
|
||||||
args:
|
args:
|
||||||
# Update 'VARIANT' to pick a Ruby version: 2, 2.7, 2.6, 2.5
|
# Update 'VARIANT' to pick a Ruby version: https://github.com/microsoft/vscode-dev-containers/tree/main/containers/ruby
|
||||||
VARIANT: 2.7
|
VARIANT: 3
|
||||||
# [Choice] Install Node.js
|
# [Choice] Install Node.js
|
||||||
INSTALL_NODE: "true"
|
INSTALL_NODE: "true"
|
||||||
NODE_VERSION: "lts/*"
|
NODE_VERSION: "lts/*"
|
||||||
|
|||||||
30
.rubocop.yml
30
.rubocop.yml
@@ -40,6 +40,14 @@ Style/ClassVars:
|
|||||||
Lint/MissingSuper:
|
Lint/MissingSuper:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/drops/base_drop.rb'
|
- 'app/drops/base_drop.rb'
|
||||||
|
Lint/SymbolConversion:
|
||||||
|
Enabled: false
|
||||||
|
Lint/EmptyBlock:
|
||||||
|
Exclude:
|
||||||
|
- 'app/views/api/v1/accounts/conversations/toggle_status.json.jbuilder'
|
||||||
|
Lint/OrAssignmentToConstant:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/redis/config.rb'
|
||||||
Metrics/BlockLength:
|
Metrics/BlockLength:
|
||||||
Exclude:
|
Exclude:
|
||||||
- spec/**/*
|
- spec/**/*
|
||||||
@@ -58,6 +66,10 @@ Rails/ApplicationController:
|
|||||||
- 'app/controllers/platform_controller.rb'
|
- 'app/controllers/platform_controller.rb'
|
||||||
- 'app/controllers/public_controller.rb'
|
- 'app/controllers/public_controller.rb'
|
||||||
- 'app/controllers/survey/responses_controller.rb'
|
- 'app/controllers/survey/responses_controller.rb'
|
||||||
|
Rails/EnvironmentVariableAccess:
|
||||||
|
Enabled: false
|
||||||
|
Rails/TimeZoneAssignment:
|
||||||
|
Enabled: false
|
||||||
Style/ClassAndModuleChildren:
|
Style/ClassAndModuleChildren:
|
||||||
EnforcedStyle: compact
|
EnforcedStyle: compact
|
||||||
Exclude:
|
Exclude:
|
||||||
@@ -67,6 +79,10 @@ RSpec/NestedGroups:
|
|||||||
Max: 4
|
Max: 4
|
||||||
RSpec/MessageSpies:
|
RSpec/MessageSpies:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
RSpec/StubbedMock:
|
||||||
|
Enabled: false
|
||||||
|
Naming/VariableNumber:
|
||||||
|
Enabled: false
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'db/migrate/20161123131628_devise_token_auth_create_users.rb'
|
- 'db/migrate/20161123131628_devise_token_auth_create_users.rb'
|
||||||
@@ -114,14 +130,19 @@ Rails/UniqueValidationWithoutIndex:
|
|||||||
- 'app/models/channel/twitter_profile.rb'
|
- 'app/models/channel/twitter_profile.rb'
|
||||||
- 'app/models/webhook.rb'
|
- 'app/models/webhook.rb'
|
||||||
- 'app/models/contact.rb'
|
- 'app/models/contact.rb'
|
||||||
|
- 'app/models/integrations/hook.rb'
|
||||||
Rails/RenderInline:
|
Rails/RenderInline:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/controllers/swagger_controller.rb'
|
- 'app/controllers/swagger_controller.rb'
|
||||||
|
Performance/CollectionLiteralInLoop:
|
||||||
|
Exclude:
|
||||||
|
- 'db/migrate/20210315101919_enable_email_channel.rb'
|
||||||
RSpec/NamedSubject:
|
RSpec/NamedSubject:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
# we should bring this down
|
# we should bring this down
|
||||||
RSpec/MultipleMemoizedHelpers:
|
RSpec/MultipleMemoizedHelpers:
|
||||||
Max: 12
|
Max: 12
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
NewCops: enable
|
NewCops: enable
|
||||||
Exclude:
|
Exclude:
|
||||||
@@ -136,4 +157,11 @@ AllCops:
|
|||||||
- 'tmp/**/*'
|
- 'tmp/**/*'
|
||||||
- 'storage/**/*'
|
- 'storage/**/*'
|
||||||
- 'db/migrate/20200225162150_init_schema.rb'
|
- 'db/migrate/20200225162150_init_schema.rb'
|
||||||
- 'config/initializers/azure_storage_service_patch.rb'
|
- 'db/migrate/20210611180222_create_active_storage_variant_records.active_storage.rb'
|
||||||
|
- 'db/migrate/20210611180221_add_service_name_to_active_storage_blobs.active_storage.rb'
|
||||||
|
- db/migrate/20200309213132_add_account_id_to_agent_bot_inboxes.rb
|
||||||
|
- db/migrate/20200331095710_add_identifier_to_contact.rb
|
||||||
|
- db/migrate/20200429082655_add_medium_to_twilio_sms.rb
|
||||||
|
- db/migrate/20200503151130_add_account_feature_flag.rb
|
||||||
|
- db/migrate/20200927135222_add_last_activity_at_to_conversation.rb
|
||||||
|
- db/migrate/20210306170117_add_last_activity_at_to_contacts.rb
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.7.3
|
3.0.2
|
||||||
|
|||||||
17
Gemfile
17
Gemfile
@@ -1,6 +1,6 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
ruby '2.7.3'
|
ruby '3.0.2'
|
||||||
|
|
||||||
##-- base gems for rails --##
|
##-- base gems for rails --##
|
||||||
gem 'rack-cors', require: 'rack/cors'
|
gem 'rack-cors', require: 'rack/cors'
|
||||||
@@ -40,7 +40,7 @@ gem 'rack-attack'
|
|||||||
gem 'aws-sdk-s3', require: false
|
gem 'aws-sdk-s3', require: false
|
||||||
gem 'azure-storage-blob', require: false
|
gem 'azure-storage-blob', require: false
|
||||||
gem 'google-cloud-storage', require: false
|
gem 'google-cloud-storage', require: false
|
||||||
gem 'mini_magick'
|
gem 'image_processing'
|
||||||
|
|
||||||
##-- gems for database --#
|
##-- gems for database --#
|
||||||
gem 'groupdate'
|
gem 'groupdate'
|
||||||
@@ -91,8 +91,11 @@ gem 'google-cloud-dialogflow'
|
|||||||
##--- gems for debugging and error reporting ---##
|
##--- gems for debugging and error reporting ---##
|
||||||
# static analysis
|
# static analysis
|
||||||
gem 'brakeman'
|
gem 'brakeman'
|
||||||
|
gem 'ddtrace'
|
||||||
gem 'scout_apm'
|
gem 'scout_apm'
|
||||||
gem 'sentry-raven'
|
gem 'sentry-rails'
|
||||||
|
gem 'sentry-ruby'
|
||||||
|
gem 'sentry-sidekiq'
|
||||||
|
|
||||||
##-- background job processing --##
|
##-- background job processing --##
|
||||||
gem 'sidekiq'
|
gem 'sidekiq'
|
||||||
@@ -121,7 +124,7 @@ group :development do
|
|||||||
gem 'web-console'
|
gem 'web-console'
|
||||||
|
|
||||||
# used in swagger build
|
# used in swagger build
|
||||||
gem 'json_refs', git: 'https://github.com/tzmfreedom/json_refs', ref: '131b11294fd6af9c428171f38516e6222a58c874'
|
gem 'json_refs'
|
||||||
|
|
||||||
# When we want to squash migrations
|
# When we want to squash migrations
|
||||||
gem 'squasher'
|
gem 'squasher'
|
||||||
@@ -135,19 +138,19 @@ group :test do
|
|||||||
end
|
end
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
|
gem 'active_record_query_trace'
|
||||||
gem 'bundle-audit', require: false
|
gem 'bundle-audit', require: false
|
||||||
gem 'byebug', platform: :mri
|
gem 'byebug', platform: :mri
|
||||||
gem 'factory_bot_rails'
|
gem 'factory_bot_rails'
|
||||||
gem 'faker'
|
gem 'faker'
|
||||||
gem 'listen'
|
gem 'listen'
|
||||||
gem 'mock_redis', git: 'https://github.com/sds/mock_redis', ref: '16d00789f0341a3aac35126c0ffe97a596753ff9'
|
gem 'mock_redis'
|
||||||
gem 'pry-rails'
|
gem 'pry-rails'
|
||||||
gem 'rspec-rails', '~> 4.0.0.beta2'
|
gem 'rspec-rails', '~> 5.0.0'
|
||||||
gem 'rubocop', require: false
|
gem 'rubocop', require: false
|
||||||
gem 'rubocop-performance', require: false
|
gem 'rubocop-performance', require: false
|
||||||
gem 'rubocop-rails', require: false
|
gem 'rubocop-rails', require: false
|
||||||
gem 'rubocop-rspec', require: false
|
gem 'rubocop-rspec', require: false
|
||||||
gem 'scss_lint', require: false
|
|
||||||
gem 'seed_dump'
|
gem 'seed_dump'
|
||||||
gem 'shoulda-matchers'
|
gem 'shoulda-matchers'
|
||||||
gem 'simplecov', '0.17.1', require: false
|
gem 'simplecov', '0.17.1', require: false
|
||||||
|
|||||||
513
Gemfile.lock
513
Gemfile.lock
@@ -1,80 +1,70 @@
|
|||||||
GIT
|
|
||||||
remote: https://github.com/sds/mock_redis
|
|
||||||
revision: 16d00789f0341a3aac35126c0ffe97a596753ff9
|
|
||||||
ref: 16d00789f0341a3aac35126c0ffe97a596753ff9
|
|
||||||
specs:
|
|
||||||
mock_redis (0.22.0)
|
|
||||||
|
|
||||||
GIT
|
|
||||||
remote: https://github.com/tzmfreedom/json_refs
|
|
||||||
revision: 131b11294fd6af9c428171f38516e6222a58c874
|
|
||||||
ref: 131b11294fd6af9c428171f38516e6222a58c874
|
|
||||||
specs:
|
|
||||||
json_refs (0.1.6)
|
|
||||||
hana
|
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (6.0.3.7)
|
actioncable (6.1.4)
|
||||||
actionpack (= 6.0.3.7)
|
actionpack (= 6.1.4)
|
||||||
|
activesupport (= 6.1.4)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (6.0.3.7)
|
actionmailbox (6.1.4)
|
||||||
actionpack (= 6.0.3.7)
|
actionpack (= 6.1.4)
|
||||||
activejob (= 6.0.3.7)
|
activejob (= 6.1.4)
|
||||||
activerecord (= 6.0.3.7)
|
activerecord (= 6.1.4)
|
||||||
activestorage (= 6.0.3.7)
|
activestorage (= 6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
actionmailer (6.0.3.7)
|
actionmailer (6.1.4)
|
||||||
actionpack (= 6.0.3.7)
|
actionpack (= 6.1.4)
|
||||||
actionview (= 6.0.3.7)
|
actionview (= 6.1.4)
|
||||||
activejob (= 6.0.3.7)
|
activejob (= 6.1.4)
|
||||||
|
activesupport (= 6.1.4)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
actionpack (6.0.3.7)
|
actionpack (6.1.4)
|
||||||
actionview (= 6.0.3.7)
|
actionview (= 6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
rack (~> 2.0, >= 2.0.8)
|
rack (~> 2.0, >= 2.0.9)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||||
actiontext (6.0.3.7)
|
actiontext (6.1.4)
|
||||||
actionpack (= 6.0.3.7)
|
actionpack (= 6.1.4)
|
||||||
activerecord (= 6.0.3.7)
|
activerecord (= 6.1.4)
|
||||||
activestorage (= 6.0.3.7)
|
activestorage (= 6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (6.0.3.7)
|
actionview (6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||||
activejob (6.0.3.7)
|
active_record_query_trace (1.8)
|
||||||
activesupport (= 6.0.3.7)
|
activejob (6.1.4)
|
||||||
|
activesupport (= 6.1.4)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (6.0.3.7)
|
activemodel (6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
activerecord (6.0.3.7)
|
activerecord (6.1.4)
|
||||||
activemodel (= 6.0.3.7)
|
activemodel (= 6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
activerecord-import (1.0.7)
|
activerecord-import (1.2.0)
|
||||||
activerecord (>= 3.2)
|
activerecord (>= 3.2)
|
||||||
activestorage (6.0.3.7)
|
activestorage (6.1.4)
|
||||||
actionpack (= 6.0.3.7)
|
actionpack (= 6.1.4)
|
||||||
activejob (= 6.0.3.7)
|
activejob (= 6.1.4)
|
||||||
activerecord (= 6.0.3.7)
|
activerecord (= 6.1.4)
|
||||||
|
activesupport (= 6.1.4)
|
||||||
marcel (~> 1.0.0)
|
marcel (~> 1.0.0)
|
||||||
activesupport (6.0.3.7)
|
mini_mime (>= 1.1.0)
|
||||||
|
activesupport (6.1.4)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
minitest (~> 5.1)
|
minitest (>= 5.1)
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 2.0)
|
||||||
zeitwerk (~> 2.2, >= 2.2.2)
|
zeitwerk (~> 2.3)
|
||||||
acts-as-taggable-on (6.5.0)
|
acts-as-taggable-on (8.1.0)
|
||||||
activerecord (>= 5.0, < 6.1)
|
activerecord (>= 5.0, < 6.2)
|
||||||
addressable (2.8.0)
|
addressable (2.8.0)
|
||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
administrate (0.16.0)
|
administrate (0.16.0)
|
||||||
@@ -90,23 +80,23 @@ GEM
|
|||||||
annotate (3.1.1)
|
annotate (3.1.1)
|
||||||
activerecord (>= 3.2, < 7.0)
|
activerecord (>= 3.2, < 7.0)
|
||||||
rake (>= 10.4, < 14.0)
|
rake (>= 10.4, < 14.0)
|
||||||
ast (2.4.1)
|
ast (2.4.2)
|
||||||
attr_extras (6.2.4)
|
attr_extras (6.2.4)
|
||||||
aws-eventstream (1.1.0)
|
aws-eventstream (1.1.1)
|
||||||
aws-partitions (1.360.0)
|
aws-partitions (1.482.0)
|
||||||
aws-sdk-core (3.105.0)
|
aws-sdk-core (3.119.0)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1, >= 1.239.0)
|
aws-partitions (~> 1, >= 1.239.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
jmespath (~> 1.0)
|
jmespath (~> 1.0)
|
||||||
aws-sdk-kms (1.37.0)
|
aws-sdk-kms (1.46.0)
|
||||||
aws-sdk-core (~> 3, >= 3.99.0)
|
aws-sdk-core (~> 3, >= 3.119.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.79.1)
|
aws-sdk-s3 (1.98.0)
|
||||||
aws-sdk-core (~> 3, >= 3.104.3)
|
aws-sdk-core (~> 3, >= 3.119.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sigv4 (1.2.2)
|
aws-sigv4 (1.2.4)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
axiom-types (0.1.1)
|
axiom-types (0.1.1)
|
||||||
descendants_tracker (~> 0.0.4)
|
descendants_tracker (~> 0.0.4)
|
||||||
@@ -120,42 +110,48 @@ GEM
|
|||||||
faraday_middleware (~> 1.0.0.rc1)
|
faraday_middleware (~> 1.0.0.rc1)
|
||||||
net-http-persistent (~> 4.0)
|
net-http-persistent (~> 4.0)
|
||||||
nokogiri (~> 1.11.0.rc2)
|
nokogiri (~> 1.11.0.rc2)
|
||||||
barnes (0.0.8)
|
barnes (0.0.9)
|
||||||
multi_json (~> 1)
|
multi_json (~> 1)
|
||||||
statsd-ruby (~> 1.1)
|
statsd-ruby (~> 1.1)
|
||||||
bcrypt (3.1.16)
|
bcrypt (3.1.16)
|
||||||
bindex (0.8.1)
|
bindex (0.8.1)
|
||||||
bootsnap (1.4.8)
|
bootsnap (1.7.6)
|
||||||
msgpack (~> 1.0)
|
msgpack (~> 1.0)
|
||||||
brakeman (4.9.0)
|
brakeman (5.1.1)
|
||||||
browser (5.3.1)
|
browser (5.3.1)
|
||||||
builder (3.2.4)
|
builder (3.2.4)
|
||||||
bullet (6.1.0)
|
bullet (6.1.4)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
uniform_notifier (~> 1.11)
|
uniform_notifier (~> 1.11)
|
||||||
bundle-audit (0.1.0)
|
bundle-audit (0.1.0)
|
||||||
bundler-audit
|
bundler-audit
|
||||||
bundler-audit (0.7.0.1)
|
bundler-audit (0.8.0)
|
||||||
bundler (>= 1.2.0, < 3)
|
bundler (>= 1.2.0, < 3)
|
||||||
thor (>= 0.18, < 2)
|
thor (~> 1.0)
|
||||||
byebug (11.1.3)
|
byebug (11.1.3)
|
||||||
coderay (1.1.3)
|
coderay (1.1.3)
|
||||||
coercible (1.0.0)
|
coercible (1.0.0)
|
||||||
descendants_tracker (~> 0.0.1)
|
descendants_tracker (~> 0.0.1)
|
||||||
commonmarker (0.21.1)
|
commonmarker (0.22.0)
|
||||||
ruby-enum (~> 0.5)
|
concurrent-ruby (1.1.9)
|
||||||
concurrent-ruby (1.1.8)
|
connection_pool (2.2.5)
|
||||||
connection_pool (2.2.3)
|
crack (0.4.5)
|
||||||
crack (0.4.3)
|
rexml
|
||||||
safe_yaml (~> 1.0.0)
|
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
cypress-on-rails (1.8.0)
|
cypress-on-rails (1.10.1)
|
||||||
rack
|
rack
|
||||||
database_cleaner (1.8.5)
|
database_cleaner (2.0.1)
|
||||||
|
database_cleaner-active_record (~> 2.0.0)
|
||||||
|
database_cleaner-active_record (2.0.1)
|
||||||
|
activerecord (>= 5.a)
|
||||||
|
database_cleaner-core (~> 2.0.0)
|
||||||
|
database_cleaner-core (2.0.1)
|
||||||
datetime_picker_rails (0.0.7)
|
datetime_picker_rails (0.0.7)
|
||||||
momentjs-rails (>= 2.8.1)
|
momentjs-rails (>= 2.8.1)
|
||||||
|
ddtrace (0.51.1)
|
||||||
|
ffi (~> 1.0)
|
||||||
|
msgpack
|
||||||
declarative (0.0.20)
|
declarative (0.0.20)
|
||||||
declarative-option (0.1.0)
|
|
||||||
descendants_tracker (0.0.4)
|
descendants_tracker (0.0.4)
|
||||||
thread_safe (~> 0.3, >= 0.3.1)
|
thread_safe (~> 0.3, >= 0.3.1)
|
||||||
devise (4.8.0)
|
devise (4.8.0)
|
||||||
@@ -167,48 +163,47 @@ GEM
|
|||||||
devise-secure_password (2.0.1)
|
devise-secure_password (2.0.1)
|
||||||
devise (>= 4.0.0, < 5.0.0)
|
devise (>= 4.0.0, < 5.0.0)
|
||||||
railties (>= 5.0.0, < 7.0.0)
|
railties (>= 5.0.0, < 7.0.0)
|
||||||
devise_token_auth (1.1.4)
|
devise_token_auth (1.2.0)
|
||||||
bcrypt (~> 3.0)
|
bcrypt (~> 3.0)
|
||||||
devise (> 3.5.2, < 5)
|
devise (> 3.5.2, < 5)
|
||||||
rails (>= 4.2.0, < 6.1)
|
rails (>= 4.2.0, < 6.2)
|
||||||
sprockets (= 3.7.2)
|
|
||||||
diff-lcs (1.4.4)
|
diff-lcs (1.4.4)
|
||||||
digest-crc (0.6.1)
|
digest-crc (0.6.4)
|
||||||
rake (~> 13.0)
|
rake (>= 12.0.0, < 14.0.0)
|
||||||
docile (1.3.2)
|
docile (1.4.0)
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
dotenv (2.7.6)
|
dotenv (2.7.6)
|
||||||
dotenv-rails (2.7.6)
|
dotenv-rails (2.7.6)
|
||||||
dotenv (= 2.7.6)
|
dotenv (= 2.7.6)
|
||||||
railties (>= 3.2)
|
railties (>= 3.2)
|
||||||
ecma-re-validator (0.2.1)
|
dry-inflector (0.2.1)
|
||||||
regexp_parser (~> 1.2)
|
ecma-re-validator (0.3.0)
|
||||||
equalizer (0.0.11)
|
regexp_parser (~> 2.0)
|
||||||
erubi (1.10.0)
|
erubi (1.10.0)
|
||||||
et-orbi (1.2.4)
|
et-orbi (1.2.4)
|
||||||
tzinfo
|
tzinfo
|
||||||
execjs (2.7.0)
|
execjs (2.8.1)
|
||||||
facebook-messenger (2.0.1)
|
facebook-messenger (2.0.1)
|
||||||
httparty (~> 0.13, >= 0.13.7)
|
httparty (~> 0.13, >= 0.13.7)
|
||||||
rack (>= 1.4.5)
|
rack (>= 1.4.5)
|
||||||
factory_bot (6.1.0)
|
factory_bot (6.2.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
factory_bot_rails (6.1.0)
|
factory_bot_rails (6.2.0)
|
||||||
factory_bot (~> 6.1.0)
|
factory_bot (~> 6.2.0)
|
||||||
railties (>= 5.0.0)
|
railties (>= 5.0.0)
|
||||||
faker (2.13.0)
|
faker (2.18.0)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
faraday (1.0.1)
|
faraday (1.0.1)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
faraday_middleware (1.0.0)
|
faraday_middleware (1.0.0)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
fcm (1.0.2)
|
fcm (1.0.3)
|
||||||
faraday (~> 1.0.0)
|
faraday (~> 1)
|
||||||
ffi (1.15.0)
|
ffi (1.15.3)
|
||||||
flag_shih_tzu (0.3.23)
|
flag_shih_tzu (0.3.23)
|
||||||
foreman (0.87.2)
|
foreman (0.87.2)
|
||||||
fugit (1.4.1)
|
fugit (1.5.0)
|
||||||
et-orbi (~> 1.1, >= 1.1.8)
|
et-orbi (~> 1.1, >= 1.1.8)
|
||||||
raabro (~> 1.4)
|
raabro (~> 1.4)
|
||||||
gapic-common (0.3.4)
|
gapic-common (0.3.4)
|
||||||
@@ -217,18 +212,23 @@ GEM
|
|||||||
googleapis-common-protos-types (>= 1.0.4, < 2.0)
|
googleapis-common-protos-types (>= 1.0.4, < 2.0)
|
||||||
googleauth (~> 0.9)
|
googleauth (~> 0.9)
|
||||||
grpc (~> 1.25)
|
grpc (~> 1.25)
|
||||||
geocoder (1.6.3)
|
geocoder (1.6.7)
|
||||||
gli (2.19.2)
|
gli (2.20.1)
|
||||||
globalid (0.4.2)
|
globalid (0.5.1)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 5.0)
|
||||||
google-api-client (0.43.0)
|
google-apis-core (0.4.1)
|
||||||
addressable (~> 2.5, >= 2.5.1)
|
addressable (~> 2.5, >= 2.5.1)
|
||||||
googleauth (~> 0.9)
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
httpclient (>= 2.8.1, < 3.0)
|
httpclient (>= 2.8.1, < 3.a)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
representable (~> 3.0)
|
representable (~> 3.0)
|
||||||
retriable (>= 2.0, < 4.0)
|
retriable (>= 2.0, < 4.a)
|
||||||
signet (~> 0.12)
|
rexml
|
||||||
|
webrick
|
||||||
|
google-apis-iamcredentials_v1 (0.6.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
|
google-apis-storage_v1 (0.6.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
google-cloud-core (1.6.0)
|
google-cloud-core (1.6.0)
|
||||||
google-cloud-env (~> 1.0)
|
google-cloud-env (~> 1.0)
|
||||||
google-cloud-errors (~> 1.0)
|
google-cloud-errors (~> 1.0)
|
||||||
@@ -241,21 +241,23 @@ GEM
|
|||||||
google-cloud-env (1.5.0)
|
google-cloud-env (1.5.0)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
google-cloud-errors (1.1.0)
|
google-cloud-errors (1.1.0)
|
||||||
google-cloud-storage (1.28.0)
|
google-cloud-storage (1.34.1)
|
||||||
addressable (~> 2.5)
|
addressable (~> 2.5)
|
||||||
digest-crc (~> 0.4)
|
digest-crc (~> 0.4)
|
||||||
google-api-client (~> 0.33)
|
google-apis-iamcredentials_v1 (~> 0.1)
|
||||||
google-cloud-core (~> 1.2)
|
google-apis-storage_v1 (~> 0.1)
|
||||||
googleauth (~> 0.9)
|
google-cloud-core (~> 1.6)
|
||||||
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
google-protobuf (3.15.8)
|
google-protobuf (3.17.3-universal-darwin)
|
||||||
|
google-protobuf (3.17.3-x86_64-linux)
|
||||||
googleapis-common-protos (1.3.11)
|
googleapis-common-protos (1.3.11)
|
||||||
google-protobuf (~> 3.14)
|
google-protobuf (~> 3.14)
|
||||||
googleapis-common-protos-types (>= 1.0.6, < 2.0)
|
googleapis-common-protos-types (>= 1.0.6, < 2.0)
|
||||||
grpc (~> 1.27)
|
grpc (~> 1.27)
|
||||||
googleapis-common-protos-types (1.0.6)
|
googleapis-common-protos-types (1.1.0)
|
||||||
google-protobuf (~> 3.14)
|
google-protobuf (~> 3.14)
|
||||||
googleauth (0.16.2)
|
googleauth (0.17.0)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
jwt (>= 1.4, < 3.0)
|
jwt (>= 1.4, < 3.0)
|
||||||
memoist (~> 0.16)
|
memoist (~> 0.16)
|
||||||
@@ -264,11 +266,14 @@ GEM
|
|||||||
signet (~> 0.14)
|
signet (~> 0.14)
|
||||||
groupdate (5.2.2)
|
groupdate (5.2.2)
|
||||||
activesupport (>= 5)
|
activesupport (>= 5)
|
||||||
grpc (1.37.1)
|
grpc (1.38.0-universal-darwin)
|
||||||
google-protobuf (~> 3.15)
|
google-protobuf (~> 3.15)
|
||||||
googleapis-common-protos-types (~> 1.0)
|
googleapis-common-protos-types (~> 1.0)
|
||||||
haikunator (1.1.0)
|
grpc (1.38.0-x86_64-linux)
|
||||||
hairtrigger (0.2.23)
|
google-protobuf (~> 3.15)
|
||||||
|
googleapis-common-protos-types (~> 1.0)
|
||||||
|
haikunator (1.1.1)
|
||||||
|
hairtrigger (0.2.24)
|
||||||
activerecord (>= 5.0, < 7)
|
activerecord (>= 5.0, < 7)
|
||||||
ruby2ruby (~> 2.4)
|
ruby2ruby (~> 2.4)
|
||||||
ruby_parser (~> 3.10)
|
ruby_parser (~> 3.10)
|
||||||
@@ -277,7 +282,7 @@ GEM
|
|||||||
hashie (4.1.0)
|
hashie (4.1.0)
|
||||||
hkdf (0.3.0)
|
hkdf (0.3.0)
|
||||||
http-accept (1.7.0)
|
http-accept (1.7.0)
|
||||||
http-cookie (1.0.3)
|
http-cookie (1.0.4)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
httparty (0.18.1)
|
httparty (0.18.1)
|
||||||
mime-types (~> 3.0)
|
mime-types (~> 3.0)
|
||||||
@@ -286,19 +291,23 @@ GEM
|
|||||||
i18n (1.8.10)
|
i18n (1.8.10)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
ice_nine (0.11.2)
|
ice_nine (0.11.2)
|
||||||
inflecto (0.0.2)
|
image_processing (1.12.1)
|
||||||
jbuilder (2.10.0)
|
mini_magick (>= 4.9.5, < 5)
|
||||||
|
ruby-vips (>= 2.0.17, < 3)
|
||||||
|
jbuilder (2.11.2)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
jmespath (1.4.0)
|
jmespath (1.4.0)
|
||||||
jquery-rails (4.4.0)
|
jquery-rails (4.4.0)
|
||||||
rails-dom-testing (>= 1, < 3)
|
rails-dom-testing (>= 1, < 3)
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
json (2.3.1)
|
json (2.5.1)
|
||||||
json_schemer (0.2.16)
|
json_refs (0.1.6)
|
||||||
ecma-re-validator (~> 0.2)
|
hana
|
||||||
|
json_schemer (0.2.18)
|
||||||
|
ecma-re-validator (~> 0.3)
|
||||||
hana (~> 1.3)
|
hana (~> 1.3)
|
||||||
regexp_parser (~> 1.5)
|
regexp_parser (~> 2.0)
|
||||||
uri_template (~> 0.7)
|
uri_template (~> 0.7)
|
||||||
jwt (2.2.3)
|
jwt (2.2.3)
|
||||||
kaminari (1.2.1)
|
kaminari (1.2.1)
|
||||||
@@ -321,11 +330,11 @@ GEM
|
|||||||
addressable (~> 2.7)
|
addressable (~> 2.7)
|
||||||
letter_opener (1.7.0)
|
letter_opener (1.7.0)
|
||||||
launchy (~> 2.2)
|
launchy (~> 2.2)
|
||||||
liquid (4.0.3)
|
liquid (5.0.1)
|
||||||
listen (3.3.3)
|
listen (3.6.0)
|
||||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
rb-inotify (~> 0.9, >= 0.9.10)
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
loofah (2.9.1)
|
loofah (2.11.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
mail (2.7.1)
|
mail (2.7.1)
|
||||||
@@ -336,40 +345,42 @@ GEM
|
|||||||
method_source (1.0.0)
|
method_source (1.0.0)
|
||||||
mime-types (3.3.1)
|
mime-types (3.3.1)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2021.0225)
|
mime-types-data (3.2021.0704)
|
||||||
mini_magick (4.10.1)
|
mini_magick (4.11.0)
|
||||||
mini_mime (1.1.0)
|
mini_mime (1.1.0)
|
||||||
mini_portile2 (2.5.1)
|
|
||||||
minitest (5.14.4)
|
minitest (5.14.4)
|
||||||
|
mock_redis (0.28.0)
|
||||||
|
ruby2_keywords
|
||||||
momentjs-rails (2.20.1)
|
momentjs-rails (2.20.1)
|
||||||
railties (>= 3.1)
|
railties (>= 3.1)
|
||||||
msgpack (1.3.3)
|
msgpack (1.4.2)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multi_xml (0.6.0)
|
multi_xml (0.6.0)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.1.1)
|
||||||
net-http-persistent (4.0.0)
|
net-http-persistent (4.0.1)
|
||||||
connection_pool (~> 2.2)
|
connection_pool (~> 2.2)
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
nio4r (2.5.7)
|
nio4r (2.5.7)
|
||||||
nokogiri (1.11.6)
|
nokogiri (1.11.7-x86_64-darwin)
|
||||||
mini_portile2 (~> 2.5.0)
|
racc (~> 1.4)
|
||||||
|
nokogiri (1.11.7-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
oauth (0.5.6)
|
oauth (0.5.6)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
os (1.1.1)
|
os (1.1.1)
|
||||||
parallel (1.19.2)
|
parallel (1.20.1)
|
||||||
parser (2.7.1.4)
|
parser (3.0.2.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
pg (1.2.3)
|
pg (1.2.3)
|
||||||
procore-sift (0.15.0)
|
procore-sift (0.16.0)
|
||||||
rails (> 4.2.0)
|
rails (> 4.2.0)
|
||||||
pry (0.13.1)
|
pry (0.14.1)
|
||||||
coderay (~> 1.1)
|
coderay (~> 1.1)
|
||||||
method_source (~> 1.0)
|
method_source (~> 1.0)
|
||||||
pry-rails (0.3.9)
|
pry-rails (0.3.9)
|
||||||
pry (>= 0.10.4)
|
pry (>= 0.10.4)
|
||||||
public_suffix (4.0.6)
|
public_suffix (4.0.6)
|
||||||
puma (4.3.8)
|
puma (5.4.0)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.1.0)
|
pundit (2.1.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
@@ -380,49 +391,49 @@ GEM
|
|||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rack-cors (1.1.1)
|
rack-cors (1.1.1)
|
||||||
rack (>= 2.0.0)
|
rack (>= 2.0.0)
|
||||||
rack-proxy (0.6.5)
|
rack-proxy (0.7.0)
|
||||||
rack
|
rack
|
||||||
rack-test (1.1.0)
|
rack-test (1.1.0)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rack-timeout (0.6.0)
|
rack-timeout (0.6.0)
|
||||||
rails (6.0.3.7)
|
rails (6.1.4)
|
||||||
actioncable (= 6.0.3.7)
|
actioncable (= 6.1.4)
|
||||||
actionmailbox (= 6.0.3.7)
|
actionmailbox (= 6.1.4)
|
||||||
actionmailer (= 6.0.3.7)
|
actionmailer (= 6.1.4)
|
||||||
actionpack (= 6.0.3.7)
|
actionpack (= 6.1.4)
|
||||||
actiontext (= 6.0.3.7)
|
actiontext (= 6.1.4)
|
||||||
actionview (= 6.0.3.7)
|
actionview (= 6.1.4)
|
||||||
activejob (= 6.0.3.7)
|
activejob (= 6.1.4)
|
||||||
activemodel (= 6.0.3.7)
|
activemodel (= 6.1.4)
|
||||||
activerecord (= 6.0.3.7)
|
activerecord (= 6.1.4)
|
||||||
activestorage (= 6.0.3.7)
|
activestorage (= 6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
bundler (>= 1.3.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 6.0.3.7)
|
railties (= 6.1.4)
|
||||||
sprockets-rails (>= 2.0.0)
|
sprockets-rails (>= 2.0.0)
|
||||||
rails-dom-testing (2.0.3)
|
rails-dom-testing (2.0.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.3.0)
|
rails-html-sanitizer (1.3.0)
|
||||||
loofah (~> 2.3)
|
loofah (~> 2.3)
|
||||||
railties (6.0.3.7)
|
railties (6.1.4)
|
||||||
actionpack (= 6.0.3.7)
|
actionpack (= 6.1.4)
|
||||||
activesupport (= 6.0.3.7)
|
activesupport (= 6.1.4)
|
||||||
method_source
|
method_source
|
||||||
rake (>= 0.8.7)
|
rake (>= 0.13)
|
||||||
thor (>= 0.20.3, < 2.0)
|
thor (~> 1.0)
|
||||||
rainbow (3.0.0)
|
rainbow (3.0.0)
|
||||||
rake (13.0.3)
|
rake (13.0.6)
|
||||||
rb-fsevent (0.10.4)
|
rb-fsevent (0.11.0)
|
||||||
rb-inotify (0.10.1)
|
rb-inotify (0.10.1)
|
||||||
ffi (~> 1.0)
|
ffi (~> 1.0)
|
||||||
redis (4.2.1)
|
redis (4.4.0)
|
||||||
redis-namespace (1.8.0)
|
redis-namespace (1.8.1)
|
||||||
redis (>= 3.0.4)
|
redis (>= 3.0.4)
|
||||||
regexp_parser (1.7.1)
|
regexp_parser (2.1.1)
|
||||||
representable (3.0.4)
|
representable (3.1.1)
|
||||||
declarative (< 0.1.0)
|
declarative (< 0.1.0)
|
||||||
declarative-option (< 0.2.0)
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||||
uber (< 0.2.0)
|
uber (< 0.2.0)
|
||||||
responders (3.0.1)
|
responders (3.0.1)
|
||||||
actionpack (>= 5.0)
|
actionpack (>= 5.0)
|
||||||
@@ -434,57 +445,53 @@ GEM
|
|||||||
netrc (~> 0.8)
|
netrc (~> 0.8)
|
||||||
retriable (3.1.2)
|
retriable (3.1.2)
|
||||||
rexml (3.2.5)
|
rexml (3.2.5)
|
||||||
rspec-core (3.9.2)
|
rspec-core (3.10.1)
|
||||||
rspec-support (~> 3.9.3)
|
rspec-support (~> 3.10.0)
|
||||||
rspec-expectations (3.9.2)
|
rspec-expectations (3.10.1)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.9.0)
|
rspec-support (~> 3.10.0)
|
||||||
rspec-mocks (3.9.1)
|
rspec-mocks (3.10.2)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.9.0)
|
rspec-support (~> 3.10.0)
|
||||||
rspec-rails (4.0.1)
|
rspec-rails (5.0.1)
|
||||||
actionpack (>= 4.2)
|
actionpack (>= 5.2)
|
||||||
activesupport (>= 4.2)
|
activesupport (>= 5.2)
|
||||||
railties (>= 4.2)
|
railties (>= 5.2)
|
||||||
rspec-core (~> 3.9)
|
rspec-core (~> 3.10)
|
||||||
rspec-expectations (~> 3.9)
|
rspec-expectations (~> 3.10)
|
||||||
rspec-mocks (~> 3.9)
|
rspec-mocks (~> 3.10)
|
||||||
rspec-support (~> 3.9)
|
rspec-support (~> 3.10)
|
||||||
rspec-support (3.9.3)
|
rspec-support (3.10.2)
|
||||||
rubocop (0.89.1)
|
rubocop (1.18.4)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 2.7.1.1)
|
parser (>= 3.0.0.0)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.7)
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
rexml
|
rexml
|
||||||
rubocop-ast (>= 0.3.0, < 1.0)
|
rubocop-ast (>= 1.8.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 2.0)
|
unicode-display_width (>= 1.4.0, < 3.0)
|
||||||
rubocop-ast (0.3.0)
|
rubocop-ast (1.8.0)
|
||||||
parser (>= 2.7.1.4)
|
parser (>= 3.0.1.1)
|
||||||
rubocop-performance (1.7.1)
|
rubocop-performance (1.11.4)
|
||||||
rubocop (>= 0.82.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-rails (2.8.1)
|
rubocop-ast (>= 0.4.0)
|
||||||
|
rubocop-rails (2.11.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 0.87.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-rspec (1.43.2)
|
rubocop-rspec (2.4.0)
|
||||||
rubocop (~> 0.87)
|
rubocop (~> 1.0)
|
||||||
ruby-enum (0.9.0)
|
rubocop-ast (>= 1.1.0)
|
||||||
i18n
|
ruby-progressbar (1.11.0)
|
||||||
ruby-progressbar (1.10.1)
|
ruby-vips (2.1.2)
|
||||||
|
ffi (~> 1.12)
|
||||||
|
ruby2_keywords (0.0.5)
|
||||||
ruby2ruby (2.4.4)
|
ruby2ruby (2.4.4)
|
||||||
ruby_parser (~> 3.1)
|
ruby_parser (~> 3.1)
|
||||||
sexp_processor (~> 4.6)
|
sexp_processor (~> 4.6)
|
||||||
ruby_parser (3.15.0)
|
ruby_parser (3.16.0)
|
||||||
rubocop (>= 0.87.0)
|
sexp_processor (~> 4.15, >= 4.15.1)
|
||||||
sexp_processor (~> 4.9)
|
|
||||||
safe_yaml (1.0.5)
|
|
||||||
sass (3.7.4)
|
|
||||||
sass-listen (~> 4.0.0)
|
|
||||||
sass-listen (4.0.0)
|
|
||||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
|
||||||
rb-inotify (~> 0.9, >= 0.9.7)
|
|
||||||
sassc (2.4.0)
|
sassc (2.4.0)
|
||||||
ffi (~> 1.9)
|
ffi (~> 1.9)
|
||||||
sassc-rails (2.1.2)
|
sassc-rails (2.1.2)
|
||||||
@@ -493,21 +500,30 @@ GEM
|
|||||||
sprockets (> 3.0)
|
sprockets (> 3.0)
|
||||||
sprockets-rails
|
sprockets-rails
|
||||||
tilt
|
tilt
|
||||||
scout_apm (2.6.9)
|
scout_apm (4.1.1)
|
||||||
parser
|
parser
|
||||||
scss_lint (0.59.0)
|
|
||||||
sass (~> 3.5, >= 3.5.5)
|
|
||||||
seed_dump (3.3.1)
|
seed_dump (3.3.1)
|
||||||
activerecord (>= 4)
|
activerecord (>= 4)
|
||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
selectize-rails (0.12.6)
|
selectize-rails (0.12.6)
|
||||||
semantic_range (2.3.0)
|
semantic_range (3.0.0)
|
||||||
sentry-raven (3.0.3)
|
sentry-rails (4.6.4)
|
||||||
|
railties (>= 5.0)
|
||||||
|
sentry-ruby-core (~> 4.6.0)
|
||||||
|
sentry-ruby (4.6.4)
|
||||||
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
faraday (>= 1.0)
|
faraday (>= 1.0)
|
||||||
sexp_processor (4.15.1)
|
sentry-ruby-core (= 4.6.4)
|
||||||
shoulda-matchers (4.4.1)
|
sentry-ruby-core (4.6.4)
|
||||||
activesupport (>= 4.2.0)
|
concurrent-ruby
|
||||||
sidekiq (6.1.1)
|
faraday
|
||||||
|
sentry-sidekiq (4.6.4)
|
||||||
|
sentry-ruby-core (~> 4.6.0)
|
||||||
|
sidekiq (>= 3.0)
|
||||||
|
sexp_processor (4.15.3)
|
||||||
|
shoulda-matchers (5.0.0)
|
||||||
|
activesupport (>= 5.2.0)
|
||||||
|
sidekiq (6.2.1)
|
||||||
connection_pool (>= 2.2.2)
|
connection_pool (>= 2.2.2)
|
||||||
rack (~> 2.0)
|
rack (~> 2.0)
|
||||||
redis (>= 4.2.0)
|
redis (>= 4.2.0)
|
||||||
@@ -524,7 +540,7 @@ GEM
|
|||||||
json (>= 1.8, < 3)
|
json (>= 1.8, < 3)
|
||||||
simplecov-html (~> 0.10.0)
|
simplecov-html (~> 0.10.0)
|
||||||
simplecov-html (0.10.2)
|
simplecov-html (0.10.2)
|
||||||
slack-ruby-client (0.15.0)
|
slack-ruby-client (0.17.0)
|
||||||
faraday (>= 1.0)
|
faraday (>= 1.0)
|
||||||
faraday_middleware
|
faraday_middleware
|
||||||
gli
|
gli
|
||||||
@@ -534,7 +550,7 @@ GEM
|
|||||||
spring-watcher-listen (2.0.1)
|
spring-watcher-listen (2.0.1)
|
||||||
listen (>= 2.7, < 4.0)
|
listen (>= 2.7, < 4.0)
|
||||||
spring (>= 1.2, < 3.0)
|
spring (>= 1.2, < 3.0)
|
||||||
sprockets (3.7.2)
|
sprockets (4.0.2)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
rack (> 1, < 3)
|
rack (> 1, < 3)
|
||||||
sprockets-rails (3.2.2)
|
sprockets-rails (3.2.2)
|
||||||
@@ -542,27 +558,28 @@ GEM
|
|||||||
activesupport (>= 4.0)
|
activesupport (>= 4.0)
|
||||||
sprockets (>= 3.0.0)
|
sprockets (>= 3.0.0)
|
||||||
squasher (0.6.2)
|
squasher (0.6.2)
|
||||||
statsd-ruby (1.4.0)
|
statsd-ruby (1.5.0)
|
||||||
telegram-bot-ruby (0.12.0)
|
telegram-bot-ruby (0.16.0)
|
||||||
|
dry-inflector
|
||||||
faraday
|
faraday
|
||||||
inflecto
|
virtus (~> 2.0)
|
||||||
virtus
|
telephone_number (1.4.12)
|
||||||
telephone_number (1.4.9)
|
|
||||||
thor (1.1.0)
|
thor (1.1.0)
|
||||||
thread_safe (0.3.6)
|
thread_safe (0.3.6)
|
||||||
tilt (2.0.10)
|
tilt (2.0.10)
|
||||||
time_diff (0.3.0)
|
time_diff (0.3.0)
|
||||||
activesupport
|
activesupport
|
||||||
i18n
|
i18n
|
||||||
|
trailblazer-option (0.1.1)
|
||||||
twilio-ruby (5.32.0)
|
twilio-ruby (5.32.0)
|
||||||
faraday (~> 1.0.0)
|
faraday (~> 1.0.0)
|
||||||
jwt (>= 1.5, <= 2.5)
|
jwt (>= 1.5, <= 2.5)
|
||||||
nokogiri (>= 1.6, < 2.0)
|
nokogiri (>= 1.6, < 2.0)
|
||||||
twitty (0.1.1)
|
twitty (0.1.4)
|
||||||
oauth
|
oauth
|
||||||
tzinfo (1.2.9)
|
tzinfo (2.0.4)
|
||||||
thread_safe (~> 0.1)
|
concurrent-ruby (~> 1.0)
|
||||||
tzinfo-data (1.2020.1)
|
tzinfo-data (1.2021.1)
|
||||||
tzinfo (>= 1.0.0)
|
tzinfo (>= 1.0.0)
|
||||||
uber (0.1.0)
|
uber (0.1.0)
|
||||||
uglifier (4.2.0)
|
uglifier (4.2.0)
|
||||||
@@ -570,46 +587,48 @@ GEM
|
|||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.7.7)
|
unf_ext (0.0.7.7)
|
||||||
unicode-display_width (1.7.0)
|
unicode-display_width (2.0.0)
|
||||||
uniform_notifier (1.13.0)
|
uniform_notifier (1.14.2)
|
||||||
uri_template (0.7.0)
|
uri_template (0.7.0)
|
||||||
valid_email2 (3.3.1)
|
valid_email2 (4.0.0)
|
||||||
activemodel (>= 3.2)
|
activemodel (>= 3.2)
|
||||||
mail (~> 2.5)
|
mail (~> 2.5)
|
||||||
virtus (1.0.5)
|
virtus (2.0.0)
|
||||||
axiom-types (~> 0.1)
|
axiom-types (~> 0.1)
|
||||||
coercible (~> 1.0)
|
coercible (~> 1.0)
|
||||||
descendants_tracker (~> 0.0, >= 0.0.3)
|
descendants_tracker (~> 0.0, >= 0.0.3)
|
||||||
equalizer (~> 0.0, >= 0.0.9)
|
|
||||||
warden (1.2.9)
|
warden (1.2.9)
|
||||||
rack (>= 2.0.9)
|
rack (>= 2.0.9)
|
||||||
web-console (4.0.4)
|
web-console (4.1.0)
|
||||||
actionview (>= 6.0.0)
|
actionview (>= 6.0.0)
|
||||||
activemodel (>= 6.0.0)
|
activemodel (>= 6.0.0)
|
||||||
bindex (>= 0.4.0)
|
bindex (>= 0.4.0)
|
||||||
railties (>= 6.0.0)
|
railties (>= 6.0.0)
|
||||||
webmock (3.8.3)
|
webmock (3.13.0)
|
||||||
addressable (>= 2.3.6)
|
addressable (>= 2.3.6)
|
||||||
crack (>= 0.3.2)
|
crack (>= 0.3.2)
|
||||||
hashdiff (>= 0.4.0, < 2.0.0)
|
hashdiff (>= 0.4.0, < 2.0.0)
|
||||||
webpacker (5.2.1)
|
webpacker (5.4.0)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
rack-proxy (>= 0.6.1)
|
rack-proxy (>= 0.6.1)
|
||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
semantic_range (>= 2.3.0)
|
semantic_range (>= 2.3.0)
|
||||||
webpush (1.0.0)
|
webpush (1.1.0)
|
||||||
hkdf (~> 0.2)
|
hkdf (~> 0.2)
|
||||||
jwt (~> 2.0)
|
jwt (~> 2.0)
|
||||||
websocket-driver (0.7.3)
|
webrick (1.7.0)
|
||||||
|
websocket-driver (0.7.5)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.5)
|
websocket-extensions (0.1.5)
|
||||||
wisper (2.0.0)
|
wisper (2.0.0)
|
||||||
zeitwerk (2.4.2)
|
zeitwerk (2.4.2)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
x86_64-darwin-21
|
||||||
|
x86_64-linux
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
active_record_query_trace
|
||||||
activerecord-import
|
activerecord-import
|
||||||
acts-as-taggable-on
|
acts-as-taggable-on
|
||||||
administrate
|
administrate
|
||||||
@@ -627,6 +646,7 @@ DEPENDENCIES
|
|||||||
commonmarker
|
commonmarker
|
||||||
cypress-on-rails (~> 1.0)
|
cypress-on-rails (~> 1.0)
|
||||||
database_cleaner
|
database_cleaner
|
||||||
|
ddtrace
|
||||||
devise
|
devise
|
||||||
devise-secure_password (~> 2.0)
|
devise-secure_password (~> 2.0)
|
||||||
devise_token_auth
|
devise_token_auth
|
||||||
@@ -644,8 +664,9 @@ DEPENDENCIES
|
|||||||
haikunator
|
haikunator
|
||||||
hairtrigger
|
hairtrigger
|
||||||
hashie
|
hashie
|
||||||
|
image_processing
|
||||||
jbuilder
|
jbuilder
|
||||||
json_refs!
|
json_refs
|
||||||
json_schemer
|
json_schemer
|
||||||
jwt
|
jwt
|
||||||
kaminari
|
kaminari
|
||||||
@@ -654,8 +675,7 @@ DEPENDENCIES
|
|||||||
liquid
|
liquid
|
||||||
listen
|
listen
|
||||||
maxminddb
|
maxminddb
|
||||||
mini_magick
|
mock_redis
|
||||||
mock_redis!
|
|
||||||
pg
|
pg
|
||||||
procore-sift
|
procore-sift
|
||||||
pry-rails
|
pry-rails
|
||||||
@@ -669,15 +689,16 @@ DEPENDENCIES
|
|||||||
redis-namespace
|
redis-namespace
|
||||||
responders
|
responders
|
||||||
rest-client
|
rest-client
|
||||||
rspec-rails (~> 4.0.0.beta2)
|
rspec-rails (~> 5.0.0)
|
||||||
rubocop
|
rubocop
|
||||||
rubocop-performance
|
rubocop-performance
|
||||||
rubocop-rails
|
rubocop-rails
|
||||||
rubocop-rspec
|
rubocop-rspec
|
||||||
scout_apm
|
scout_apm
|
||||||
scss_lint
|
|
||||||
seed_dump
|
seed_dump
|
||||||
sentry-raven
|
sentry-rails
|
||||||
|
sentry-ruby
|
||||||
|
sentry-sidekiq
|
||||||
shoulda-matchers
|
shoulda-matchers
|
||||||
sidekiq
|
sidekiq
|
||||||
sidekiq-cron
|
sidekiq-cron
|
||||||
@@ -701,7 +722,7 @@ DEPENDENCIES
|
|||||||
wisper (= 2.0.0)
|
wisper (= 2.0.0)
|
||||||
|
|
||||||
RUBY VERSION
|
RUBY VERSION
|
||||||
ruby 2.7.3p183
|
ruby 3.0.2p107
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.1.4
|
2.2.25
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class Messages::Facebook::MessageBuilder
|
|||||||
rescue Koala::Facebook::AuthenticationError
|
rescue Koala::Facebook::AuthenticationError
|
||||||
Rails.logger.info "Facebook Authorization expired for Inbox #{@inbox.id}"
|
Rails.logger.info "Facebook Authorization expired for Inbox #{@inbox.id}"
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ class Messages::Facebook::MessageBuilder
|
|||||||
raise
|
raise
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
result = {}
|
result = {}
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
end
|
end
|
||||||
{
|
{
|
||||||
name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}",
|
name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}",
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class Api::V1::Accounts::BaseController < Api::BaseController
|
|||||||
account = Account.find(params[:account_id])
|
account = Account.find(params[:account_id])
|
||||||
if current_user
|
if current_user
|
||||||
account_accessible_for_user?(account)
|
account_accessible_for_user?(account)
|
||||||
elsif @resource&.is_a?(AgentBot)
|
elsif @resource.is_a?(AgentBot)
|
||||||
account_accessible_for_bot?(account)
|
account_accessible_for_bot?(account)
|
||||||
end
|
end
|
||||||
account
|
account
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class Api::V1::Accounts::CallbacksController < Api::V1::Accounts::BaseController
|
|||||||
return [] if data.empty?
|
return [] if data.empty?
|
||||||
|
|
||||||
data.inject([]) do |result, page_detail|
|
data.inject([]) do |result, page_detail|
|
||||||
page_detail[:exists] = Current.account.facebook_pages.exists?(page_id: page_detail['id']) ? true : false
|
page_detail[:exists] = Current.account.facebook_pages.exists?(page_id: page_detail['id'])
|
||||||
result << page_detail
|
result << page_detail
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -99,7 +99,7 @@ class Api::V1::Accounts::CallbacksController < Api::V1::Accounts::BaseController
|
|||||||
end
|
end
|
||||||
pic_url = response.base_uri.to_s
|
pic_url = response.base_uri.to_s
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Rails.logger.debug "Rescued: #{e.inspect}"
|
Rails.logger.debug { "Rescued: #{e.inspect}" }
|
||||||
pic_url = nil
|
pic_url = nil
|
||||||
end
|
end
|
||||||
pic_url
|
pic_url
|
||||||
|
|||||||
@@ -6,9 +6,8 @@ class Api::V1::Accounts::Channels::TwilioChannelsController < Api::V1::Accounts:
|
|||||||
authenticate_twilio
|
authenticate_twilio
|
||||||
build_inbox
|
build_inbox
|
||||||
setup_webhooks if @twilio_channel.sms?
|
setup_webhooks if @twilio_channel.sms?
|
||||||
rescue Twilio::REST::TwilioError => e
|
|
||||||
render_could_not_create_error(e.message)
|
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
|
Sentry.capture_exception(e)
|
||||||
render_could_not_create_error(e.message)
|
render_could_not_create_error(e.message)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class Api::V1::Accounts::InboxMembersController < Api::V1::Accounts::BaseControl
|
|||||||
update_agents_list
|
update_agents_list
|
||||||
head :ok
|
head :ok
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Rails.logger.debug "Rescued: #{e.inspect}"
|
Rails.logger.debug { "Rescued: #{e.inspect}" }
|
||||||
render_could_not_create_error('Could not add agents to inbox')
|
render_could_not_create_error('Could not add agents to inbox')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class Api::V1::WebhooksController < ApplicationController
|
|||||||
twitter_consumer.consume
|
twitter_consumer.consume
|
||||||
head :ok
|
head :ok
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
head :ok
|
head :ok
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class ApplicationController < ActionController::Base
|
|||||||
def handle_with_exception
|
def handle_with_exception
|
||||||
yield
|
yield
|
||||||
rescue ActiveRecord::RecordNotFound => e
|
rescue ActiveRecord::RecordNotFound => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
render_not_found_error('Resource could not be found')
|
render_not_found_error('Resource could not be found')
|
||||||
rescue Pundit::NotAuthorizedError
|
rescue Pundit::NotAuthorizedError
|
||||||
render_unauthorized('You are not authorized to do this action')
|
render_unauthorized('You are not authorized to do this action')
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
module AuthHelper
|
module AuthHelper
|
||||||
def send_auth_headers(user)
|
def send_auth_headers(user)
|
||||||
data = user.create_new_auth_token
|
data = user.create_new_auth_token
|
||||||
response.headers[DeviseTokenAuth.headers_names[:"access-token"]] = data['access-token']
|
response.headers[DeviseTokenAuth.headers_names[:'access-token']] = data['access-token']
|
||||||
response.headers[DeviseTokenAuth.headers_names[:"token-type"]] = 'Bearer'
|
response.headers[DeviseTokenAuth.headers_names[:'token-type']] = 'Bearer'
|
||||||
response.headers[DeviseTokenAuth.headers_names[:client]] = data['client']
|
response.headers[DeviseTokenAuth.headers_names[:client]] = data['client']
|
||||||
response.headers[DeviseTokenAuth.headers_names[:expiry]] = data['expiry']
|
response.headers[DeviseTokenAuth.headers_names[:expiry]] = data['expiry']
|
||||||
response.headers[DeviseTokenAuth.headers_names[:uid]] = data['uid']
|
response.headers[DeviseTokenAuth.headers_names[:uid]] = data['uid']
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class Public::Api::V1::Inboxes::MessagesController < Public::Api::V1::InboxesCon
|
|||||||
def update
|
def update
|
||||||
@message.update!(message_update_params)
|
@message.update!(message_update_params)
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
render json: { error: @contact.errors, message: e.message }.to_json, status: 500
|
render json: { error: @contact.errors, message: e.message }.to_json, status: :internal_server_error
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ class SwaggerController < ApplicationController
|
|||||||
if Rails.env.development? || Rails.env.test?
|
if Rails.env.development? || Rails.env.test?
|
||||||
render inline: File.read(Rails.root.join('swagger', derived_path))
|
render inline: File.read(Rails.root.join('swagger', derived_path))
|
||||||
else
|
else
|
||||||
head 404
|
head :not_found
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class ContactIpLookupJob < ApplicationJob
|
|||||||
|
|
||||||
def setup_vendor_db
|
def setup_vendor_db
|
||||||
base_url = 'https://download.maxmind.com/app/geoip_download'
|
base_url = 'https://download.maxmind.com/app/geoip_download'
|
||||||
source = URI.open("#{base_url}?edition_id=GeoLite2-City&suffix=tar.gz&license_key=#{ENV['IP_LOOKUP_API_KEY']}")
|
source = URI.parse("#{base_url}?edition_id=GeoLite2-City&suffix=tar.gz&license_key=#{ENV['IP_LOOKUP_API_KEY']}").open
|
||||||
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(source))
|
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(source))
|
||||||
tar_extract.rewind
|
tar_extract.rewind
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class HookJob < ApplicationJob
|
|||||||
process_dialogflow_integration(hook, event_name, event_data)
|
process_dialogflow_integration(hook, event_name, event_data)
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
class ApplicationMailbox < ActionMailbox::Base
|
class ApplicationMailbox < ActionMailbox::Base
|
||||||
# Last part is the regex for the UUID
|
# Last part is the regex for the UUID
|
||||||
# Eg: email should be something like : reply+6bdc3f4d-0bec-4515-a284-5d916fdde489@domain.com
|
# Eg: email should be something like : reply+6bdc3f4d-0bec-4515-a284-5d916fdde489@domain.com
|
||||||
REPLY_EMAIL_USERNAME_PATTERN = /^reply\+([0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12})$/i.freeze
|
REPLY_EMAIL_USERNAME_PATTERN = /^reply\+([0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12})$/i
|
||||||
|
|
||||||
def self.reply_mail?
|
def self.reply_mail?
|
||||||
proc do |inbound_mail_obj|
|
proc do |inbound_mail_obj|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ class ReplyMailbox < ApplicationMailbox
|
|||||||
|
|
||||||
# Last part is the regex for the UUID
|
# Last part is the regex for the UUID
|
||||||
# Eg: email should be something like : reply+6bdc3f4d-0bec-4515-a284-5d916fdde489@domain.com
|
# Eg: email should be something like : reply+6bdc3f4d-0bec-4515-a284-5d916fdde489@domain.com
|
||||||
EMAIL_PART_PATTERN = /^reply\+([0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12})$/i.freeze
|
EMAIL_PART_PATTERN = /^reply\+([0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12})$/i
|
||||||
|
|
||||||
before_processing :conversation_uuid_from_to_address,
|
before_processing :conversation_uuid_from_to_address,
|
||||||
:verify_decoded_params,
|
:verify_decoded_params,
|
||||||
|
|||||||
@@ -47,14 +47,14 @@ class Channel::FacebookPage < ApplicationRecord
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
rescue => e
|
rescue => e
|
||||||
Rails.logger.debug "Rescued: #{e.inspect}"
|
Rails.logger.debug { "Rescued: #{e.inspect}" }
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def unsubscribe
|
def unsubscribe
|
||||||
Facebook::Messenger::Subscriptions.unsubscribe(access_token: page_access_token)
|
Facebook::Messenger::Subscriptions.unsubscribe(access_token: page_access_token)
|
||||||
rescue => e
|
rescue => e
|
||||||
Rails.logger.debug "Rescued: #{e.inspect}"
|
Rails.logger.debug { "Rescued: #{e.inspect}" }
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class ContentAttributeValidator < ActiveModel::Validator
|
|||||||
end
|
end
|
||||||
|
|
||||||
def validate_item_attributes!(record, valid_keys)
|
def validate_item_attributes!(record, valid_keys)
|
||||||
item_keys = record.items.collect(&:keys).flatten.map(&:to_sym).compact
|
item_keys = record.items.collect(&:keys).flatten.filter_map(&:to_sym)
|
||||||
invalid_keys = item_keys - valid_keys
|
invalid_keys = item_keys - valid_keys
|
||||||
record.errors.add(:content_attributes, "contains invalid keys for items : #{invalid_keys}") if invalid_keys.present?
|
record.errors.add(:content_attributes, "contains invalid keys for items : #{invalid_keys}") if invalid_keys.present?
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ class Integrations::App
|
|||||||
case params[:id]
|
case params[:id]
|
||||||
when 'slack'
|
when 'slack'
|
||||||
ENV['SLACK_CLIENT_SECRET'].present?
|
ENV['SLACK_CLIENT_SECRET'].present?
|
||||||
when 'dialogflow', 'fullcontact'
|
|
||||||
true
|
|
||||||
else
|
else
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ class Message < ApplicationRecord
|
|||||||
|
|
||||||
def merge_sender_attributes(data)
|
def merge_sender_attributes(data)
|
||||||
data.merge!(sender: sender.push_event_data) if sender && !sender.is_a?(AgentBot)
|
data.merge!(sender: sender.push_event_data) if sender && !sender.is_a?(AgentBot)
|
||||||
data.merge!(sender: sender.push_event_data(inbox)) if sender&.is_a?(AgentBot)
|
data.merge!(sender: sender.push_event_data(inbox)) if sender.is_a?(AgentBot)
|
||||||
data
|
data
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -142,7 +142,7 @@ class Message < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def update_contact_activity
|
def update_contact_activity
|
||||||
sender.update(last_activity_at: DateTime.now) if sender&.is_a?(Contact)
|
sender.update(last_activity_at: DateTime.now) if sender.is_a?(Contact)
|
||||||
end
|
end
|
||||||
|
|
||||||
def dispatch_create_events
|
def dispatch_create_events
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class MailPresenter < SimpleDelegator
|
|||||||
def attachments
|
def attachments
|
||||||
# ref : https://github.com/gorails-screencasts/action-mailbox-action-text/blob/master/app/mailboxes/posts_mailbox.rb
|
# ref : https://github.com/gorails-screencasts/action-mailbox-action-text/blob/master/app/mailboxes/posts_mailbox.rb
|
||||||
mail.attachments.map do |attachment|
|
mail.attachments.map do |attachment|
|
||||||
blob = ActiveStorage::Blob.create_after_upload!(
|
blob = ActiveStorage::Blob.create_and_upload!(
|
||||||
io: StringIO.new(attachment.body.to_s),
|
io: StringIO.new(attachment.body.to_s),
|
||||||
filename: attachment.filename,
|
filename: attachment.filename,
|
||||||
content_type: attachment.content_type
|
content_type: attachment.content_type
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ class Contacts::ContactableInboxesService
|
|||||||
|
|
||||||
def get
|
def get
|
||||||
account = contact.account
|
account = contact.account
|
||||||
account.inboxes.map { |inbox| get_contactable_inbox(inbox) }.compact
|
account.inboxes.filter_map { |inbox| get_contactable_inbox(inbox) }
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class MessageTemplates::Template::EmailCollect
|
|||||||
conversation.messages.create!(email_input_box_template_message_params)
|
conversation.messages.create!(email_input_box_template_message_params)
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ class MessageTemplates::Template::Greeting
|
|||||||
conversation.messages.create!(greeting_message_params)
|
conversation.messages.create!(greeting_message_params)
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ class MessageTemplates::Template::OutOfOffice
|
|||||||
conversation.messages.create!(out_of_office_message_params)
|
conversation.messages.create!(out_of_office_message_params)
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -16,4 +16,4 @@
|
|||||||
<% row = [ agent.name, agent_report[:conversations_count], (agent_report[:avg_first_response_time]/60).to_i, (agent_report[:avg_resolution_time]/60).to_i ] %>
|
<% row = [ agent.name, agent_report[:conversations_count], (agent_report[:avg_first_response_time]/60).to_i, (agent_report[:avg_resolution_time]/60).to_i ] %>
|
||||||
<%= CSV.generate_line row %>
|
<%= CSV.generate_line row %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= CSV.generate_line [I18n.t('reports.period', { since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s') })] %>
|
<%= CSV.generate_line [I18n.t('reports.period', since: Date.strptime(params[:since], '%s'), until: Date.strptime(params[:until], '%s'))] %>
|
||||||
|
|||||||
@@ -15,11 +15,6 @@ module Chatwoot
|
|||||||
|
|
||||||
config.autoload_paths << Rails.root.join('lib')
|
config.autoload_paths << Rails.root.join('lib')
|
||||||
config.eager_load_paths << Rails.root.join('lib')
|
config.eager_load_paths << Rails.root.join('lib')
|
||||||
Rails.autoloaders.main.ignore(Rails.root.join('lib/azure'))
|
|
||||||
|
|
||||||
# This is required in production for zeitwerk to autoload the file
|
|
||||||
config.paths.add File.join('app', 'bot'), glob: File.join('**', '*.rb')
|
|
||||||
config.autoload_paths << Rails.root.join('app/bot/*')
|
|
||||||
|
|
||||||
# Settings in config/environments/* take precedence over those specified here.
|
# Settings in config/environments/* take precedence over those specified here.
|
||||||
# Application configuration can go into files in config/initializers
|
# Application configuration can go into files in config/initializers
|
||||||
|
|||||||
1
config/initializers/active_record_query_trace.rb
Normal file
1
config/initializers/active_record_query_trace.rb
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ActiveRecordQueryTrace.enabled = true if Rails.env.development?
|
||||||
@@ -16,4 +16,5 @@ Rails.application.config.assets.precompile += %w[dashboardChart.js]
|
|||||||
|
|
||||||
# to take care of fonts in assets pre-compiling
|
# to take care of fonts in assets pre-compiling
|
||||||
# Ref: https://stackoverflow.com/questions/56960709/rails-font-cors-policy
|
# Ref: https://stackoverflow.com/questions/56960709/rails-font-cors-policy
|
||||||
Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf|woff2)$/
|
# https://github.com/rails/sprockets/issues/632#issuecomment-551324428
|
||||||
|
Rails.application.config.assets.precompile << ['*.svg', '*.eot', '*.woff', '*.ttf']
|
||||||
|
|||||||
@@ -1,170 +0,0 @@
|
|||||||
# TODO: Remove this once the changes comes into rails version
|
|
||||||
# https://github.com/Azure/azure-storage-ruby/issues/166#issuecomment-637696565
|
|
||||||
# Remove this once the changes comes into rails version
|
|
||||||
|
|
||||||
# code from current master : https://github.com/rails/rails/blob/8520cc77133d9ff642e2c393b4ee5eae2a2a28b6/activestorage/lib/active_storage/service/azure_storage_service.rb
|
|
||||||
|
|
||||||
require 'azure/storage/blob'
|
|
||||||
require 'active_storage/service/azure_storage_service'
|
|
||||||
module ActiveStorage
|
|
||||||
# Wraps the Microsoft Azure Storage Blob Service as an Active Storage service.
|
|
||||||
# See ActiveStorage::Service for the generic API documentation that applies to all services.
|
|
||||||
class Service::AzureStorageService < Service
|
|
||||||
attr_reader :client, :container, :signer
|
|
||||||
|
|
||||||
def initialize(storage_account_name:, storage_access_key:, container:, public: false, **options)
|
|
||||||
@client = Azure::Storage::Blob::BlobService.create(storage_account_name: storage_account_name, storage_access_key: storage_access_key, **options)
|
|
||||||
@signer = Azure::Storage::Common::Core::Auth::SharedAccessSignature.new(storage_account_name, storage_access_key)
|
|
||||||
@container = container
|
|
||||||
@public = public
|
|
||||||
end
|
|
||||||
|
|
||||||
def upload(key, io, checksum: nil, filename: nil, content_type: nil, disposition: nil, **)
|
|
||||||
instrument :upload, key: key, checksum: checksum do
|
|
||||||
handle_errors do
|
|
||||||
content_disposition = content_disposition_with(filename: filename, type: disposition) if disposition && filename
|
|
||||||
|
|
||||||
client.create_block_blob(container, key, IO.try_convert(io) || io, content_md5: checksum, content_type: content_type, content_disposition: content_disposition)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def download(key, &block)
|
|
||||||
if block_given?
|
|
||||||
instrument :streaming_download, key: key do
|
|
||||||
stream(key, &block)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
instrument :download, key: key do
|
|
||||||
handle_errors do
|
|
||||||
_, io = client.get_blob(container, key)
|
|
||||||
io.force_encoding(Encoding::BINARY)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def download_chunk(key, range)
|
|
||||||
instrument :download_chunk, key: key, range: range do
|
|
||||||
handle_errors do
|
|
||||||
_, io = client.get_blob(container, key, start_range: range.begin, end_range: range.exclude_end? ? range.end - 1 : range.end)
|
|
||||||
io.force_encoding(Encoding::BINARY)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete(key)
|
|
||||||
instrument :delete, key: key do
|
|
||||||
client.delete_blob(container, key)
|
|
||||||
rescue Azure::Core::Http::HTTPError => e
|
|
||||||
raise unless e.type == "BlobNotFound"
|
|
||||||
# Ignore files already deleted
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_prefixed(prefix)
|
|
||||||
instrument :delete_prefixed, prefix: prefix do
|
|
||||||
marker = nil
|
|
||||||
|
|
||||||
loop do
|
|
||||||
results = client.list_blobs(container, prefix: prefix, marker: marker)
|
|
||||||
|
|
||||||
results.each do |blob|
|
|
||||||
client.delete_blob(container, blob.name)
|
|
||||||
end
|
|
||||||
|
|
||||||
break unless marker = results.continuation_token.presence
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def exist?(key)
|
|
||||||
instrument :exist, key: key do |payload|
|
|
||||||
answer = blob_for(key).present?
|
|
||||||
payload[:exist] = answer
|
|
||||||
answer
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:)
|
|
||||||
instrument :url, key: key do |payload|
|
|
||||||
generated_url = signer.signed_uri(
|
|
||||||
uri_for(key), false,
|
|
||||||
service: "b",
|
|
||||||
permissions: "rw",
|
|
||||||
expiry: format_expiry(expires_in)
|
|
||||||
).to_s
|
|
||||||
|
|
||||||
payload[:url] = generated_url
|
|
||||||
|
|
||||||
generated_url
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def headers_for_direct_upload(key, content_type:, checksum:, filename: nil, disposition: nil, **)
|
|
||||||
content_disposition = content_disposition_with(type: disposition, filename: filename) if filename
|
|
||||||
|
|
||||||
{ "Content-Type" => content_type, "Content-MD5" => checksum, "x-ms-blob-content-disposition" => content_disposition, "x-ms-blob-type" => "BlockBlob" }
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def private_url(key, expires_in:, filename:, disposition:, content_type:, **)
|
|
||||||
signer.signed_uri(
|
|
||||||
uri_for(key), false,
|
|
||||||
service: "b",
|
|
||||||
permissions: "r",
|
|
||||||
expiry: format_expiry(expires_in),
|
|
||||||
content_disposition: content_disposition_with(type: disposition, filename: filename),
|
|
||||||
content_type: content_type
|
|
||||||
).to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
def public_url(key, **)
|
|
||||||
uri_for(key).to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def uri_for(key)
|
|
||||||
client.generate_uri("#{container}/#{key}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def blob_for(key)
|
|
||||||
client.get_blob_properties(container, key)
|
|
||||||
rescue Azure::Core::Http::HTTPError
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def format_expiry(expires_in)
|
|
||||||
expires_in ? Time.now.utc.advance(seconds: expires_in).iso8601 : nil
|
|
||||||
end
|
|
||||||
|
|
||||||
# Reads the object for the given key in chunks, yielding each to the block.
|
|
||||||
def stream(key)
|
|
||||||
blob = blob_for(key)
|
|
||||||
|
|
||||||
chunk_size = 5.megabytes
|
|
||||||
offset = 0
|
|
||||||
|
|
||||||
raise ActiveStorage::FileNotFoundError unless blob.present?
|
|
||||||
|
|
||||||
while offset < blob.properties[:content_length]
|
|
||||||
_, chunk = client.get_blob(container, key, start_range: offset, end_range: offset + chunk_size - 1)
|
|
||||||
yield chunk.force_encoding(Encoding::BINARY)
|
|
||||||
offset += chunk_size
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_errors
|
|
||||||
yield
|
|
||||||
rescue Azure::Core::Http::HTTPError => e
|
|
||||||
case e.type
|
|
||||||
when "BlobNotFound"
|
|
||||||
raise ActiveStorage::FileNotFoundError
|
|
||||||
when "Md5Mismatch"
|
|
||||||
raise ActiveStorage::IntegrityError
|
|
||||||
else
|
|
||||||
raise
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# Remember that Rails only eager loads everything in its production environment.
|
|
||||||
# In the development and test environments, it only requires files as you reference constants.
|
|
||||||
# You'll need to explicitly load app/bot
|
|
||||||
|
|
||||||
unless Rails.env.production?
|
|
||||||
bot_files = Dir[Rails.root.join('app', 'bot', '**', '*.rb')]
|
|
||||||
bot_reloader = ActiveSupport::FileUpdateChecker.new(bot_files) do
|
|
||||||
bot_files.each { |file| require_dependency file }
|
|
||||||
end
|
|
||||||
|
|
||||||
ActiveSupport::Reloader.to_prepare do
|
|
||||||
bot_reloader.execute_if_updated
|
|
||||||
end
|
|
||||||
|
|
||||||
bot_files.each { |file| require_dependency file }
|
|
||||||
end
|
|
||||||
|
|
||||||
# ref: https://github.com/jgorset/facebook-messenger#make-a-configuration-provider
|
|
||||||
class ChatwootFbProvider < Facebook::Messenger::Configuration::Providers::Base
|
|
||||||
def valid_verify_token?(_verify_token)
|
|
||||||
ENV['FB_VERIFY_TOKEN']
|
|
||||||
end
|
|
||||||
|
|
||||||
def app_secret_for(_page_id)
|
|
||||||
ENV['FB_APP_SECRET']
|
|
||||||
end
|
|
||||||
|
|
||||||
def access_token_for(page_id)
|
|
||||||
Channel::FacebookPage.where(page_id: page_id).last.page_access_token
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def bot
|
|
||||||
Chatwoot::Bot
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Facebook::Messenger.configure do |config|
|
|
||||||
config.provider = ChatwootFbProvider.new
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,29 @@
|
|||||||
require 'facebook/messenger'
|
# ref: https://github.com/jgorset/facebook-messenger#make-a-configuration-provider
|
||||||
|
class ChatwootFbProvider < Facebook::Messenger::Configuration::Providers::Base
|
||||||
|
def valid_verify_token?(_verify_token)
|
||||||
|
ENV['FB_VERIFY_TOKEN']
|
||||||
|
end
|
||||||
|
|
||||||
|
def app_secret_for(_page_id)
|
||||||
|
ENV['FB_APP_SECRET']
|
||||||
|
end
|
||||||
|
|
||||||
|
def access_token_for(page_id)
|
||||||
|
Channel::FacebookPage.where(page_id: page_id).last.page_access_token
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def bot
|
||||||
|
Chatwoot::Bot
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Rails.application.reloader.to_prepare do
|
||||||
|
Facebook::Messenger.configure do |config|
|
||||||
|
config.provider = ChatwootFbProvider.new
|
||||||
|
end
|
||||||
|
|
||||||
class FacebookBot
|
|
||||||
Facebook::Messenger::Bot.on :message do |message|
|
Facebook::Messenger::Bot.on :message do |message|
|
||||||
Rails.logger.info "MESSAGE_RECIEVED #{message}"
|
Rails.logger.info "MESSAGE_RECIEVED #{message}"
|
||||||
response = ::Integrations::Facebook::MessageParser.new(message)
|
response = ::Integrations::Facebook::MessageParser.new(message)
|
||||||
@@ -1,28 +1,4 @@
|
|||||||
Raven.configure do |config|
|
Sentry.init do |config|
|
||||||
config.dsn = ENV['SENTRY_DSN']
|
config.dsn = ENV['SENTRY_DSN']
|
||||||
config.environments = %w[staging production]
|
config.enabled_environments = %w[staging production]
|
||||||
end
|
end
|
||||||
|
|
||||||
module QueryTrace
|
|
||||||
def self.enable!
|
|
||||||
::ActiveRecord::LogSubscriber.send(:include, self)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.append_features(klass)
|
|
||||||
super
|
|
||||||
klass.class_eval do
|
|
||||||
unless method_defined?(:log_info_without_trace)
|
|
||||||
alias_method :log_info_without_trace, :sql
|
|
||||||
alias_method :sql, :log_info_with_trace
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def log_info_with_trace(event)
|
|
||||||
log_info_without_trace(event)
|
|
||||||
trace_log = Rails.backtrace_cleaner.clean(caller).first
|
|
||||||
logger.debug(" \\_ \e[33mCalled from:\e[0m #{trace_log}") if trace_log && event.payload[:name] != 'SCHEMA'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
QueryTrace.enable! unless Rails.env.production?
|
|
||||||
|
|||||||
@@ -15,9 +15,7 @@ class AddSenderToMessages < ActiveRecord::Migration[6.0]
|
|||||||
# rubocop:disable Rails/SkipsModelValidations
|
# rubocop:disable Rails/SkipsModelValidations
|
||||||
message.update_columns(sender_id: message.user.id, sender_type: 'User') if message.user.present?
|
message.update_columns(sender_id: message.user.id, sender_type: 'User') if message.user.present?
|
||||||
message.update_columns(sender_id: message.contact.id, sender_type: 'Contact') if message.contact.present?
|
message.update_columns(sender_id: message.contact.id, sender_type: 'Contact') if message.contact.present?
|
||||||
if message.sender.nil?
|
message.update_columns(sender_id: message.conversation.contact.id, sender_type: 'Contact') if message.sender.nil? && message.incoming?
|
||||||
message.update_columns(sender_id: message.conversation.contact.id, sender_type: 'Contact') if message.incoming?
|
|
||||||
end
|
|
||||||
# rubocop:enable Rails/SkipsModelValidations
|
# rubocop:enable Rails/SkipsModelValidations
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# This migration comes from active_storage (originally 20190112182829)
|
||||||
|
class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0]
|
||||||
|
def up
|
||||||
|
unless column_exists?(:active_storage_blobs, :service_name)
|
||||||
|
add_column :active_storage_blobs, :service_name, :string
|
||||||
|
|
||||||
|
if configured_service = ActiveStorage::Blob.service.name
|
||||||
|
ActiveStorage::Blob.unscoped.update_all(service_name: configured_service)
|
||||||
|
end
|
||||||
|
|
||||||
|
change_column :active_storage_blobs, :service_name, :string, null: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_column :active_storage_blobs, :service_name
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# This migration comes from active_storage (originally 20191206030411)
|
||||||
|
class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
create_table :active_storage_variant_records do |t|
|
||||||
|
t.belongs_to :blob, null: false, index: false
|
||||||
|
t.string :variation_digest, null: false
|
||||||
|
|
||||||
|
t.index %i[blob_id variation_digest], name: 'index_active_storage_variant_records_uniqueness', unique: true
|
||||||
|
t.foreign_key :active_storage_blobs, column: :blob_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
12
db/schema.rb
12
db/schema.rb
@@ -2,8 +2,8 @@
|
|||||||
# of editing this file, please use the migrations feature of Active Record to
|
# of editing this file, please use the migrations feature of Active Record to
|
||||||
# incrementally modify your database, and then regenerate this schema definition.
|
# incrementally modify your database, and then regenerate this schema definition.
|
||||||
#
|
#
|
||||||
# This file is the source Rails uses to define your schema when running `rails
|
# This file is the source Rails uses to define your schema when running `bin/rails
|
||||||
# db:schema:load`. When creating a new database, `rails db:schema:load` tends to
|
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
|
||||||
# be faster and is potentially less error prone than running all of your
|
# be faster and is potentially less error prone than running all of your
|
||||||
# migrations from scratch. Old migrations may fail to apply correctly if those
|
# migrations from scratch. Old migrations may fail to apply correctly if those
|
||||||
# migrations use external dependencies or application code.
|
# migrations use external dependencies or application code.
|
||||||
@@ -79,9 +79,16 @@ ActiveRecord::Schema.define(version: 2021_07_23_095657) do
|
|||||||
t.bigint "byte_size", null: false
|
t.bigint "byte_size", null: false
|
||||||
t.string "checksum", null: false
|
t.string "checksum", null: false
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
|
t.string "service_name", null: false
|
||||||
t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
|
t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "active_storage_variant_records", force: :cascade do |t|
|
||||||
|
t.bigint "blob_id", null: false
|
||||||
|
t.string "variation_digest", null: false
|
||||||
|
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
|
||||||
|
end
|
||||||
|
|
||||||
create_table "agent_bot_inboxes", force: :cascade do |t|
|
create_table "agent_bot_inboxes", force: :cascade do |t|
|
||||||
t.integer "inbox_id"
|
t.integer "inbox_id"
|
||||||
t.integer "agent_bot_id"
|
t.integer "agent_bot_id"
|
||||||
@@ -685,6 +692,7 @@ ActiveRecord::Schema.define(version: 2021_07_23_095657) do
|
|||||||
add_foreign_key "account_users", "accounts"
|
add_foreign_key "account_users", "accounts"
|
||||||
add_foreign_key "account_users", "users"
|
add_foreign_key "account_users", "users"
|
||||||
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
|
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
|
||||||
|
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
|
||||||
add_foreign_key "agent_bots", "accounts"
|
add_foreign_key "agent_bots", "accounts"
|
||||||
add_foreign_key "campaigns", "accounts"
|
add_foreign_key "campaigns", "accounts"
|
||||||
add_foreign_key "campaigns", "inboxes"
|
add_foreign_key "campaigns", "inboxes"
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ KillMode=mixed
|
|||||||
StandardInput=null
|
StandardInput=null
|
||||||
SyslogIdentifier=%p
|
SyslogIdentifier=%p
|
||||||
|
|
||||||
Environment="PATH=/home/chatwoot/.rvm/gems/ruby-2.7.3/bin:/home/chatwoot/.rvm/gems/ruby-2.7.3@global/bin:/home/chatwoot/.rvm/rubies/ruby-2.7.3/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin"
|
Environment="PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2/bin:/home/chatwoot/.rvm/gems/ruby-3.0.2@global/bin:/home/chatwoot/.rvm/rubies/ruby-3.0.2/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin"
|
||||||
Environment="PORT=3000"
|
Environment="PORT=3000"
|
||||||
Environment="RAILS_ENV=production"
|
Environment="RAILS_ENV=production"
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
Environment="RAILS_LOG_TO_STDOUT=true"
|
Environment="RAILS_LOG_TO_STDOUT=true"
|
||||||
Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-2.7.3"
|
Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-3.0.2"
|
||||||
Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-2.7.3:/home/chatwoot/.rvm/gems/ruby-2.7.3@global"
|
Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2:/home/chatwoot/.rvm/gems/ruby-3.0.2@global"
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ KillMode=mixed
|
|||||||
StandardInput=null
|
StandardInput=null
|
||||||
SyslogIdentifier=%p
|
SyslogIdentifier=%p
|
||||||
|
|
||||||
Environment="PATH=/home/chatwoot/.rvm/gems/ruby-2.7.3/bin:/home/chatwoot/.rvm/gems/ruby-2.7.3@global/bin:/home/chatwoot/.rvm/rubies/ruby-2.7.3/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin"
|
Environment="PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2/bin:/home/chatwoot/.rvm/gems/ruby-3.0.2@global/bin:/home/chatwoot/.rvm/rubies/ruby-3.0.2/bin:/home/chatwoot/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/chatwoot/.rvm/bin:/home/chatwoot/.rvm/bin"
|
||||||
Environment="PORT=3000"
|
Environment="PORT=3000"
|
||||||
Environment="RAILS_ENV=production"
|
Environment="RAILS_ENV=production"
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
Environment="RAILS_LOG_TO_STDOUT=true"
|
Environment="RAILS_LOG_TO_STDOUT=true"
|
||||||
Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-2.7.3"
|
Environment="GEM_HOME=/home/chatwoot/.rvm/gems/ruby-3.0.2"
|
||||||
Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-2.7.3:/home/chatwoot/.rvm/gems/ruby-2.7.3@global"
|
Environment="GEM_PATH=/home/chatwoot/.rvm/gems/ruby-3.0.2:/home/chatwoot/.rvm/gems/ruby-3.0.2@global"
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ RAILS_ENV=production
|
|||||||
sudo -i -u chatwoot << EOF
|
sudo -i -u chatwoot << EOF
|
||||||
rvm --version
|
rvm --version
|
||||||
rvm autolibs disable
|
rvm autolibs disable
|
||||||
rvm install "ruby-2.7.3"
|
rvm install "ruby-3.0.2"
|
||||||
rvm use 2.7.3 --default
|
rvm use 3.0.2 --default
|
||||||
|
|
||||||
git clone https://github.com/chatwoot/chatwoot.git
|
git clone https://github.com/chatwoot/chatwoot.git
|
||||||
cd chatwoot
|
cd chatwoot
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ RAILS_ENV=production
|
|||||||
sudo -i -u chatwoot << EOF
|
sudo -i -u chatwoot << EOF
|
||||||
rvm --version
|
rvm --version
|
||||||
rvm autolibs disable
|
rvm autolibs disable
|
||||||
rvm install "ruby-2.7.3"
|
rvm install "ruby-3.0.2"
|
||||||
rvm use 2.7.3 --default
|
rvm use 3.0.2 --default
|
||||||
|
|
||||||
git clone https://github.com/chatwoot/chatwoot.git
|
git clone https://github.com/chatwoot/chatwoot.git
|
||||||
cd chatwoot
|
cd chatwoot
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# pre-build stage
|
# pre-build stage
|
||||||
FROM ruby:2.7.3-alpine AS pre-builder
|
FROM ruby:3.0.2-alpine AS pre-builder
|
||||||
|
|
||||||
# ARG default to production settings
|
# ARG default to production settings
|
||||||
# For development docker-compose file overrides ARGS
|
# For development docker-compose file overrides ARGS
|
||||||
@@ -51,7 +51,7 @@ RUN if [ "$RAILS_ENV" = "production" ]; then \
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# final build stage
|
# final build stage
|
||||||
FROM ruby:2.7.3-alpine
|
FROM ruby:3.0.2-alpine
|
||||||
|
|
||||||
ARG BUNDLE_WITHOUT="development:test"
|
ARG BUNDLE_WITHOUT="development:test"
|
||||||
ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT}
|
ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT}
|
||||||
@@ -83,9 +83,9 @@ COPY --from=pre-builder /gems/ /gems/
|
|||||||
COPY --from=pre-builder /app /app
|
COPY --from=pre-builder /app /app
|
||||||
|
|
||||||
# Remove unnecessary files
|
# Remove unnecessary files
|
||||||
RUN rm -rf /gems/ruby/2.7.0/cache/*.gem \
|
RUN rm -rf /gems/ruby/3.0.2/cache/*.gem \
|
||||||
&& find /gems/ruby/2.7.0/gems/ -name "*.c" -delete \
|
&& find /gems/ruby/3.0.2/gems/ -name "*.c" -delete \
|
||||||
&& find /gems/ruby/2.7.0/gems/ -name "*.o" -delete
|
&& find /gems/ruby/3.0.2/gems/ -name "*.o" -delete
|
||||||
|
|
||||||
# creating a log directory so that image wont fail when RAILS_LOG_TO_STDOUT is false
|
# creating a log directory so that image wont fail when RAILS_LOG_TO_STDOUT is false
|
||||||
# https://github.com/chatwoot/chatwoot/issues/701
|
# https://github.com/chatwoot/chatwoot/issues/701
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
# https://github.com/Azure/azure-storage-ruby/issues/166#issuecomment-637696565
|
|
||||||
# Remove this once the changes comes into rails
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# TODO: Remove this once the changes comes into rails version
|
|
||||||
# https://github.com/Azure/azure-storage-ruby/issues/166#issuecomment-637696565
|
|
||||||
@@ -39,7 +39,7 @@ class ChatwootHub
|
|||||||
rescue *ExceptionList::REST_CLIENT_EXCEPTIONS, *ExceptionList::URI_EXCEPTIONS => e
|
rescue *ExceptionList::REST_CLIENT_EXCEPTIONS, *ExceptionList::URI_EXCEPTIONS => e
|
||||||
Rails.logger.info "Exception: #{e.message}"
|
Rails.logger.info "Exception: #{e.message}"
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
end
|
end
|
||||||
version
|
version
|
||||||
end
|
end
|
||||||
@@ -61,6 +61,6 @@ class ChatwootHub
|
|||||||
rescue *ExceptionList::REST_CLIENT_EXCEPTIONS, *ExceptionList::URI_EXCEPTIONS => e
|
rescue *ExceptionList::REST_CLIENT_EXCEPTIONS, *ExceptionList::URI_EXCEPTIONS => e
|
||||||
Rails.logger.info "Exception: #{e.message}"
|
Rails.logger.info "Exception: #{e.message}"
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
module ExceptionList
|
module ExceptionList
|
||||||
URI_EXCEPTIONS = [Errno::ETIMEDOUT, Errno::ECONNREFUSED, URI::InvalidURIError, Net::OpenTimeout, SocketError, OpenURI::HTTPError].freeze
|
URI_EXCEPTIONS = [Errno::ETIMEDOUT, Errno::ECONNREFUSED, URI::InvalidURIError, Net::OpenTimeout, SocketError].freeze
|
||||||
REST_CLIENT_EXCEPTIONS = [RestClient::NotFound, RestClient::GatewayTimeout, RestClient::BadRequest,
|
REST_CLIENT_EXCEPTIONS = [RestClient::NotFound, RestClient::GatewayTimeout, RestClient::BadRequest,
|
||||||
RestClient::MethodNotAllowed, RestClient::Forbidden, RestClient::InternalServerError, RestClient::PayloadTooLarge].freeze
|
RestClient::MethodNotAllowed, RestClient::Forbidden, RestClient::InternalServerError, RestClient::PayloadTooLarge].freeze
|
||||||
SMTP_EXCEPTIONS = [
|
SMTP_EXCEPTIONS = [
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class Integrations::Facebook::MessageCreator
|
|||||||
create_contact_message
|
create_contact_message
|
||||||
end
|
end
|
||||||
# rescue => e
|
# rescue => e
|
||||||
# Raven.capture_exception(e)
|
# Sentry.capture_exception(e)
|
||||||
# end
|
# end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,6 @@ class Webhooks::Trigger
|
|||||||
rescue *ExceptionList::REST_CLIENT_EXCEPTIONS, *ExceptionList::URI_EXCEPTIONS => e
|
rescue *ExceptionList::REST_CLIENT_EXCEPTIONS, *ExceptionList::URI_EXCEPTIONS => e
|
||||||
Rails.logger.info "Exception: invalid webhook url #{url} : #{e.message}"
|
Rails.logger.info "Exception: invalid webhook url #{url} : #{e.message}"
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Raven.capture_exception(e)
|
Sentry.capture_exception(e)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -91,15 +91,15 @@ module WootMessageSeeder
|
|||||||
|
|
||||||
def self.sample_form
|
def self.sample_form
|
||||||
{
|
{
|
||||||
"items": [
|
items: [
|
||||||
{ "name": 'email', "placeholder": 'Please enter your email', "type": 'email', "label": 'Email', "required": 'required',
|
{ name: 'email', placeholder: 'Please enter your email', type: 'email', label: 'Email', required: 'required',
|
||||||
"pattern_error": 'Please fill this field', "pattern": '^[^\s@]+@[^\s@]+\.[^\s@]+$' },
|
pattern_error: 'Please fill this field', pattern: '^[^\s@]+@[^\s@]+\.[^\s@]+$' },
|
||||||
{ "name": 'text_area', "placeholder": 'Please enter text', "type": 'text_area', "label": 'Large Text', "required": 'required',
|
{ name: 'text_area', placeholder: 'Please enter text', type: 'text_area', label: 'Large Text', required: 'required',
|
||||||
"pattern_error": 'Please fill this field' },
|
pattern_error: 'Please fill this field' },
|
||||||
{ "name": 'text', "placeholder": 'Please enter text', "type": 'text', "label": 'text', "default": 'defaut value', "required": 'required',
|
{ name: 'text', placeholder: 'Please enter text', type: 'text', label: 'text', default: 'defaut value', required: 'required',
|
||||||
"pattern": '^[a-zA-Z ]*$', "pattern_error": 'Only alphabets are allowed' },
|
pattern: '^[a-zA-Z ]*$', pattern_error: 'Only alphabets are allowed' },
|
||||||
{ "name": 'select', "label": 'Select Option', "type": 'select', "options": [{ "label": '🌯 Burito', "value": 'Burito' },
|
{ name: 'select', label: 'Select Option', type: 'select', options: [{ label: '🌯 Burito', value: 'Burito' },
|
||||||
{ "label": '🍝 Pasta', "value": 'Pasta' }] }
|
{ label: '🍝 Pasta', value: 'Pasta' }] }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -8,9 +8,11 @@ describe ::ContactMergeAction do
|
|||||||
let!(:mergee_contact) { create(:contact, account: account) }
|
let!(:mergee_contact) { create(:contact, account: account) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
2.times.each { create(:conversation, contact: base_contact) }
|
2.times.each do
|
||||||
2.times.each { create(:conversation, contact: mergee_contact) }
|
create(:conversation, contact: base_contact)
|
||||||
2.times.each { create(:message, sender: mergee_contact) }
|
create(:conversation, contact: mergee_contact)
|
||||||
|
create(:message, sender: mergee_contact)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#perform' do
|
describe '#perform' do
|
||||||
|
|||||||
@@ -13,8 +13,10 @@ RSpec.describe '/api/v1/accounts/{account.id}/contacts/:id/conversations', type:
|
|||||||
|
|
||||||
before do
|
before do
|
||||||
create(:inbox_member, user: agent, inbox: inbox_1)
|
create(:inbox_member, user: agent, inbox: inbox_1)
|
||||||
2.times.each { create(:conversation, account: account, inbox: inbox_1, contact: contact, contact_inbox: contact_inbox_1) }
|
2.times.each do
|
||||||
2.times.each { create(:conversation, account: account, inbox: inbox_2, contact: contact, contact_inbox: contact_inbox_2) }
|
create(:conversation, account: account, inbox: inbox_1, contact: contact, contact_inbox: contact_inbox_1)
|
||||||
|
create(:conversation, account: account, inbox: inbox_2, contact: contact, contact_inbox: contact_inbox_2)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET /api/v1/accounts/{account.id}/contacts/:id/conversations' do
|
describe 'GET /api/v1/accounts/{account.id}/contacts/:id/conversations' do
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ FactoryBot.define do
|
|||||||
app_id { 'slack' }
|
app_id { 'slack' }
|
||||||
inbox
|
inbox
|
||||||
account
|
account
|
||||||
settings { { 'test': 'test' } }
|
settings { { test: 'test' } }
|
||||||
status { Integrations::Hook.statuses['enabled'] }
|
status { Integrations::Hook.statuses['enabled'] }
|
||||||
access_token { SecureRandom.hex }
|
access_token { SecureRandom.hex }
|
||||||
reference_id { SecureRandom.hex }
|
reference_id { SecureRandom.hex }
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ require 'sidekiq/testing'
|
|||||||
# require only the support files necessary.
|
# require only the support files necessary.
|
||||||
#
|
#
|
||||||
# rubocop:disable Rails/FilePath
|
# rubocop:disable Rails/FilePath
|
||||||
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
|
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
|
||||||
# rubocop:enable Rails/FilePath
|
# rubocop:enable Rails/FilePath
|
||||||
|
|
||||||
# Checks for pending migrations and applies them before tests are run.
|
# Checks for pending migrations and applies them before tests are run.
|
||||||
@@ -79,4 +79,5 @@ end
|
|||||||
# Required for fixture_file_upload
|
# Required for fixture_file_upload
|
||||||
FactoryBot::SyntaxRunner.class_eval do
|
FactoryBot::SyntaxRunner.class_eval do
|
||||||
include ActionDispatch::TestProcess
|
include ActionDispatch::TestProcess
|
||||||
|
include ActiveSupport::Testing::FileFixtures
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,75 +1,76 @@
|
|||||||
module SlackStubs
|
module SlackStubs
|
||||||
def slack_url_verification_stub
|
def slack_url_verification_stub
|
||||||
{
|
{
|
||||||
"token": 'Jhj5dZrVaK7ZwHHjRyZWjbDl',
|
token: 'Jhj5dZrVaK7ZwHHjRyZWjbDl',
|
||||||
"challenge": '3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P',
|
challenge: '3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P',
|
||||||
"type": 'url_verification'
|
type: 'url_verification'
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def slack_message_stub
|
def slack_message_stub
|
||||||
{
|
{
|
||||||
"token": '[FILTERED]',
|
token: '[FILTERED]',
|
||||||
"team_id": 'TLST3048H',
|
team_id: 'TLST3048H',
|
||||||
"api_app_id": 'A012S5UETV4',
|
api_app_id: 'A012S5UETV4',
|
||||||
"event": message_event,
|
event: message_event,
|
||||||
"type": 'event_callback',
|
type: 'event_callback',
|
||||||
"event_id": 'Ev013QUX3WV6',
|
event_id: 'Ev013QUX3WV6',
|
||||||
"event_time": 1_588_623_033,
|
event_time: 1_588_623_033,
|
||||||
"authed_users": '[FILTERED]',
|
authed_users: '[FILTERED]',
|
||||||
"webhook": {}
|
webhook: {}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def slack_message_stub_without_thread_ts
|
def slack_message_stub_without_thread_ts
|
||||||
{
|
{
|
||||||
"token": '[FILTERED]',
|
token: '[FILTERED]',
|
||||||
"team_id": '',
|
team_id: '',
|
||||||
"api_app_id": '',
|
api_app_id: '',
|
||||||
"event": {
|
event: {
|
||||||
"type": 'message',
|
type: 'message',
|
||||||
"client_msg_id": 'ffc6e64e-6f0c-4a3d-b594-faa6b44e48ab',
|
client_msg_id: 'ffc6e64e-6f0c-4a3d-b594-faa6b44e48ab',
|
||||||
"text": 'this is test',
|
text: 'this is test',
|
||||||
"user": 'ULYPAKE5S',
|
user: 'ULYPAKE5S',
|
||||||
"ts": '1588623033.006000',
|
ts: '1588623033.006000',
|
||||||
"team": 'TLST3048H'
|
team: 'TLST3048H'
|
||||||
},
|
},
|
||||||
"type": 'event_callback',
|
type: 'event_callback',
|
||||||
"event_id": '',
|
event_id: '',
|
||||||
"event_time": 1_588_623_033,
|
event_time: 1_588_623_033,
|
||||||
"authed_users": '[FILTERED]',
|
authed_users: '[FILTERED]',
|
||||||
"webhook": {}
|
webhook: {}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def message_event
|
def message_event
|
||||||
{
|
{
|
||||||
"client_msg_id": 'ffc6e64e-6f0c-4a3d-b594-faa6b44e48ab',
|
|
||||||
"type": 'message',
|
client_msg_id: 'ffc6e64e-6f0c-4a3d-b594-faa6b44e48ab',
|
||||||
"text": 'this is test <https://chatwoot.com> Hey <@U019KT237LP|Sojan> Test again',
|
type: 'message',
|
||||||
"user": 'ULYPAKE5S',
|
text: 'this is test <https://chatwoot.com> Hey <@U019KT237LP|Sojan> Test again',
|
||||||
"ts": '1588623033.006000',
|
user: 'ULYPAKE5S',
|
||||||
"team": 'TLST3048H',
|
ts: '1588623033.006000',
|
||||||
"blocks": message_blocks,
|
team: 'TLST3048H',
|
||||||
"thread_ts": '1588623023.005900',
|
blocks: message_blocks,
|
||||||
"channel": 'G01354F6A6Q',
|
thread_ts: '1588623023.005900',
|
||||||
"event_ts": '1588623033.006000',
|
channel: 'G01354F6A6Q',
|
||||||
"channel_type": 'group'
|
event_ts: '1588623033.006000',
|
||||||
|
channel_type: 'group'
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def message_blocks
|
def message_blocks
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"type": 'rich_text',
|
type: 'rich_text',
|
||||||
"block_id": 'jaIv3',
|
block_id: 'jaIv3',
|
||||||
"elements": [
|
elements: [
|
||||||
{
|
{
|
||||||
"type": 'rich_text_section',
|
type: 'rich_text_section',
|
||||||
"elements": [
|
elements: [
|
||||||
{
|
{
|
||||||
"type": 'text',
|
type: 'text',
|
||||||
"text": 'this is test'
|
text: 'this is test'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user