adjust webhooks
This commit is contained in:
@@ -1,7 +1,21 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AddSecretToWebhookUrls < ActiveRecord::Migration[7.2]
|
||||
class MigrationWebhookUrl < ApplicationRecord
|
||||
self.table_name = 'webhook_urls'
|
||||
|
||||
serialize :secret, coder: JSON
|
||||
|
||||
encrypts :url, :secret
|
||||
end
|
||||
|
||||
def change
|
||||
add_column :webhook_urls, :secret, :text
|
||||
|
||||
MigrationWebhookUrl.all.each do |url|
|
||||
url.update_columns(secret: {})
|
||||
end
|
||||
|
||||
change_column_null :webhook_urls, :secret, false
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,42 +3,45 @@
|
||||
class PopulateWebhookUrls < ActiveRecord::Migration[7.2]
|
||||
disable_ddl_transaction
|
||||
|
||||
class MigrationWebhookUrl < ApplicationRecord
|
||||
class MigrationWebhookUrl < ActiveRecord::Base
|
||||
self.table_name = 'webhook_urls'
|
||||
|
||||
serialize :events, coder: JSON
|
||||
serialize :secret, coder: JSON
|
||||
encrypts :url, :secret
|
||||
|
||||
before_validation -> { self.sha1 = Digest::SHA1.hexdigest(url) }
|
||||
encrypts :url, :secret
|
||||
end
|
||||
|
||||
class MigrationEncryptedConfig < ApplicationRecord
|
||||
class MigrationEncryptedConfig < ActiveRecord::Base
|
||||
self.table_name = 'encrypted_configs'
|
||||
|
||||
encrypts :value
|
||||
serialize :value, coder: JSON
|
||||
end
|
||||
|
||||
class MigrationAccountConfig < ApplicationRecord
|
||||
class MigrationAccountConfig < ActiveRecord::Base
|
||||
self.table_name = 'account_configs'
|
||||
|
||||
serialize :value, coder: JSON
|
||||
end
|
||||
|
||||
def up
|
||||
MigrationEncryptedConfig.joins('INNER JOIN accounts a ON a.id = encrypted_configs.account_id')
|
||||
.where(key: 'webhook_url')
|
||||
.find_each do |config|
|
||||
webhook_url = MigrationWebhookUrl.find_or_initialize_by(account_id: config.account_id, url: config.value)
|
||||
webhook_url.secret = MigrationEncryptedConfig.find_by(account_id: config.account_id, key: 'webhook_secret')&.value
|
||||
MigrationEncryptedConfig.where(key: 'webhook_url').find_each do |config|
|
||||
webhook_url = MigrationWebhookUrl.find_or_initialize_by(account_id: config.account_id,
|
||||
sha1: Digest::SHA1.hexdigest(config.value))
|
||||
|
||||
webhook_url.secret =
|
||||
MigrationEncryptedConfig.find_by(account_id: config.account_id, key: 'webhook_secret')&.value.to_h
|
||||
|
||||
preferences =
|
||||
MigrationAccountConfig.find_by(account_id: config.account_id, key: 'webhook_preferences')&.value.to_h
|
||||
|
||||
preferences = MigrationAccountConfig.find_by(account_id: config.account_id,
|
||||
key: 'webhook_preferences')&.value.to_h
|
||||
events = %w[form.viewed form.started form.completed form.declined].reject { |event| preferences[event] == false }
|
||||
|
||||
events += preferences.compact_blank.keys
|
||||
|
||||
webhook_url.events = events.uniq
|
||||
webhook_url.url = config.value
|
||||
|
||||
webhook_url.save!
|
||||
end
|
||||
|
||||
+1
-1
@@ -367,7 +367,7 @@ ActiveRecord::Schema[7.2].define(version: 2024_10_29_192232) do
|
||||
t.string "sha1", null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.text "secret"
|
||||
t.text "secret", null: false
|
||||
t.index ["account_id"], name: "index_webhook_urls_on_account_id"
|
||||
t.index ["sha1"], name: "index_webhook_urls_on_sha1"
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user