mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-17 07:56:24 +00:00
feat: relacionar sitios con fediblocks
This commit is contained in:
parent
8654228edc
commit
ebdd95151e
4 changed files with 147 additions and 1 deletions
72
app/models/fediblock_state.rb
Normal file
72
app/models/fediblock_state.rb
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Relación entre Fediblocks y Sites
|
||||||
|
class FediblockState < ApplicationRecord
|
||||||
|
include AASM
|
||||||
|
|
||||||
|
belongs_to :site
|
||||||
|
belongs_to :fediblock, class_name: 'ActivityPub::Fediblock'
|
||||||
|
|
||||||
|
# El efecto secundario de esta máquina de estados es modificar el
|
||||||
|
# estado de moderación de cada instancia en el sitio. Nos salteamos
|
||||||
|
# los hooks de los eventos individuales.
|
||||||
|
aasm do
|
||||||
|
# Aunque queramos las listas habilitadas por defecto, tenemos que
|
||||||
|
# habilitarlas luego de crearlas para poder generar la lista de
|
||||||
|
# bloqueo en la Social Inbox.
|
||||||
|
state :disabled, initial: true
|
||||||
|
state :enabled
|
||||||
|
|
||||||
|
event :enable do
|
||||||
|
transitions from: :disabled, to: :enabled
|
||||||
|
|
||||||
|
before do
|
||||||
|
enable_remotely!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Al deshabilitar, las listas pasan a modo pausa.
|
||||||
|
#
|
||||||
|
# @todo No cambiar el estado si se habían habilitado manualmente,
|
||||||
|
# pero esto implica que tenemos que encontrar las que sí y quitarlas
|
||||||
|
# de list_names
|
||||||
|
event :disable do
|
||||||
|
transitions from: :enabled, to: :disabled
|
||||||
|
|
||||||
|
before do
|
||||||
|
disable_remotely!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Obtiene todos los IDs de instancias para poder obtener el estado de
|
||||||
|
# moderación en el sitio.
|
||||||
|
#
|
||||||
|
# @return [Array<String>]
|
||||||
|
def instance_ids
|
||||||
|
ActivityPub::Instance.where(hostname: fediblock.instances).pluck(:id)
|
||||||
|
end
|
||||||
|
|
||||||
|
# @return [Array<String>]
|
||||||
|
def list_names
|
||||||
|
@list_names ||= fediblock.instances.map do |instance|
|
||||||
|
"@*@#{instance}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Al deshabilitar, las instancias pasan a ser analizadas caso por caso
|
||||||
|
def disable_remotely!
|
||||||
|
raise AASM::InvalidTransition unless
|
||||||
|
site.social_inbox.blocklist.delete(list: list_names).ok? &&
|
||||||
|
site.social_inbox.allowlist.delete(list: list_names).ok?
|
||||||
|
end
|
||||||
|
|
||||||
|
# Al habilitar, se bloquean todas las instancias de la lista
|
||||||
|
def enable_remotely!
|
||||||
|
raise AASM::InvalidTransition unless
|
||||||
|
site.social_inbox.blocklist.post(list: list_names).ok? &&
|
||||||
|
site.social_inbox.allowlist.delete(list: list_names).ok?
|
||||||
|
end
|
||||||
|
end
|
|
@ -12,6 +12,7 @@ class Site
|
||||||
|
|
||||||
has_many :activity_pubs
|
has_many :activity_pubs
|
||||||
has_many :instance_moderations
|
has_many :instance_moderations
|
||||||
|
has_many :fediblock_states
|
||||||
|
|
||||||
before_save :generate_private_key_pem!, unless: :private_key_pem?
|
before_save :generate_private_key_pem!, unless: :private_key_pem?
|
||||||
|
|
||||||
|
|
29
db/migrate/20240227142019_create_fediblock_states.rb
Normal file
29
db/migrate/20240227142019_create_fediblock_states.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# La relación entre sitios y fediblocks
|
||||||
|
class CreateFediblockStates < ActiveRecord::Migration[6.1]
|
||||||
|
def up
|
||||||
|
create_table :fediblock_states, id: :uuid do |t|
|
||||||
|
t.timestamps
|
||||||
|
|
||||||
|
t.belongs_to :site
|
||||||
|
t.uuid :fediblock_id, index: true
|
||||||
|
t.string :aasm_state
|
||||||
|
|
||||||
|
t.index %i[site_id fediblock_id], unique: true
|
||||||
|
end
|
||||||
|
|
||||||
|
# Todas las listas están activas por defecto
|
||||||
|
DeploySocialDistributedPress.find_each do |deploy|
|
||||||
|
ActivityPub::Fediblock.find_each do |fediblock|
|
||||||
|
FediblockState.create(site: deploy.site, fediblock: fediblock, aasm_state: 'disabled').tap do |f|
|
||||||
|
f.enable!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
drop_table :fediblock_states
|
||||||
|
end
|
||||||
|
end
|
|
@ -944,6 +944,20 @@ CREATE SEQUENCE public.distributed_press_publishers_id_seq
|
||||||
ALTER SEQUENCE public.distributed_press_publishers_id_seq OWNED BY public.distributed_press_publishers.id;
|
ALTER SEQUENCE public.distributed_press_publishers_id_seq OWNED BY public.distributed_press_publishers.id;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: fediblock_states; Type: TABLE; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE public.fediblock_states (
|
||||||
|
id uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||||
|
created_at timestamp(6) without time zone NOT NULL,
|
||||||
|
updated_at timestamp(6) without time zone NOT NULL,
|
||||||
|
site_id bigint,
|
||||||
|
fediblock_id uuid,
|
||||||
|
aasm_state character varying
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: indexed_posts; Type: TABLE; Schema: public; Owner: -
|
-- Name: indexed_posts; Type: TABLE; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -1830,6 +1844,14 @@ ALTER TABLE ONLY public.distributed_press_publishers
|
||||||
ADD CONSTRAINT distributed_press_publishers_pkey PRIMARY KEY (id);
|
ADD CONSTRAINT distributed_press_publishers_pkey PRIMARY KEY (id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: fediblock_states fediblock_states_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY public.fediblock_states
|
||||||
|
ADD CONSTRAINT fediblock_states_pkey PRIMARY KEY (id);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: indexed_posts indexed_posts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
-- Name: indexed_posts indexed_posts_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -2176,6 +2198,27 @@ CREATE UNIQUE INDEX index_designs_on_gem ON public.designs USING btree (gem);
|
||||||
CREATE UNIQUE INDEX index_designs_on_name ON public.designs USING btree (name);
|
CREATE UNIQUE INDEX index_designs_on_name ON public.designs USING btree (name);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: index_fediblock_states_on_fediblock_id; Type: INDEX; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE INDEX index_fediblock_states_on_fediblock_id ON public.fediblock_states USING btree (fediblock_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: index_fediblock_states_on_site_id; Type: INDEX; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE INDEX index_fediblock_states_on_site_id ON public.fediblock_states USING btree (site_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: index_fediblock_states_on_site_id_and_fediblock_id; Type: INDEX; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX index_fediblock_states_on_site_id_and_fediblock_id ON public.fediblock_states USING btree (site_id, fediblock_id);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: index_indexed_posts_on_front_matter; Type: INDEX; Schema: public; Owner: -
|
-- Name: index_indexed_posts_on_front_matter; Type: INDEX; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -2571,6 +2614,7 @@ INSERT INTO "schema_migrations" (version) VALUES
|
||||||
('20240223170317'),
|
('20240223170317'),
|
||||||
('20240226133022'),
|
('20240226133022'),
|
||||||
('20240226134335'),
|
('20240226134335'),
|
||||||
('20240227134845');
|
('20240227134845'),
|
||||||
|
('20240227142019');
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue