55 lines
1.2 KiB
Ruby
55 lines
1.2 KiB
Ruby
class Webhook < ApplicationRecord
|
|
include Triggerable
|
|
|
|
PERMITTED_SCHEMES = %w[ http https ].freeze
|
|
PERMITTED_ACTIONS = %w[
|
|
card_assigned
|
|
card_boosted
|
|
card_closed
|
|
card_collection_changed
|
|
card_created
|
|
card_popped
|
|
card_published
|
|
card_reopened
|
|
card_staged
|
|
card_title_changed
|
|
card_unassigned
|
|
card_unstaged
|
|
comment_created
|
|
].freeze
|
|
|
|
encrypts :signing_secret
|
|
has_secure_token :signing_secret
|
|
|
|
has_many :deliveries, dependent: :delete_all
|
|
|
|
serialize :subscribed_actions, type: Array, coder: JSON
|
|
|
|
scope :ordered, -> { order(name: :asc, id: :desc) }
|
|
scope :active, -> { where(active: true) }
|
|
|
|
normalizes :subscribed_actions, with: ->(value) { Array.wrap(value).map { |e| e.to_s.strip.presence }.uniq & PERMITTED_ACTIONS }
|
|
|
|
validates :name, presence: true
|
|
validate :validate_url
|
|
|
|
def activate
|
|
update_columns active: true
|
|
end
|
|
|
|
def deactivate
|
|
update_columns active: false
|
|
end
|
|
|
|
private
|
|
def validate_url
|
|
uri = URI.parse(url.presence)
|
|
|
|
if PERMITTED_SCHEMES.exclude?(uri.scheme)
|
|
errors.add :url, "must use #{PERMITTED_SCHEMES.to_choice_sentence}"
|
|
end
|
|
rescue URI::InvalidURIError
|
|
errors.add :url, "not a URL"
|
|
end
|
|
end
|