5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-26 18:16:21 +00:00
panel/app/controllers/posts_controller.rb

244 lines
36 KiB
Ruby
Raw Normal View History

2019-03-26 15:32:20 +00:00
# frozen_string_literal: true
2019-07-03 23:25:23 +00:00
# Controlador para artículos
2018-01-29 22:19:10 +00:00
class PostsController < ApplicationController
2019-07-03 23:25:23 +00:00
before_action :authenticate_usuarie!
before_action :service_for_direct_upload, only: %i[new edit]
2018-01-29 22:19:10 +00:00
# TODO: Traer los comunes desde ApplicationController
breadcrumb -> { current_usuarie.email }, :edit_usuarie_registration_path
breadcrumb 'sites.index', :sites_path, match: :exact
breadcrumb -> { site.title }, -> { site_posts_path(site, locale: locale) }, match: :exact
2020-05-23 15:38:03 +00:00
# Las URLs siempre llevan el idioma actual o el de le usuarie
def default_url_options
{ locale: locale }
2020-05-23 15:38:03 +00:00
end
2018-01-29 22:19:10 +00:00
def index
authorize Post
2020-05-23 15:38:03 +00:00
# XXX: Cada vez que cambiamos un Post tocamos el sitio con lo que es
# más simple saber si hubo cambios.
2021-10-21 16:25:05 +00:00
return unless stale?([current_usuarie, site, filter_params])
# Todos los artículos de este sitio para el idioma actual
@posts = site.indexed_posts.where(locale: locale)
@posts = @posts.page(filter_params.delete(:page)) if site.pagination
2021-10-21 16:25:05 +00:00
# De este tipo
@posts = @posts.where(layout: filter_params[:layout]) if filter_params[:layout]
# Que estén dentro de la categoría
@posts = @posts.in_category(filter_params[:category]) if filter_params[:category]
# Aplicar los parámetros de búsqueda
@posts = @posts.search(locale, filter_params[:q]) if filter_params[:q].present?
# A los que este usuarie tiene acceso
@posts = PostPolicy::Scope.new(current_usuarie, @posts).resolve
# Filtrar los posts que les invitades no pueden ver
@usuarie = site.usuarie? current_usuarie
2022-07-15 17:17:46 +00:00
@site_stat = SiteStat.new(site)
2018-01-29 22:19:10 +00:00
end
2018-01-30 15:20:19 +00:00
def show
authorize post
breadcrumb post.title.value, ''
fresh_when post
2018-01-30 15:20:19 +00:00
end
2018-01-31 20:29:27 +00:00
# Genera una previsualización del artículo.
def preview
authorize post
render html: post.render
end
def new
2018-09-28 17:15:09 +00:00
authorize Post
2021-10-21 16:44:34 +00:00
@post = site.posts(lang: locale).build(layout: params[:layout])
breadcrumb I18n.t('loaf.breadcrumbs.posts.new', layout: @post.layout.humanized_name.downcase), ''
end
def create
2018-09-28 17:15:09 +00:00
authorize Post
service = PostService.new(site: site,
2019-08-13 23:33:57 +00:00
usuarie: current_usuarie,
params: params)
@post = service.create
2018-12-14 15:12:17 +00:00
if @post.persisted?
site.touch
forget_content
redirect_to site_post_path(@site, @post)
else
render 'posts/new'
end
end
2018-01-31 20:29:27 +00:00
def edit
authorize post
breadcrumb post.title.value, site_post_path(site, post, locale: locale), match: :exact
breadcrumb 'posts.edit', ''
@moderation_queue = [
{"@context"=>
["https://www.w3.org/ns/activitystreams",
{"ostatus"=>"http://ostatus.org#",
"atomUri"=>"ostatus:atomUri",
"inReplyToAtomUri"=>"ostatus:inReplyToAtomUri",
"conversation"=>"ostatus:conversation",
"sensitive"=>"as:sensitive",
"toot"=>"http://joinmastodon.org/ns#",
"votersCount"=>"toot:votersCount",
"Hashtag"=>"as:Hashtag"}],
"id"=>"https://mastodon.mauve.moe/users/mauve/statuses/111462305634770041",
"type"=>"Note",
"summary"=>nil,
"inReplyTo"=>"https://mastodon.mauve.moe/users/mauve/statuses/111461923538534886",
"published"=>"2023-11-23T22:50:10Z",
"url"=>"https://mastodon.mauve.moe/@mauve/111462305634770041",
"attributedTo"=>"https://mastodon.mauve.moe/users/mauve",
"to"=>["https://www.w3.org/ns/activitystreams#Public"],
"cc"=>["https://mastodon.mauve.moe/users/mauve/followers", "https://hypha.coop/about.jsonld"],
"sensitive"=>false,
"atomUri"=>"https://mastodon.mauve.moe/users/mauve/statuses/111462305634770041",
"inReplyToAtomUri"=>"https://mastodon.mauve.moe/users/mauve/statuses/111461923538534886",
"conversation"=>"tag:mastodon.mauve.moe,2023-11-23:objectId=551471:objectType=Conversation",
"content"=>
"<p>Follow @HyphaCoop@hypha.coop for our announcement post on the 5th!</p><p><a href=\"https://mastodon.mauve.moe/tags/P2P\" class=\"mention hashtag\" rel=\"tag\">#<span>P2P</span></a> <a href=\"https://mastodon.mauve.moe/tags/ActivityPub\" class=\"mention hashtag\" rel=\"tag\">#<span>ActivityPub</span></a> <a href=\"https://mastodon.mauve.moe/tags/Fediverse\" class=\"mention hashtag\" rel=\"tag\">#<span>Fediverse</span></a></p>",
"contentMap"=>
{"en"=>
"<p>Follow @HyphaCoop@hypha.coop for our announcement post on the 5th!</p><p><a href=\"https://mastodon.mauve.moe/tags/P2P\" class=\"mention hashtag\" rel=\"tag\">#<span>P2P</span></a> <a href=\"https://mastodon.mauve.moe/tags/ActivityPub\" class=\"mention hashtag\" rel=\"tag\">#<span>ActivityPub</span></a> <a href=\"https://mastodon.mauve.moe/tags/Fediverse\" class=\"mention hashtag\" rel=\"tag\">#<span>Fediverse</span></a></p>"},
"attachment"=>[],
"tag"=>
[{"type"=>"Mention", "href"=>"https://hypha.coop/about.jsonld", "name"=>"@dripline@hypha.coop"},
{"type"=>"Hashtag", "href"=>"https://mastodon.mauve.moe/tags/p2p", "name"=>"#p2p"},
{"type"=>"Hashtag", "href"=>"https://mastodon.mauve.moe/tags/activitypub", "name"=>"#activitypub"},
{"type"=>"Hashtag", "href"=>"https://mastodon.mauve.moe/tags/fediverse", "name"=>"#fediverse"}],
"replies"=>
{"id"=>"https://mastodon.mauve.moe/users/mauve/statuses/111462305634770041/replies",
"type"=>"Collection",
"first"=>
{"type"=>"CollectionPage",
"next"=>"https://mastodon.mauve.moe/users/mauve/statuses/111462305634770041/replies?only_other_accounts=true&page=true",
"partOf"=>"https://mastodon.mauve.moe/users/mauve/statuses/111462305634770041/replies",
"items"=>[]}}},
{"@context"=>["https://www.w3.org/ns/activitystreams", {"@language"=>"es", "sensitive"=>"as:sensitive"}],
"type"=>"Note",
"id"=>"https://sutty.nl/lanzamiento-de-publicaciones-distribuidas-en-el-fediverso-a-trav%C3%A9s-de-sutty/",
"summary"=>"Lanzamiento de publicaciones distribuidas en el Fediverso a través de Sutty",
"published"=>"2023-12-04T21:53:05+00:00",
"updated"=>"2023-12-05T20:41:34+00:00",
"attributedTo"=>"https://sutty.nl/about.jsonld",
"to"=>["https://www.w3.org/ns/activitystreams#Public"],
"cc"=>["https://social.distributed.press/v1/@sutty@sutty.nl/followers"],
"inReplyTo"=>"https://hypha.coop/dripline/announcing-dp-social-inbox/",
"sensitive"=>true,
"content"=>
"<p style=\"text-align:start\">Estamos felices y orgulloses de anunciar el lanzamiento de la funcionalidad que permite la publicación en el Fediverso de los artículos de todos los sitios creados a través de Sutty.</p><p style=\"text-align:start\">Gracias al trabajo conjunto con <a href=\"https://distributed.press/\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Distributed Press</a>, <a href=\"https://hypha.coop/\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Hypha</a> y apoyado por la <a href=\"https://www.ffdweb.org/\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Filecoin Foundation for the Distributed Web</a>, Sutty hace posible que la seguridad de tu sitio estático se combine con la rápida difusión de tu contenido a través de las redes sociales libres y descentralizadas que constituyen el Fediverso.</p><p style=\"text-align:start\">Esto se logró a través del desarollo y la integración de dos componentes, trabajados en forma conjunta y colaborativa:</p><ol>\n<li><p style=\"text-align:start\"><a href=\"https://github.com/hyphacoop/social.distributed.press\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Social Inbox</a>, desarrollado principalmente Distributed Press. Aporta la funcionalidad de recibir artículos, responder y mencionar otras cuentas en el Fediverso.</p></li>\n<li><p style=\"text-align:start\"><a href=\"https://0xacab.org/sutty/jekyll/jekyll-activity-pub\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Jekyll Activity Pub Plugin</a>, desarrollado principalmente por Sutty. Permite integrar Social Inbox en todos los sitios estáticos generados en Jekyll, admitiendo así la publicación automática de contenido del sitio en el Fediverso.</p></li>\n</ol><p style=\"text-align:start\"><a href=\"https://sutty.nl\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Sutty</a> integra la funcionalidad completa en su CMS para sitios estáticos en Jekyll, permitiendo gestionarla desde una interfaz en continua mejora de su usabilidad.</p><p style=\"text-align:start\">Si todavía no estás familiarizade con estos nombres y conceptos, te invitamos a conocer más a continuación, en la sección “Para tecno-curioses”.</p><h3 style=\"text-align:start\" id=\"que-significa\">Qué significa</h3><ul>\n<li><p style=\"text-align:start\">Que si creás tu sitio web a través de Sutty, tenés nuevas posibilidades de difundir tus contenidos e interactuar en redes digitales.</p></li>\n<li><p style=\"text-align:start\">Que tus artículos pueden ser publicados en las redes del Fediverso.</p></li>\n<li><p style=\"text-align:start\">Que tu sitio tendrá un perfil o usuarie personalizable desde el panel en una instancia de Sutty propia.</p></li>\n<li><p style=\"text-align:start\">Que les usuaries del Fediverso pueden seguir tus publicaciones.</p></li>\n<li><p style=\"text-align:start\">Que les usuaries del Fediverso que te sigan podrán leer tus publicaciones, mencionarte y responderte.</p></li>\n<li><p style=\"text-align:start\">Que podrás interactuar con les usuaries del Fediverse con las opciones de responderles y mencionarles.</p></li>\n</ul><h3 style=\"text-align:start\" id=\"que-permite-hacer\">Qué permite hacer</h3><ul>\n<li><p style=\"text-align:start\">Activar la publicación en el Fediverso para todos los sitios de Sutty.</p></li>\n<li><p style=\"text-align:start\">Activar la publicación de los artículos que quieras en el Fediverso.</p></li>\n<li><p style=\"text-align:start\">Responder comentarios desde los artículos de tu sitio en Sutty.</p></li>\n<li><p style=\"text-align:start\">Personalizar la cuenta que Sutty crea automáticamente de tu sitio en el Fediverso.</p></li>\n<li><p style=\"text-align:start\">Reportar o informar de usuaries o instancias abusivos mediante nuestro <a href=\"https://sutty.nl/index.html#contacto\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\
"name"=>"Lanzamiento de publicaciones distribuidas en el Fediverso a través de Sutty",
"contentMap"=>
{"es"=>
"<p style=\"text-align:start\">Estamos felices y orgulloses de anunciar el lanzamiento de la funcionalidad que permite la publicación en el Fediverso de los artículos de todos los sitios creados a través de Sutty.</p><p style=\"text-align:start\">Gracias al trabajo conjunto con <a href=\"https://distributed.press/\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Distributed Press</a>, <a href=\"https://hypha.coop/\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Hypha</a> y apoyado por la <a href=\"https://www.ffdweb.org/\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Filecoin Foundation for the Distributed Web</a>, Sutty hace posible que la seguridad de tu sitio estático se combine con la rápida difusión de tu contenido a través de las redes sociales libres y descentralizadas que constituyen el Fediverso.</p><p style=\"text-align:start\">Esto se logró a través del desarollo y la integración de dos componentes, trabajados en forma conjunta y colaborativa:</p><ol>\n<li><p style=\"text-align:start\"><a href=\"https://github.com/hyphacoop/social.distributed.press\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Social Inbox</a>, desarrollado principalmente Distributed Press. Aporta la funcionalidad de recibir artículos, responder y mencionar otras cuentas en el Fediverso.</p></li>\n<li><p style=\"text-align:start\"><a href=\"https://0xacab.org/sutty/jekyll/jekyll-activity-pub\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Jekyll Activity Pub Plugin</a>, desarrollado principalmente por Sutty. Permite integrar Social Inbox en todos los sitios estáticos generados en Jekyll, admitiendo así la publicación automática de contenido del sitio en el Fediverso.</p></li>\n</ol><p style=\"text-align:start\"><a href=\"https://sutty.nl\" rel=\"noopener\" target=\"_blank\" referrerpolicy=\"strict-origin-when-cross-origin\">Sutty</a> integra la funcionalidad completa en su CMS para sitios estáticos en Jekyll, permitiendo gestionarla desde una interfaz en continua mejora de su usabilidad.</p><p style=\"text-align:start\">Si todavía no estás familiarizade con estos nombres y conceptos, te invitamos a conocer más a continuación, en la sección “Para tecno-curioses”.</p><h3 style=\"text-align:start\" id=\"que-significa\">Qué significa</h3><ul>\n<li><p style=\"text-align:start\">Que si creás tu sitio web a través de Sutty, tenés nuevas posibilidades de difundir tus contenidos e interactuar en redes digitales.</p></li>\n<li><p style=\"text-align:start\">Que tus artículos pueden ser publicados en las redes del Fediverso.</p></li>\n<li><p style=\"text-align:start\">Que tu sitio tendrá un perfil o usuarie personalizable desde el panel en una instancia de Sutty propia.</p></li>\n<li><p style=\"text-align:start\">Que les usuaries del Fediverso pueden seguir tus publicaciones.</p></li>\n<li><p style=\"text-align:start\">Que les usuaries del Fediverso que te sigan podrán leer tus publicaciones, mencionarte y responderte.</p></li>\n<li><p style=\"text-align:start\">Que podrás interactuar con les usuaries del Fediverse con las opciones de responderles y mencionarles.</p></li>\n</ul><h3 style=\"text-align:start\" id=\"que-permite-hacer\">Qué permite hacer</h3><ul>\n<li><p style=\"text-align:start\">Activar la publicación en el Fediverso para todos los sitios de Sutty.</p></li>\n<li><p style=\"text-align:start\">Activar la publicación de los artículos que quieras en el Fediverso.</p></li>\n<li><p style=\"text-align:start\">Responder comentarios desde los artículos de tu sitio en Sutty.</p></li>\n<li><p style=\"text-align:start\">Personalizar la cuenta que Sutty crea automáticamente de tu sitio en el Fediverso.</p></li>\n<li><p style=\"text-align:start\">Reportar o informar de usuaries o instancias abusivos mediante nuestro <a href=\"https://sutty.nl/index.html#contacto\" rel=\"noopener\" target=\"_blank\" referrerpolicy
"attachment"=>
[{"type"=>"Document",
"mediaType"=>"image/png",
"url"=>"https://sutty.nl/public/8r7b6ohqy6xzgngxbol6337q8jj9/milestone_2_activity_pub_2.png",
"name"=>"Botones de colores para activar la \"Web Disribuida\" y el \"Fediverso\"."}]}
]
2018-01-31 20:29:27 +00:00
end
def update
authorize post
2018-09-28 17:15:09 +00:00
service = PostService.new(site: site,
post: post,
2019-08-16 23:12:22 +00:00
usuarie: current_usuarie,
params: params)
2018-09-28 17:35:40 +00:00
2019-08-16 23:12:22 +00:00
if service.update.persisted?
site.touch
forget_content
redirect_to site_post_path(site, post)
2018-02-02 22:20:31 +00:00
else
render 'posts/edit'
end
2018-01-31 20:29:27 +00:00
end
2019-05-30 17:33:51 +00:00
# Eliminar artículos
def destroy
authorize post
2019-05-30 17:33:51 +00:00
service = PostService.new(site: site,
post: post,
2019-08-16 23:12:22 +00:00
usuarie: current_usuarie,
params: params)
2019-05-30 17:33:51 +00:00
2019-08-16 23:12:22 +00:00
# TODO: Notificar si se pudo o no
service.destroy
site.touch
redirect_to site_posts_path(site, locale: post.lang.value)
2019-05-30 17:33:51 +00:00
end
2019-10-18 20:35:09 +00:00
# Reordenar los artículos
def reorder
authorize site
2019-10-18 20:35:09 +00:00
service = PostService.new(site: site,
2019-10-18 20:35:09 +00:00
usuarie: current_usuarie,
params: params)
service.reorder
site.touch
2021-05-10 18:18:04 +00:00
redirect_to site_posts_path(site, locale: site.default_locale)
2019-10-18 20:35:09 +00:00
end
2020-03-19 18:31:29 +00:00
# Devuelve el idioma solicitado a través de un parámetro, validando
2020-05-23 15:38:03 +00:00
# que el sitio soporte ese idioma, de lo contrario devuelve el idioma
# actual.
#
# TODO: Debería devolver un error o mostrar una página donde se
# solicite a le usuarie crear el nuevo idioma y que esto lo agregue al
# _config.yml del sitio en lugar de mezclar idiomas.
def locale
@locale ||= site&.locales&.find(-> { site&.default_locale }) do |l|
l.to_s == params[:locale]
2020-05-23 15:38:03 +00:00
end
2020-03-19 18:31:29 +00:00
end
# Instruye al editor a olvidarse el contenido del artículo. Usar
# cuando hayamos guardado la información correctamente.
def forget_content
flash[:js] = { target: 'editor', action: 'forget-content', keys: (params[:storage_keys] || []).to_json }
end
private
# Los parámetros de filtros que vamos a mantener en todas las URLs,
# solo los que no estén vacíos.
#
# @return [Hash]
def filter_params
@filter_params ||= params.permit(:q, :category, :layout, :page).to_hash.select do |_, v|
v.present?
end.transform_keys(&:to_sym)
end
def post
@post ||= site.posts(lang: locale).find(params[:post_id] || params[:id])
end
# Recuerda el nombre del servicio de subida de archivos
def service_for_direct_upload
session[:service_name] = site.name.to_sym
end
2018-01-29 22:19:10 +00:00
end