~cytrogen/masto-fe

94cbd808b5b3e7999c7e77dc724b7e8c9dd2bdec — Vyr Cossont 3 years ago 34096bc
Webhooks for local status.create, status.update, account.update (#24133)

M .rubocop_todo.yml => .rubocop_todo.yml +1 -1
@@ 245,7 245,7 @@ Metrics/BlockNesting:

# Configuration parameters: CountComments, CountAsOne.
Metrics/ClassLength:
  Max: 368
  Max: 375

# Configuration parameters: AllowedMethods, AllowedPatterns.
Metrics/CyclomaticComplexity:

M app/models/account.rb => app/models/account.rb +7 -0
@@ 122,6 122,8 @@ class Account < ApplicationRecord
  scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) }
  scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) }

  after_update_commit :trigger_update_webhooks

  delegate :email,
           :unconfirmed_email,
           :current_sign_in_at,


@@ 593,4 595,9 @@ class Account < ApplicationRecord

    CanonicalEmailBlock.where(reference_account: self).delete_all
  end

  # NOTE: the `account.created` webhook is triggered by the `User` model, not `Account`.
  def trigger_update_webhooks
    TriggerWebhookWorker.perform_async('account.updated', 'Account', id) if local?
  end
end

M app/models/status.rb => app/models/status.rb +11 -0
@@ 111,6 111,9 @@ class Status < ApplicationRecord
    where('NOT EXISTS (SELECT * FROM statuses_tags forbidden WHERE forbidden.status_id = statuses.id AND forbidden.tag_id IN (?))', tag_ids)
  }

  after_create_commit :trigger_create_webhooks
  after_update_commit :trigger_update_webhooks

  cache_associated :application,
                   :media_attachments,
                   :conversation,


@@ 535,4 538,12 @@ class Status < ApplicationRecord
    reblog&.decrement_count!(:reblogs_count) if reblog?
    thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && distributable?
  end

  def trigger_create_webhooks
    TriggerWebhookWorker.perform_async('status.created', 'Status', id) if local?
  end

  def trigger_update_webhooks
    TriggerWebhookWorker.perform_async('status.updated', 'Status', id) if local?
  end
end

M app/models/webhook.rb => app/models/webhook.rb +3 -0
@@ 17,7 17,10 @@ class Webhook < ApplicationRecord
  EVENTS = %w(
    account.approved
    account.created
    account.updated
    report.created
    status.created
    status.updated
  ).freeze

  scope :enabled, -> { where(enabled: true) }

M app/workers/webhooks/delivery_worker.rb => app/workers/webhooks/delivery_worker.rb +1 -1
@@ 19,7 19,7 @@ class Webhooks::DeliveryWorker
  private

  def perform_request
    request = Request.new(:post, @webhook.url, body: @body)
    request = Request.new(:post, @webhook.url, body: @body, allow_local: true)

    request.add_headers(
      'Content-Type' => 'application/json',