diff options
author | Starfall <us@starfall.systems> | 2022-06-24 13:31:43 -0500 |
---|---|---|
committer | Starfall <us@starfall.systems> | 2022-06-24 13:31:43 -0500 |
commit | d83f17f6763a1ffb3569eac73330cb09c557acea (patch) | |
tree | 92d392eed60a7d60bbd01e8544202db19a37e3d5 /app/models/webhook.rb | |
parent | b9c901007b9a5772d2553a5770fa479954eec58f (diff) | |
parent | 63f79874b59b3ba28c0f940b9d36ea7aacb44c93 (diff) |
Merge remote-tracking branch 'glitch/main'
Diffstat (limited to 'app/models/webhook.rb')
-rw-r--r-- | app/models/webhook.rb | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/app/models/webhook.rb b/app/models/webhook.rb new file mode 100644 index 000000000..431edd75d --- /dev/null +++ b/app/models/webhook.rb @@ -0,0 +1,58 @@ +# 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 |