5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-26 08:56:22 +00:00
panel/app/services/site_service.rb

253 lines
6.7 KiB
Ruby
Raw Normal View History

2019-08-09 19:49:25 +00:00
# frozen_string_literal: true
# Se encargar de guardar cambios en sitios
# TODO: Implementar rollback en la configuración
SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do
def deploy
site.enqueue!
2023-04-10 20:33:07 +00:00
DeployJob.perform_later site.id
end
2019-08-09 19:49:25 +00:00
# Crea un sitio, agrega un rol nuevo y guarda los cambios a la
# configuración en el repositorio git
def create
self.site = Site.new params
add_role temporal: false, rol: 'usuarie'
site.deploys.build type: 'DeployLocal'
# Los sitios de testing no se sincronizan
sync_nodes unless site.name.end_with? '.testing'
2019-08-09 19:49:25 +00:00
I18n.with_locale(usuarie.lang.to_sym || I18n.default_locale) do
# No se puede llamar a site.config antes de save porque el sitio
# todavía no existe.
#
# TODO: hacer que el repositorio se cree cuando es necesario, para
# que no haya estados intermedios.
site.locales = [usuarie.lang] + I18n.available_locales
2019-08-09 19:49:25 +00:00
site.save &&
site.config.write &&
commit_config(action: :create) &&
site.reset.nil? &&
add_licencias &&
2023-03-23 00:01:29 +00:00
add_code_of_conduct &&
add_privacy_policy &&
deploy
2019-08-09 19:49:25 +00:00
end
site
end
# Actualiza el sitio y guarda los cambios en la configuración
def update
I18n.with_locale(usuarie&.lang&.to_sym || I18n.default_locale) do
2019-08-29 17:54:19 +00:00
site.update(params) &&
2019-08-09 19:49:25 +00:00
site.config.write &&
commit_config(action: :update) &&
site.reset.nil? &&
change_licencias
2019-08-09 19:49:25 +00:00
end
site
end
# Genera los Deploy necesarios para el sitio a menos que ya los tenga.
2019-10-01 19:41:33 +00:00
def build_deploys
Deploy.subclasses.each do |deploy|
next if site.deploys.find_by type: deploy.name
2019-10-01 19:41:33 +00:00
site.deploys.build type: deploy
end
end
2020-07-18 19:26:54 +00:00
# Agregar una dirección oculta de Tor al DeployHiddenService y a la
# configuración del Site.
def add_onion
onion = params[:onion]
deploy = params[:deploy]
2020-07-18 19:26:54 +00:00
return false unless !onion.blank? && deploy
site.config['onion-location'] = onion
site.config.write
commit_config(action: :tor)
end
2021-05-31 16:23:40 +00:00
# Trae cambios desde la rama remota y reindexa los artículos.
#
# @return [Boolean]
def merge
result = site.repository.merge(usuarie)
# TODO: Implementar callbacks
site.try(:index_posts!) if result
result.present?
end
2023-10-05 20:13:47 +00:00
def rename(name)
2023-11-21 15:45:20 +00:00
return if name == site.name
2023-11-14 15:05:19 +00:00
moved = false
site.name = name
2023-10-05 20:13:47 +00:00
Site.transaction do
2023-11-21 15:45:20 +00:00
raise ActiveRecord::Rollback if site.path
FileUtils.mv (site.path_was, site.path)
2023-10-05 20:13:47 +00:00
ActiveStorage::Blob.where(service_name: site.name_was).update_all(service_name: site.name)
site.save
moved = true
rescue StandardError
FileUtils.mv (site.path, site.path_was) if moved
raise
2023-10-05 20:13:47 +00:00
end
end
2023-10-05 20:19:41 +00:00
2019-08-09 19:49:25 +00:00
private
# Guarda los cambios de la configuración en el repositorio git
def commit_config(action:)
site.repository
.commit(usuarie: usuarie,
add: [site.config.path],
2019-08-09 19:49:25 +00:00
message: I18n.t("site_service.#{action}",
name: site.name))
GitPushJob.perform_later(site)
2019-08-09 19:49:25 +00:00
end
def add_role(temporal: true, rol: 'invitade')
site.roles << Rol.new(site: site, usuarie: usuarie,
temporal: temporal, rol: rol)
end
2020-05-12 13:11:59 +00:00
# Crea la licencia del sitio para cada locale disponible en el sitio
#
# @return [Boolean]
def add_licencias
return true unless site.layout? :license
return true if site.licencia.custom?
2020-05-23 15:38:03 +00:00
with_all_locales do |locale|
add_licencia lang: locale
end.compact.map(&:valid?).all?
end
# Crea una licencia
#
# @return [Post]
def add_licencia(lang:)
params = ActionController::Parameters.new(
post: {
2023-03-22 21:39:56 +00:00
layout: 'license',
slug: Jekyll::Utils.slugify(I18n.t('activerecord.models.licencia')),
lang: lang,
title: site.licencia.name,
description: site.licencia.short_description,
content: CommonMarker.render_html(site.licencia.deed)
}
)
PostService.new(site: site, usuarie: usuarie, params: params).create
end
# Encuentra la licencia a partir de su enlace permanente y le cambia
# el contenido
#
# @return [Boolean]
def change_licencias
return true unless site.layout? :license
return true if site.licencia.custom?
with_all_locales do |locale|
post = site.posts(lang: locale).find_by(layout: 'license')
change_licencia(post: post) if post
end.compact.map(&:valid?).all?
end
# Cambia una licencia
#
# @param :post [Post]
# @return [Post]
def change_licencia(post:)
params = ActionController::Parameters.new(
post: {
title: site.licencia.name,
description: site.licencia.short_description,
content: CommonMarker.render_html(site.licencia.deed)
}
)
PostService.new(site: site, usuarie: usuarie, post: post,
params: params).update
end
# Agrega un código de conducta
#
# @return [Boolean]
def add_code_of_conduct
return true unless site.layout?(:code_of_conduct) || site.layout?(:page)
# TODO: soportar más códigos de conducta
coc = CodeOfConduct.first
with_all_locales do |locale|
params = ActionController::Parameters.new(
post: {
layout: site.layout?(:code_of_conduct) ? 'code_of_conduct' : 'page',
lang: locale.to_s,
title: coc.title,
description: coc.description,
content: CommonMarker.render_html(coc.content)
}
)
PostService.new(site: site, usuarie: usuarie, params: params).create
end.compact.map(&:valid?).all?
end
2023-03-23 00:01:29 +00:00
# Agrega política de privacidad
#
# @return [Boolean]
def add_privacy_policy
return true unless site.layout?(:privacy_policy) || site.layout?(:page)
pp = PrivacyPolicy.first
with_all_locales do |locale|
params = ActionController::Parameters.new(
post: {
layout: site.layout?(:privacy_policy) ? 'privacy_policy' : 'page',
lang: locale.to_s,
title: pp.title,
description: pp.description,
content: CommonMarker.render_html(pp.content)
}
)
PostService.new(site: site, usuarie: usuarie, params: params).create
end.compact.map(&:valid?).all?
end
# Crea los deploys necesarios para sincronizar a otros nodos de Sutty
def sync_nodes
Rails.application.nodes.each do |node|
2023-04-24 17:41:45 +00:00
site.deploys.build(type: 'DeployFullRsync', destination: "rsync://rsyncd.#{node}/deploys/", hostname: node)
end
end
private
def with_all_locales(&block)
site.locales.map do |locale|
next unless I18n.available_locales.include? locale
Mobility.with_locale(locale) do
yield locale
end
end
end
2019-08-09 19:49:25 +00:00
end