sutty/app/services/post_service.rb

134 lines
3.5 KiB
Ruby
Raw Normal View History

2019-08-13 23:33:57 +00:00
# frozen_string_literal: true
# Este servicio se encarga de crear artículos y guardarlos en git,
# asignándoselos a une usuarie
# rubocop:disable Metrics/BlockLength
2019-08-13 23:33:57 +00:00
PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
# Crea un artículo nuevo
#
# @return Post
def create
2020-05-23 15:38:03 +00:00
self.post = site.posts(lang: locale)
.build(layout: layout)
post.usuaries << usuarie
params[:post][:draft] = true if site.invitade? usuarie
commit(action: :created, file: update_related_posts) if post.update(post_params)
# Devolver el post aunque no se haya salvado para poder rescatar los
# errores
post
end
2020-06-16 22:10:54 +00:00
# Crear un post anónimo, con opciones más limitadas. No usamos post.
2020-02-18 16:45:08 +00:00
def create_anonymous
# XXX: Confiamos en el parámetro de idioma porque estamos
# verificándolos en Site#posts
2020-05-23 15:38:03 +00:00
self.post = site.posts(lang: locale)
.build(layout: layout)
2020-02-18 16:45:08 +00:00
# Los artículos anónimos siempre son borradores
2020-06-16 22:10:54 +00:00
params[:draft] = true
2020-02-18 16:45:08 +00:00
commit(action: :created) if post.update(anon_post_params)
post
end
def update
post.usuaries << usuarie
params[:post][:draft] = true if site.invitade? usuarie
commit(action: :updated, file: update_related_posts) if post.update(post_params)
2019-08-13 23:33:57 +00:00
# Devolver el post aunque no se haya salvado para poder rescatar los
# errores
post
end
2019-08-16 23:12:22 +00:00
def destroy
post.destroy!
commit(action: :destroyed) if post.destroyed?
2019-08-16 23:12:22 +00:00
post
end
2019-11-06 22:35:48 +00:00
# Reordena todos los posts que soporten orden de acuerdo a un hash de
2020-01-02 23:29:04 +00:00
# uuids y nuevas posiciones. La posición actual la da la posición en
2019-10-18 20:35:09 +00:00
# el array.
#
2020-01-02 23:29:04 +00:00
# { uuid => 2, uuid => 1, uuid => 0 }
2019-10-18 20:35:09 +00:00
def reorder
2020-05-23 15:38:03 +00:00
posts = site.posts(lang: locale)
2019-11-06 22:35:48 +00:00
reorder = params.require(:post).permit(reorder: {}).try(:[], :reorder)
modified = PostRelation.new(site: site)
2019-10-18 20:35:09 +00:00
2020-01-02 23:29:04 +00:00
files = reorder.keys.map do |uuid|
post = posts.find(uuid, uuid: true)
order = reorder[uuid].to_i
2020-02-14 15:11:55 +00:00
next unless post
2019-10-18 20:35:09 +00:00
next unless post.attributes.include? :order
next if post.order.value == order
2019-10-18 20:35:09 +00:00
modified << post
post.order.value = order
2019-10-18 20:35:09 +00:00
post.path.absolute
end.compact
# TODO: Implementar transacciones!
modified.save_all(validate: false) &&
commit(action: :reorder, file: files)
2019-10-18 20:35:09 +00:00
end
2019-08-13 23:33:57 +00:00
private
2019-10-18 20:35:09 +00:00
def commit(action:, file: nil)
site.repository.commit(file: file || post.path.absolute,
usuarie: usuarie,
2019-08-16 23:12:22 +00:00
remove: action == :destroyed,
message: I18n.t("post_service.#{action}",
2019-10-18 20:35:09 +00:00
title: post.try(:title).try(:value)))
end
2019-08-13 23:33:57 +00:00
# Solo permitir cambiar estos atributos de cada articulo
def post_params
params.require(:post).permit(post.params)
end
2019-10-18 20:35:09 +00:00
2020-02-18 16:45:08 +00:00
# Eliminar metadatos internos
def anon_post_params
2020-05-23 15:38:03 +00:00
params.permit(post.params).delete_if do |k, _|
2020-02-18 16:45:08 +00:00
%w[date slug order uuid].include? k
end
end
2020-05-23 15:38:03 +00:00
def locale
params.dig(:post, :lang) || I18n.locale
2020-03-19 18:31:29 +00:00
end
def layout
params.dig(:post, :layout) || params[:layout]
2019-10-18 20:35:09 +00:00
end
# Actualiza los artículos relacionados según los métodos que los
# metadatos declaren.
#
# @return [Array] Lista de archivos modificados
def update_related_posts
files = [post.path.absolute]
post.attributes.each do |a|
MetadataTemplate::RELATED_METHODS.each do |m|
next unless post[a].respond_to? m
p = post[a].public_send(m)
files << p.path.absolute if p.save(validate: false)
end
end
files
end
2019-08-13 23:33:57 +00:00
end
# rubocop:enable Metrics/BlockLength