You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.3 KiB
58 lines
1.3 KiB
# frozen_string_literal: true |
|
|
|
# == Schema Information |
|
# |
|
# Table name: webhooks |
|
# |
|
# id :bigint(8) not null, primary key |
|
# url :string not null |
|
# events :string default([]), not null, is an Array |
|
# secret :string default(""), not null |
|
# enabled :boolean default(TRUE), not null |
|
# created_at :datetime not null |
|
# updated_at :datetime not null |
|
# |
|
|
|
class Webhook < ApplicationRecord |
|
EVENTS = %w( |
|
account.created |
|
report.created |
|
).freeze |
|
|
|
scope :enabled, -> { where(enabled: true) } |
|
|
|
validates :url, presence: true, url: true |
|
validates :secret, presence: true, length: { minimum: 12 } |
|
validates :events, presence: true |
|
|
|
validate :validate_events |
|
|
|
before_validation :strip_events |
|
before_validation :generate_secret |
|
|
|
def rotate_secret! |
|
update!(secret: SecureRandom.hex(20)) |
|
end |
|
|
|
def enable! |
|
update!(enabled: true) |
|
end |
|
|
|
def disable! |
|
update!(enabled: false) |
|
end |
|
|
|
private |
|
|
|
def validate_events |
|
errors.add(:events, :invalid) if events.any? { |e| !EVENTS.include?(e) } |
|
end |
|
|
|
def strip_events |
|
self.events = events.map { |str| str.strip.presence }.compact if events.present? |
|
end |
|
|
|
def generate_secret |
|
self.secret = SecureRandom.hex(20) if secret.blank? |
|
end |
|
end
|
|
|