5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-05-19 10:30:49 +00:00
panel/app/models/social_inbox.rb
2024-05-02 16:05:35 -03:00

109 lines
2.8 KiB
Ruby

# frozen_string_literal: true
require 'distributed_press/v1/social/client'
require 'distributed_press/v1/social/allowlist'
require 'distributed_press/v1/social/blocklist'
require 'distributed_press/v1/social/hook'
require 'distributed_press/v1/social/inbox'
require 'distributed_press/v1/social/dereferencer'
require 'httparty/cache/store/redis'
# Gestiona la Social Inbox de un sitio
class SocialInbox
# @return [Site]
attr_reader :site
# @param :site [Site]
def initialize(site:)
@site = site
end
# @return [String]
def actor
@actor ||=
begin
user = site.config.dig('activity_pub', 'username')
user ||= hostname.split('.', 2).first
"@#{user}@#{hostname}"
end
end
def actor_id
@actor_id ||= SocialInbox.generate_uri(hostname) do |uri|
uri.path = '/about.jsonld'
end
end
# @return [DistributedPress::V1::Social::Client]
def client
@client ||= client_for site.config.dig('activity_pub', 'url')
end
# Permite enviar mensajes directo a otro servidor
#
# @param url [String]
# @return [DistributedPress::V1::Social::Client]
def client_for(url)
raise 'Falló generar un cliente' if url.blank?
@client_for ||= {}
@client_for[url] ||=
DistributedPress::V1::Social::Client.new(
url: url,
public_key_url: public_key_url,
private_key_pem: site.private_key_pem,
logger: Rails.logger,
cache_store: HTTParty::Cache::Store::Redis.new(redis_url: ENV.fetch('REDIS_SERVER', nil))
)
end
# @return [DistributedPress::V1::Social::Inbox]
def inbox
@inbox ||= DistributedPress::V1::Social::Inbox.new(client: client, actor: actor)
end
# @return [DistributedPress::V1::Social::Dereferencer]
def dereferencer
@dereferencer ||= DistributedPress::V1::Social::Dereferencer.new(client: client)
end
# @return [DistributedPress::V1::Social::Hook]
def hook
@hook ||= DistributedPress::V1::Social::Hook.new(client: client, actor: actor)
end
# @return [DistributedPress::V1::Social::Allowlist]
def allowlist
@allowlist ||= DistributedPress::V1::Social::Allowlist.new(client: client, actor: actor)
end
# @return [DistributedPress::V1::Social::Blocklist]
def blocklist
@blocklist ||= DistributedPress::V1::Social::Blocklist.new(client: client, actor: actor)
end
# @return [String]
def public_key_url
@public_key_url ||= SocialInbox.generate_uri(hostname) do |uri|
uri.path = '/about.jsonld'
uri.fragment = 'main-key'
end
end
# El hostname puede estar en varios lados...
#
# @return [String]
def hostname
@hostname ||=
site.config.dig('activity_pub', 'hostname') || site.config['hostname'] || site.hostname
end
# Genera una URI dentro de este sitio
#
# @return [String]
def self.generate_uri(hostname, &block)
URI("https://#{hostname}").tap(&block).to_s
end
end