webhookdb 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/data/messages/web/install-customer-login.liquid +1 -1
  3. data/data/messages/web/install-success.liquid +2 -2
  4. data/db/migrations/038_webhookdb_api_key.rb +13 -0
  5. data/db/migrations/039_saved_query.rb +17 -0
  6. data/lib/webhookdb/api/db.rb +2 -19
  7. data/lib/webhookdb/api/helpers.rb +27 -0
  8. data/lib/webhookdb/api/install.rb +23 -1
  9. data/lib/webhookdb/api/saved_queries.rb +219 -0
  10. data/lib/webhookdb/api/service_integrations.rb +17 -12
  11. data/lib/webhookdb/api/sync_targets.rb +2 -6
  12. data/lib/webhookdb/api/system.rb +13 -2
  13. data/lib/webhookdb/api/webhook_subscriptions.rb +12 -18
  14. data/lib/webhookdb/api.rb +11 -2
  15. data/lib/webhookdb/apps.rb +2 -0
  16. data/lib/webhookdb/email_octopus.rb +2 -0
  17. data/lib/webhookdb/envfixer.rb +29 -0
  18. data/lib/webhookdb/fixtures/saved_queries.rb +27 -0
  19. data/lib/webhookdb/fixtures/service_integrations.rb +4 -0
  20. data/lib/webhookdb/front.rb +23 -11
  21. data/lib/webhookdb/google_calendar.rb +6 -0
  22. data/lib/webhookdb/icalendar.rb +6 -0
  23. data/lib/webhookdb/idempotency.rb +94 -33
  24. data/lib/webhookdb/jobs/backfill.rb +24 -5
  25. data/lib/webhookdb/jobs/icalendar_enqueue_syncs.rb +7 -1
  26. data/lib/webhookdb/jobs/prepare_database_connections.rb +2 -2
  27. data/lib/webhookdb/jobs/scheduled_backfills.rb +19 -13
  28. data/lib/webhookdb/oauth/{front.rb → front_provider.rb} +21 -4
  29. data/lib/webhookdb/oauth/{intercom.rb → intercom_provider.rb} +1 -1
  30. data/lib/webhookdb/oauth.rb +8 -7
  31. data/lib/webhookdb/organization/alerting.rb +11 -0
  32. data/lib/webhookdb/organization.rb +8 -2
  33. data/lib/webhookdb/postgres/model_utilities.rb +19 -0
  34. data/lib/webhookdb/postgres.rb +3 -0
  35. data/lib/webhookdb/replicator/column.rb +9 -1
  36. data/lib/webhookdb/replicator/front_conversation_v1.rb +5 -1
  37. data/lib/webhookdb/replicator/front_marketplace_root_v1.rb +2 -5
  38. data/lib/webhookdb/replicator/front_message_v1.rb +5 -1
  39. data/lib/webhookdb/replicator/front_signalwire_message_channel_app_v1.rb +325 -0
  40. data/lib/webhookdb/replicator/front_v1_mixin.rb +9 -1
  41. data/lib/webhookdb/replicator/icalendar_calendar_v1.rb +6 -3
  42. data/lib/webhookdb/replicator/signalwire_message_v1.rb +28 -14
  43. data/lib/webhookdb/replicator/twilio_sms_v1.rb +3 -1
  44. data/lib/webhookdb/saved_query.rb +28 -0
  45. data/lib/webhookdb/service_integration.rb +36 -3
  46. data/lib/webhookdb/signalwire.rb +40 -0
  47. data/lib/webhookdb/spec_helpers/citest.rb +18 -9
  48. data/lib/webhookdb/spec_helpers/postgres.rb +9 -0
  49. data/lib/webhookdb/spec_helpers/service.rb +5 -0
  50. data/lib/webhookdb/spec_helpers/shared_examples_for_columns.rb +25 -13
  51. data/lib/webhookdb/spec_helpers/whdb.rb +7 -0
  52. data/lib/webhookdb/sync_target.rb +1 -1
  53. data/lib/webhookdb/tasks/specs.rb +4 -2
  54. data/lib/webhookdb/version.rb +1 -1
  55. data/lib/webhookdb.rb +24 -26
  56. metadata +39 -4
@@ -9,5 +9,45 @@ module Webhookdb::Signalwire
9
9
 
10
10
  configurable(:signalwire) do
11
11
  setting :http_timeout, 30
12
+ setting :sms_allowlist, [], convert: ->(s) { s.split }
13
+ end
14
+
15
+ def self.send_sms(from:, to:, body:, project_id:, **kw)
16
+ sms_allowed = self.sms_allowlist.any? { |pattern| File.fnmatch(pattern, to) }
17
+ unless sms_allowed
18
+ self.logger.warn("signalwire_sms_not_allowed", to:)
19
+ return {"sid" => "skipped"}
20
+ end
21
+ return self.http_request(
22
+ :post,
23
+ "/2010-04-01/Accounts/#{project_id}/Messages.json",
24
+ body: {
25
+ From: from,
26
+ To: to,
27
+ Body: body,
28
+ },
29
+ project_id:,
30
+ **kw,
31
+ )
32
+ end
33
+
34
+ def self.http_request(method, tail, space_url:, project_id:, api_key:, logger:, headers: {}, body: nil, **kw)
35
+ url = "https://#{space_url}.signalwire.com" + tail
36
+ headers["Content-Type"] = "application/x-www-form-urlencoded"
37
+ headers["Accept"] = "application/json"
38
+ kw[:body] = URI.encode_www_form(body) if body
39
+ resp = Webhookdb::Http.send(
40
+ method,
41
+ url,
42
+ basic_auth: {
43
+ username: project_id,
44
+ password: api_key,
45
+ },
46
+ logger:,
47
+ timeout: self.http_timeout,
48
+ headers:,
49
+ **kw,
50
+ )
51
+ return resp.parsed_response
12
52
  end
13
53
  end
@@ -4,10 +4,18 @@ require "webhookdb/slack"
4
4
  require "webhookdb/spec_helpers"
5
5
 
6
6
  module Webhookdb::SpecHelpers::Citest
7
- def self.run_tests(folder)
7
+ INTEGRATION_TESTS_DIR = Pathname(__FILE__).dirname.parent.parent.parent + "integration"
8
+
9
+ # Run RSpec against the given folders, create a DatabaseDocument for the html results,
10
+ # and POST to Slack about it.
11
+ def self.run_tests(folders)
8
12
  out = StringIO.new
9
13
  err = StringIO.new
10
- RSpec::Core::Runner.run([folder + "/", "--format", "html"], err, out)
14
+ folders = [folders] unless folders.respond_to?(:to_ary)
15
+ args = folders.map { |f| "#{f}/" }
16
+ args << "--format"
17
+ args << "html"
18
+ RSpec::Core::Runner.run(args, err, out)
11
19
 
12
20
  notifier = Webhookdb::Slack.new_notifier(
13
21
  force_channel: "#webhookdb-notifications",
@@ -17,13 +25,14 @@ module Webhookdb::SpecHelpers::Citest
17
25
  outstring = out.string
18
26
  result = Webhookdb::SpecHelpers::Citest.parse_rspec_html(outstring)
19
27
  unless result.ok?
20
- msg = "Errored or unparseable output running #{folder} tests:\nerror: #{err.string}\nout: #{outstring}"
28
+ msg = "Errored or unparseable output running #{folders.join(', ')} tests:" \
29
+ "\nerror: #{err.string}\nout: #{outstring}"
21
30
  notifier.post text: msg
22
31
  return
23
32
  end
24
33
 
25
- url = self.put_results(folder, result.html)
26
- payload = self.result_to_payload(folder, result, url)
34
+ url = self.put_results(result.html)
35
+ payload = self.result_to_payload(result, url)
27
36
  notifier.post(payload)
28
37
  end
29
38
 
@@ -43,9 +52,9 @@ module Webhookdb::SpecHelpers::Citest
43
52
  return result
44
53
  end
45
54
 
46
- def self.put_results(folder, html)
55
+ def self.put_results(html, key: "integration")
47
56
  now = Time.now
48
- key = "test-results/#{folder}/#{now.year}/#{now.month}/#{now.in_time_zone('UTC').iso8601}.html"
57
+ key = "test-results/#{key}/#{now.year}/#{now.month}/#{now.in_time_zone('UTC').iso8601}.html"
49
58
  doc = Webhookdb::DatabaseDocument.create(
50
59
  key:,
51
60
  content: html,
@@ -55,13 +64,13 @@ module Webhookdb::SpecHelpers::Citest
55
64
  return url
56
65
  end
57
66
 
58
- def self.result_to_payload(folder, result, html_url)
67
+ def self.result_to_payload(result, html_url, prefix: "Integration Tests")
59
68
  color = "good"
60
69
  color = "warning" if result.pending.nonzero?
61
70
  color = "danger" if result.failures.nonzero?
62
71
 
63
72
  return {
64
- text: "Tests for #{folder}: #{result.examples} examples, #{result.failures} failures, #{result.pending} pending",
73
+ text: "#{prefix}: #{result.examples} examples, #{result.failures} failures, #{result.pending} pending",
65
74
  attachments: [
66
75
  {
67
76
  color:,
@@ -31,6 +31,7 @@ module Webhookdb::SpecHelpers::Postgres
31
31
  context.around(:each) do |example|
32
32
  Webhookdb::Postgres.unsafe_skip_transaction_check = true if example.metadata[:no_transaction_check]
33
33
 
34
+ _truncate(example)
34
35
  setting = example.metadata[:db]
35
36
  if setting && setting != :no_transaction
36
37
  Webhookdb::SpecHelpers::Postgres.wrap_example_in_transactions(example)
@@ -44,11 +45,19 @@ module Webhookdb::SpecHelpers::Postgres
44
45
  Webhookdb::Postgres.unsafe_skip_transaction_check = false if example.metadata[:no_transaction_check]
45
46
 
46
47
  truncate_all if example.metadata[:db] == :no_transaction
48
+ _truncate(example)
47
49
  end
48
50
 
49
51
  super
50
52
  end
51
53
 
54
+ module_function def _truncate(example)
55
+ tr = example.metadata[:truncate]
56
+ return unless tr
57
+ tr = [tr] unless tr.respond_to?(:to_ary)
58
+ tr.each(&:truncate)
59
+ end
60
+
52
61
  ### Run the specified +example+ in the context of a transaction for each loaded
53
62
  ### model superclass. Raises if any of the loaded superclasses aren't
54
63
  ### configured.
@@ -423,6 +423,11 @@ module Webhookdb::SpecHelpers::Service
423
423
  super
424
424
  end
425
425
 
426
+ def delete(uri, params={}, env={}, &)
427
+ env, params = make_json_request(env, params)
428
+ super
429
+ end
430
+
426
431
  def make_json_request(env, params)
427
432
  env["CONTENT_TYPE"] ||= "application/json"
428
433
  params = Webhookdb::Json.encode(params) if env["CONTENT_TYPE"] == "application/json" && !params.is_a?(String)
@@ -27,7 +27,7 @@ RSpec.shared_examples "a service column converter" do |isomorphic_proc|
27
27
  end
28
28
  end
29
29
 
30
- RSpec.shared_examples "a service column defaulter" do |isomorphic_proc|
30
+ RSpec.shared_examples "a service column defaulter" do |isomorphic_proc, ruby: true, sql: true|
31
31
  let(:resource) { nil }
32
32
  let(:event) { nil }
33
33
  let(:enrichment) { nil }
@@ -37,20 +37,32 @@ RSpec.shared_examples "a service column defaulter" do |isomorphic_proc|
37
37
  let(:expected_query) { nil }
38
38
  let(:db) { Webhookdb::Postgres::Model.db }
39
39
 
40
- it "returns expected value using ruby proc" do
41
- v = isomorphic_proc.ruby.call(resource:, event:, enrichment:, service_integration:)
42
- expect(v).to expected
40
+ if ruby
41
+ it "returns expected value using ruby proc" do
42
+ v = isomorphic_proc.ruby.call(resource:, event:, enrichment:, service_integration:)
43
+ expect(v).to expected
44
+ end
45
+ else
46
+ it "is not implemented for ruby" do
47
+ expect { isomorphic_proc.ruby.call }.to raise_error(NotImplementedError)
48
+ end
43
49
  end
44
50
 
45
- it "returns expected value using sql proc" do
46
- e = isomorphic_proc.sql.call(service_integration:)
47
- if expected_query.respond_to?(:match)
48
- expect(db.select(e).sql).to match(expected_query)
49
- elsif expected_query
50
- expect(db.select(e).sql).to eq(expected_query)
51
- else
52
- v = db.select(e).first.to_a[0][1]
53
- expect(v).to expected
51
+ if sql
52
+ it "returns expected value using sql proc" do
53
+ e = isomorphic_proc.sql.call(service_integration:)
54
+ if expected_query.respond_to?(:match)
55
+ expect(db.select(e).sql).to match(expected_query)
56
+ elsif expected_query
57
+ expect(db.select(e).sql).to eq(expected_query)
58
+ else
59
+ v = db.select(e).first.to_a[0][1]
60
+ expect(v).to expected
61
+ end
62
+ end
63
+ else
64
+ it "is not implemented for sql" do
65
+ expect { isomorphic_proc.sql.call }.to raise_error(NotImplementedError)
54
66
  end
55
67
  end
56
68
  end
@@ -136,4 +136,11 @@ module Webhookdb::SpecHelpers::Whdb
136
136
  raise "Must provide :replicator or have :svc available" if replicator.nil?
137
137
  return replicator.admin_dataset { |ds| ds.where(pk: row.fetch(:pk)).update(fields) }
138
138
  end
139
+
140
+ RSpec::Matchers.define(:be_a_uuid) do
141
+ match do |v|
142
+ uuid = /\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/i
143
+ v =~ uuid
144
+ end
145
+ end
139
146
  end
@@ -55,7 +55,7 @@ class Webhookdb::SyncTarget < Webhookdb::Postgres::Model(:sync_targets)
55
55
 
56
56
  after_configured do
57
57
  if Webhookdb::RACK_ENV == "test"
58
- safename = ENV["USER"].gsub(/[^A-Za-z]/, "")
58
+ safename = ENV.fetch("USER", "root").gsub(/[^A-Za-z]/, "")
59
59
  self.default_schema = "synctest_#{safename}"
60
60
  end
61
61
  end
@@ -10,13 +10,15 @@ module Webhookdb::Tasks
10
10
  def initialize
11
11
  super()
12
12
  namespace :specs do
13
- desc "Run API integration tests"
13
+ desc "Run API integration tests in the 'integration' folder of this gem. " \
14
+ "To run your own tests, create a task similar to this one, " \
15
+ "that calls Webhookdb::SpecHelpers::Citest.run_tests."
14
16
  task :integration do
15
17
  require "rspec/core"
16
18
  require "slack-notifier"
17
19
  require "webhookdb/spec_helpers/integration"
18
20
  require "webhookdb/spec_helpers/citest"
19
- Webhookdb::SpecHelpers::Citest.run_tests("integration")
21
+ Webhookdb::SpecHelpers::Citest.run_tests(Webhookdb::SpecHelpers::Citest::INTEGRATION_TESTS_DIR)
20
22
  end
21
23
 
22
24
  desc "The release process needs to finish quickly, so start the integration tests in another dyno."
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Webhookdb
4
- VERSION = "1.0.2"
4
+ VERSION = "1.2.0"
5
5
  end
data/lib/webhookdb.rb CHANGED
@@ -8,15 +8,12 @@ require "money"
8
8
  require "pathname"
9
9
  require "phony"
10
10
 
11
+ require "webhookdb/envfixer"
11
12
  require "webhookdb/json"
13
+ require "webhookdb/method_utilities"
12
14
 
13
- if (heroku_app = ENV.fetch("MERGE_HEROKU_ENV", nil))
14
- text = `heroku config -j --app=#{heroku_app}`
15
- json = Oj.load(text)
16
- json.each do |k, v|
17
- ENV[k] = v
18
- end
19
- end
15
+ Webhookdb::Envfixer.replace_localhost_for_docker(ENV)
16
+ Webhookdb::Envfixer.merge_heroku_env(ENV)
20
17
 
21
18
  Money.locale_backend = :i18n
22
19
  Money.default_currency = "USD"
@@ -36,6 +33,7 @@ end
36
33
  module Webhookdb
37
34
  include Appydays::Loggable
38
35
  include Appydays::Configurable
36
+ extend Webhookdb::MethodUtilities
39
37
 
40
38
  # Error raised when we cannot take an action
41
39
  # because some condition has not been set up right.
@@ -72,6 +70,9 @@ module Webhookdb
72
70
 
73
71
  DATA_DIR = Pathname(__FILE__).dirname.parent + "data"
74
72
 
73
+ singleton_attr_reader :globals_cache
74
+ @globals_cache = {}
75
+
75
76
  configurable(:webhookdb) do
76
77
  setting :log_level_override,
77
78
  nil,
@@ -86,6 +87,10 @@ module Webhookdb
86
87
  setting :support_email, "hello@webhookdb.com"
87
88
  setting :use_globals_cache, false
88
89
  setting :regression_mode, false
90
+
91
+ after_configured do
92
+ globals_cache.clear
93
+ end
89
94
  end
90
95
 
91
96
  # Regression mode is true when we re replaying webhooks locally,
@@ -96,9 +101,6 @@ module Webhookdb
96
101
  return self.regression_mode
97
102
  end
98
103
 
99
- require "webhookdb/method_utilities"
100
- extend Webhookdb::MethodUtilities
101
-
102
104
  require "webhookdb/sentry"
103
105
 
104
106
  def self.load_app
@@ -115,9 +117,6 @@ module Webhookdb
115
117
  # :section: Globals cache
116
118
  #
117
119
 
118
- singleton_attr_reader :globals_cache
119
- @globals_cache = {}
120
-
121
120
  # If globals caching is enabled, see if there is a cached value under +key+
122
121
  # and return it if so. If there is not, evaluate the given block and store that value.
123
122
  # Generally used for looking up well-known database objects like certain roles.
@@ -127,7 +126,7 @@ module Webhookdb
127
126
  return result if result
128
127
  end
129
128
  result = yield()
130
- self.globals_cache[key] = result
129
+ (self.globals_cache[key] = result) if self.use_globals_cache
131
130
  return result
132
131
  end
133
132
 
@@ -153,18 +152,6 @@ module Webhookdb
153
152
  return key
154
153
  end
155
154
 
156
- #
157
- # :section: Unambiguous/promo code chars
158
- #
159
-
160
- # Remove ambiguous characters (L, I, 1 or 0, O) and vowels from possible codes
161
- # to avoid creating ambiguous codes or real words.
162
- UNAMBIGUOUS_CHARS = "CDFGHJKMNPQRTVWXYZ23469".chars.freeze
163
-
164
- def self.take_unambiguous_chars(n)
165
- return Array.new(n) { UNAMBIGUOUS_CHARS.sample }.join
166
- end
167
-
168
155
  # Convert a string into something we consistently use for slugs:
169
156
  # a-z, 0-9, and underscores only. Leading numbers are converted to words.
170
157
  #
@@ -192,6 +179,17 @@ module Webhookdb
192
179
  "9" => "nine",
193
180
  }.freeze
194
181
 
182
+ def self.parse_bool(s)
183
+ # rubocop:disable Style/NumericPredicate
184
+ return false if s == nil? || s.blank? || s == 0
185
+ # rubocop:enable Style/NumericPredicate
186
+ return true if s.is_a?(Integer)
187
+ sb = s.to_s.downcase
188
+ return true if ["true", "t", "yes", "y", "on", "1"].include?(sb)
189
+ return false if ["false", "f", "no", "n", "off", "0"].include?(sb)
190
+ raise ArgumentError, "unparseable bool: #{s.inspect}"
191
+ end
192
+
195
193
  # Return the request user and admin stored in TLS. See service.rb for implementation.
196
194
  #
197
195
  # Note that the second return value (the admin) will be nil if not authed as an admin,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webhookdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - WebhookDB
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-10 00:00:00.000000000 Z
11
+ date: 2024-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -248,6 +248,20 @@ dependencies:
248
248
  - - ">="
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: jwt
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '2.7'
258
+ type: :runtime
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '2.7'
251
265
  - !ruby/object:Gem::Dependency
252
266
  name: liquid
253
267
  requirement: !ruby/object:Gem::Requirement
@@ -724,6 +738,20 @@ dependencies:
724
738
  - - "~>"
725
739
  - !ruby/object:Gem::Version
726
740
  version: '10.4'
741
+ - !ruby/object:Gem::Dependency
742
+ name: uuidx
743
+ requirement: !ruby/object:Gem::Requirement
744
+ requirements:
745
+ - - "~>"
746
+ - !ruby/object:Gem::Version
747
+ version: '0.10'
748
+ type: :runtime
749
+ prerelease: false
750
+ version_requirements: !ruby/object:Gem::Requirement
751
+ requirements:
752
+ - - "~>"
753
+ - !ruby/object:Gem::Version
754
+ version: '0.10'
727
755
  - !ruby/object:Gem::Dependency
728
756
  name: warden
729
757
  requirement: !ruby/object:Gem::Requirement
@@ -824,6 +852,8 @@ files:
824
852
  - db/migrations/035_synchronous_backfill.rb
825
853
  - db/migrations/036_oauth.rb
826
854
  - db/migrations/037_oauth_used.rb
855
+ - db/migrations/038_webhookdb_api_key.rb
856
+ - db/migrations/039_saved_query.rb
827
857
  - integration/async_spec.rb
828
858
  - integration/auth_spec.rb
829
859
  - integration/database_spec.rb
@@ -854,6 +884,7 @@ files:
854
884
  - lib/webhookdb/api/me.rb
855
885
  - lib/webhookdb/api/organizations.rb
856
886
  - lib/webhookdb/api/replay.rb
887
+ - lib/webhookdb/api/saved_queries.rb
857
888
  - lib/webhookdb/api/service_integrations.rb
858
889
  - lib/webhookdb/api/services.rb
859
890
  - lib/webhookdb/api/stripe.rb
@@ -889,6 +920,7 @@ files:
889
920
  - lib/webhookdb/developer_alert.rb
890
921
  - lib/webhookdb/email_octopus.rb
891
922
  - lib/webhookdb/enumerable.rb
923
+ - lib/webhookdb/envfixer.rb
892
924
  - lib/webhookdb/fixtures.rb
893
925
  - lib/webhookdb/fixtures/backfill_jobs.rb
894
926
  - lib/webhookdb/fixtures/customers.rb
@@ -901,6 +933,7 @@ files:
901
933
  - lib/webhookdb/fixtures/organization_memberships.rb
902
934
  - lib/webhookdb/fixtures/organizations.rb
903
935
  - lib/webhookdb/fixtures/reset_codes.rb
936
+ - lib/webhookdb/fixtures/saved_queries.rb
904
937
  - lib/webhookdb/fixtures/service_integrations.rb
905
938
  - lib/webhookdb/fixtures/subscriptions.rb
906
939
  - lib/webhookdb/fixtures/sync_targets.rb
@@ -975,8 +1008,8 @@ files:
975
1008
  - lib/webhookdb/microsoft_calendar.rb
976
1009
  - lib/webhookdb/nextpax.rb
977
1010
  - lib/webhookdb/oauth.rb
978
- - lib/webhookdb/oauth/front.rb
979
- - lib/webhookdb/oauth/intercom.rb
1011
+ - lib/webhookdb/oauth/front_provider.rb
1012
+ - lib/webhookdb/oauth/intercom_provider.rb
980
1013
  - lib/webhookdb/oauth/session.rb
981
1014
  - lib/webhookdb/organization.rb
982
1015
  - lib/webhookdb/organization/alerting.rb
@@ -1014,6 +1047,7 @@ files:
1014
1047
  - lib/webhookdb/replicator/front_conversation_v1.rb
1015
1048
  - lib/webhookdb/replicator/front_marketplace_root_v1.rb
1016
1049
  - lib/webhookdb/replicator/front_message_v1.rb
1050
+ - lib/webhookdb/replicator/front_signalwire_message_channel_app_v1.rb
1017
1051
  - lib/webhookdb/replicator/front_v1_mixin.rb
1018
1052
  - lib/webhookdb/replicator/github_issue_comment_v1.rb
1019
1053
  - lib/webhookdb/replicator/github_issue_v1.rb
@@ -1073,6 +1107,7 @@ files:
1073
1107
  - lib/webhookdb/replicator/webhook_request.rb
1074
1108
  - lib/webhookdb/replicator/webhookdb_customer_v1.rb
1075
1109
  - lib/webhookdb/role.rb
1110
+ - lib/webhookdb/saved_query.rb
1076
1111
  - lib/webhookdb/sentry.rb
1077
1112
  - lib/webhookdb/service.rb
1078
1113
  - lib/webhookdb/service/auth.rb