From 5370a542ff52be582e927262ed57c8ffce8da42a Mon Sep 17 00:00:00 2001 From: f Date: Wed, 28 Feb 2024 19:10:37 -0300 Subject: [PATCH] feat: cambiar el estado de les actores desde el panel --- .../actor_moderations_controller.rb | 20 +++++++++++++++++++ .../moderation_queue_controller.rb | 2 +- app/models/actor_moderation.rb | 6 +++++- app/policies/actor_moderation_policy.rb | 16 +++++++++++++++ app/views/components/_profiles_btn_box.haml | 10 ++++++---- app/views/moderation_queue/_account.haml | 7 ++++--- config/locales/en.yml | 6 +++--- config/locales/es.yml | 6 +++--- 8 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 app/controllers/actor_moderations_controller.rb create mode 100644 app/policies/actor_moderation_policy.rb diff --git a/app/controllers/actor_moderations_controller.rb b/app/controllers/actor_moderations_controller.rb new file mode 100644 index 00000000..543ca74d --- /dev/null +++ b/app/controllers/actor_moderations_controller.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +# Gestiona la cola de moderación de actores +class ActorModerationsController < ApplicationController + ActorModeration.aasm.events.map(&:name).each do |actor_event| + define_method(actor_event) do + authorize actor_moderation + + actor_moderation.public_send(:"#{actor_event}!") if actor_moderation.public_send(:"may_#{actor_event}?") + + redirect_back fallback_location: site_moderation_queue_path(**(session[:moderation_queue_filters] || {})) + end + end + + private + + def actor_moderation + @actor_moderation ||= site.actor_moderations.find(params[:actor_moderation_id]) + end +end diff --git a/app/controllers/moderation_queue_controller.rb b/app/controllers/moderation_queue_controller.rb index a9611a1b..df36dfbe 100644 --- a/app/controllers/moderation_queue_controller.rb +++ b/app/controllers/moderation_queue_controller.rb @@ -6,7 +6,7 @@ class ModerationQueueController < ApplicationController def index dummy_data - session[:moderation_queue_filtered_by_state] = params[:state] + session[:moderation_queue_filters] = params.permit(:state, :actor_state) # @todo cambiar el estado por query @activity_pubs = site.activity_pubs diff --git a/app/models/actor_moderation.rb b/app/models/actor_moderation.rb index efbde33b..f186dd69 100644 --- a/app/models/actor_moderation.rb +++ b/app/models/actor_moderation.rb @@ -7,6 +7,10 @@ class ActorModeration < ApplicationRecord belongs_to :site belongs_to :actor, class_name: 'ActivityPub::Actor' + def self.events + aasm.events.map(&:name) + end + aasm do state :paused, initial: true state :allowed @@ -37,7 +41,7 @@ class ActorModeration < ApplicationRecord end end - event :reported do + event :report do transitions from: %i[blocked], to: :reported end end diff --git a/app/policies/actor_moderation_policy.rb b/app/policies/actor_moderation_policy.rb new file mode 100644 index 00000000..07a9a752 --- /dev/null +++ b/app/policies/actor_moderation_policy.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +# Solo les usuaries pueden moderar actores +ActorModerationPolicy = Struct.new(:usuarie, :actor_moderation) do + ActorModeration.events.each do |actor_event| + define_method(:"#{actor_event}?") do + actor_moderation.site.usuarie? usuarie + end + end + + # En este paso tenemos varias cuentas por moderar pero todas son + # del mismo sitio. + def action_on_several? + actor_moderation.first.site.usuarie? usuarie + end +end diff --git a/app/views/components/_profiles_btn_box.haml b/app/views/components/_profiles_btn_box.haml index 06faa8a1..bc1fd7e4 100644 --- a/app/views/components/_profiles_btn_box.haml +++ b/app/views/components/_profiles_btn_box.haml @@ -1,7 +1,9 @@ -# Componente Botonera de Moderación de Cuentas (Remote_profile) - btn_class = 'btn-secondary' -= render 'components/btn_base', text: t('.text_approve'), class: btn_class, href: '' -= render 'components/btn_base', text: t('.text_check'), class: btn_class, href: '' -= render 'components/btn_base', text: t('.text_deny'), class: btn_class, href: '' -= render 'components/btn_base', text: t('.text_report'), class: btn_class, href: '' \ No newline at end of file +- ActorModeration.events.each do |actor_event| + = render 'components/btn_base', + text: t(".text_#{actor_event}"), + path: public_send(:"site_actor_moderation_#{actor_event}_path", actor_moderation_id: actor_moderation), + class: btn_class, + disabled: !actor_moderation.public_send(:"may_#{actor_event}?") diff --git a/app/views/moderation_queue/_account.haml b/app/views/moderation_queue/_account.haml index 27ea30d1..24fbb270 100644 --- a/app/views/moderation_queue/_account.haml +++ b/app/views/moderation_queue/_account.haml @@ -3,9 +3,10 @@ = render 'components/checkbox', id: profile['id'], name: 'actor[]', value: profile['id'], data: { target: 'select-all.input' } .col-11 %h4 - %a{href: profile['id']}= profile['preferredUsername'] - =profile['summary'].html_safe + %a{href: profile['id']}= sanitize profile['name'] + .mb-3 + = sanitize profile['summary'].html_safe -# Botones de Moderación .d-flex.pb-4 - = render 'components/profiles_btn_box' + = render 'components/profiles_btn_box', actor_moderation: actor_moderation diff --git a/config/locales/en.yml b/config/locales/en.yml index c4bff0a9..3c8e8851 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -102,9 +102,9 @@ en: text_allow: Allow everything text_deny: Block instance profiles_btn_box: - text_approve: Always approve - text_check: Always check - text_deny: Block + text_pause: Always check + text_allow: Always approve + text_block: Block text_report: Report moderation_queue: everything: 'Select all' diff --git a/config/locales/es.yml b/config/locales/es.yml index 9409eddd..d2c30ef6 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -102,9 +102,9 @@ es: text_allow: Permitir todo text_deny: Bloquear instancia profiles_btn_box: - text_approve: Aprobar siempre - text_check: Revisar siempre - text_deny: Bloquear + text_pause: Revisar siempre + text_allow: Aprobar siempre + text_block: Bloquear text_report: Reportar moderation_queue: everything: 'Seleccionar todo'