mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-20 04:36:21 +00:00
feat: crear webhooks en la social inbox #15109
This commit is contained in:
parent
b792cb2d43
commit
b24f49fe26
5 changed files with 76 additions and 0 deletions
22
app/controllers/api/v1/social_inbox_controller.rb
Normal file
22
app/controllers/api/v1/social_inbox_controller.rb
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Api
|
||||||
|
module V1
|
||||||
|
# Recibe webhooks de la Social Inbox
|
||||||
|
class SocialInboxController < BaseController
|
||||||
|
include WebhookConcern
|
||||||
|
|
||||||
|
def moderationqueued
|
||||||
|
head :accepted
|
||||||
|
end
|
||||||
|
|
||||||
|
def onapproved
|
||||||
|
head :accepted
|
||||||
|
end
|
||||||
|
|
||||||
|
def onrejected
|
||||||
|
head :accepted
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -7,6 +7,8 @@ class DeploySocialDistributedPress < Deploy
|
||||||
# Solo luego de publicar remotamente
|
# Solo luego de publicar remotamente
|
||||||
DEPENDENCIES = %i[deploy_distributed_press deploy_rsync deploy_full_rsync]
|
DEPENDENCIES = %i[deploy_distributed_press deploy_rsync deploy_full_rsync]
|
||||||
|
|
||||||
|
after_save :create_hooks!
|
||||||
|
|
||||||
# Envía las notificaciones
|
# Envía las notificaciones
|
||||||
def deploy(output: false)
|
def deploy(output: false)
|
||||||
with_tempfile(site.private_key_pem) do |file|
|
with_tempfile(site.private_key_pem) do |file|
|
||||||
|
@ -52,4 +54,41 @@ class DeploySocialDistributedPress < Deploy
|
||||||
def flags_for_build(**args)
|
def flags_for_build(**args)
|
||||||
"--key #{Shellwords.escape args[:private_key].path}"
|
"--key #{Shellwords.escape args[:private_key].path}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Obtiene el hostname de la API de Sutty
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
def api_hostname
|
||||||
|
Rails.application.routes.default_url_options[:host].sub('panel', 'api')
|
||||||
|
end
|
||||||
|
|
||||||
|
# Crea los hooks en la Social Inbox para que nos avise de actividades
|
||||||
|
# nuevas
|
||||||
|
#
|
||||||
|
# @return [nil]
|
||||||
|
def create_hooks!
|
||||||
|
hook_client = site.social_inbox.hook
|
||||||
|
|
||||||
|
hook_client.class::EVENTS.each do |event|
|
||||||
|
event_url = :"v1_site_webhooks_social_inbox_#{event}_url"
|
||||||
|
|
||||||
|
webhook = DistributedPress::V1::Social::Schemas::Webhook.new.call({
|
||||||
|
method: 'POST',
|
||||||
|
url: Rails.application.routes.url_helpers.public_send(event_url, site_id: site.name, host: api_hostname),
|
||||||
|
headers: {
|
||||||
|
'X-Social-Inbox': rol.token
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
raise ArgumentError, webhook.errors.messages if webhook.failure?
|
||||||
|
|
||||||
|
response = hook_client.put(event: event, hook: webhook)
|
||||||
|
|
||||||
|
raise ArgumentError, response.parsed_body unless response.ok?
|
||||||
|
rescue ArgumentError => e
|
||||||
|
ExceptionNotifier.notify_exception(e, data: { site_id: site.name, usuarie_id: rol.usuarie_id })
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'distributed_press/v1/social/client'
|
require 'distributed_press/v1/social/client'
|
||||||
|
require 'distributed_press/v1/social/hook'
|
||||||
|
|
||||||
# Gestiona la Social Inbox de un sitio
|
# Gestiona la Social Inbox de un sitio
|
||||||
class SocialInbox
|
class SocialInbox
|
||||||
|
@ -34,6 +35,11 @@ class SocialInbox
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [DistributedPress::V1::Social::Hook]
|
||||||
|
def hook
|
||||||
|
@hook ||= DistributedPress::V1::Social::Hook.new(client: client, actor: actor)
|
||||||
|
end
|
||||||
|
|
||||||
# @return [String]
|
# @return [String]
|
||||||
def public_key_url
|
def public_key_url
|
||||||
@public_key_url ||= URI("https://#{hostname}").tap do |uri|
|
@public_key_url ||= URI("https://#{hostname}").tap do |uri|
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
|
|
||||||
require_relative 'boot'
|
require_relative 'boot'
|
||||||
|
|
||||||
|
require 'redis-client'
|
||||||
|
require 'hiredis-client'
|
||||||
|
require 'brs'
|
||||||
require 'rails'
|
require 'rails'
|
||||||
# Pick the frameworks you want:
|
# Pick the frameworks you want:
|
||||||
require 'active_model/railtie'
|
require 'active_model/railtie'
|
||||||
|
|
|
@ -20,6 +20,12 @@ Rails.application.routes.draw do
|
||||||
|
|
||||||
namespace :webhooks do
|
namespace :webhooks do
|
||||||
post :pull, to: 'webhooks#pull'
|
post :pull, to: 'webhooks#pull'
|
||||||
|
|
||||||
|
namespace :social_inbox do
|
||||||
|
post :moderationqueued, to: 'social_inbox#moderationqueued'
|
||||||
|
post :onapproved, to: 'social_inbox#onapproved'
|
||||||
|
post :onrejected, to: 'social_inbox#onrejected'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue