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

241 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 = [
2024-01-12 20:44:49 +00:00
{ '@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\" referrerpo
'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\" referrer
'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