# frozen_string_literal: true # Controlador para artículos class PostsController < ApplicationController before_action :authenticate_usuarie! before_action :service_for_direct_upload, only: %i[new edit] # 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 # Las URLs siempre llevan el idioma actual o el de le usuarie def default_url_options { locale: locale } end def index authorize Post # XXX: Cada vez que cambiamos un Post tocamos el sitio con lo que es # más simple saber si hubo cambios. 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 # 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 @site_stat = SiteStat.new(site) end def show authorize post breadcrumb post.title.value, '' fresh_when post end # Genera una previsualización del artículo. def preview authorize post render html: post.render end def new authorize Post @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 authorize Post service = PostService.new(site: site, usuarie: current_usuarie, params: params) @post = service.create if @post.persisted? site.touch forget_content redirect_to site_post_path(@site, @post) else render 'posts/new' end end 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' => '

Follow @HyphaCoop@hypha.coop for our announcement post on the 5th!

', 'contentMap' => { 'en' => '

Follow @HyphaCoop@hypha.coop for our announcement post on the 5th!

' }, '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' => "

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.

Gracias al trabajo conjunto con Distributed Press, Hypha y apoyado por la Filecoin Foundation for the Distributed Web, 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.

Esto se logró a través del desarollo y la integración de dos componentes, trabajados en forma conjunta y colaborativa:

    \n
  1. Social Inbox, desarrollado principalmente Distributed Press. Aporta la funcionalidad de recibir artículos, responder y mencionar otras cuentas en el Fediverso.

  2. \n
  3. Jekyll Activity Pub Plugin, 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.

  4. \n

Sutty integra la funcionalidad completa en su CMS para sitios estáticos en Jekyll, permitiendo gestionarla desde una interfaz en continua mejora de su usabilidad.

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”.

Qué significa

Qué permite hacer

Qué se viene

¡Quiero usarlo!

Te invitamos a dar tus primeros pasos de la mano de nuestro tutorial.

Para tecno-curioses

Cómo funciona

Los sitios web y las redes sociales parecen ser especies distintas dentro del Universo de Internet. Al mismo tiempo, las redes sociales corporativas y concentradas como Instagram, Facebook, X (ex Twitter), entre otras, demostraron ser hostiles con algunos grupos o colectivos sociales en particular (censurando contenido, persiguiendo pezones, ocultando publicaciones por color de piel y de pelo, etc.) y con todes sus usuaries en general (vendiendo data en forma masiva, violando acuerdos de privacidad, eligiendo diseños de interfaz y uso que generan ansiedad y adicción, etc.). Pese a esto, siguen funcionando como espacios obligados a la hora de publicitar un emprendimiento o difundir noticias urgentes.

El Fediverso es una red federada, descentralizada y distribuida de redes sociales libres, cada una con sus características, preferencias, grupos de usuaries. Están diseñadas para facilitar el diálogo entre todas ellas. Es decir, para que los contenidos puedan ser visibles y se puedan generar respuestas entre usuaries, fomentando una cultura de participación y pluralidad de voces, basadas en estándares de desarrollo libre y que buscan ser éticos antes que con fines de lucro sin fin.

Los sitios web siguen siendo formatos para medios de comunicación que, debido a sus características, favorecen la difusión de contenidos como artículos multimedia. Permiten adecuar un estilo a una identidad visual del medio, mantener secciones y contenido institucional variado, entre otras cosas.

Las redes sociales se destacan por sus características de inmediatez, favoreciendo un flujo dialógico en tiempo real con otros tiempos de atención y características de navegación que lo hacen más breve, rápido, a veces efímero. Los medios de comunicación (personas o emprendimientos mediáticos) suelen utilizarlos para llamar la atención sobre contenidos publicados en sus sitios, apostando a la divulgación rápida y las discusiones que puedan darse entre usuaries.

La funcionalidad que desarrollamos en Sutty contempla los casos de uso en los que un contenido quiera ser compartido a más personas, en menor tiempo, con la posibilidad de generar diálogos. Las particularidades de nuestros sitios y redes sociales libres generan condiciones favorables para la libertad de expresión, que preferimos llamar Derecho a la Comunicación, evadiendo las variadas y cada vez más sofisticadas formas de censura de las plataformas corporativas tradicionales. Un contenido reproducido en varios lugares al mismo tiempo ayuda a su divulgación y es ideal para aquellas voces y discursos contrahegemónicos en la web y su supervivencia al paso del tiempo, preservando la memoria popular.

Cómo funciona el Fediverso en la moderación

El Fediverso intenta funcionar como comunidades en línea interconectadas que se autogobiernan en las formas de cuidados colectivos. Así, cada instancia podría ser algo así como un municipio que aloja diferentes cuentas/usuaries bajo unas reglas consensuadas y que pueden ser puestas en discusión si fuera necesario. De esta forma, es posible regular la circulación de contenidos fascistas y discursos de odio que puedan dañar no solamente la participación de diverses usuaries sino también su salud.

Para ello, cada instancia elige sus formas de moderación y puede excluir otras instancias con denuncias previas de contenidos antidemocráticos, odiantes o contrarios a los valores y cuidados de sus habitantes.

En Sutty en particular, nos interesan las estrategias y los mecanismos de cuidados colectivos, por lo que seguimos diseñando modelos que permitan sostenerlos en nuestras tecnologías. Podés revisar nuestros términos y condiciones, política de privacidad y acuerdos de convivencia para más información.

¿Te interesa participar?

Si sos parte de una organización social, grupo de activismo o colectivo social que pensás que podría beneficiarse de estas características, te invitamos a contactarnos a través de nuestro formulario. Estamos busando mejorar los usos de las tecnologías para ustedes y valoramos sus experiencias.

Otras posibilidades de integración de Social Inbox en sitios estáticos

Si te interesa incorporar esta funcionalidad para otros gestores de sitios estáticos, no dudes en contactarnos. Además, mantenete al tanto de las novedades que compartimos en https://dweb.sutty.nl y en nuestro blog https://sutty.nl/blog

Recomendado para saber más

\n", 'name' => 'Lanzamiento de publicaciones distribuidas en el Fediverso a través de Sutty', 'contentMap' => { 'es' => "

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.

Gracias al trabajo conjunto con Distributed Press, Hypha y apoyado por la Filecoin Foundation for the Distributed Web, 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.

Esto se logró a través del desarollo y la integración de dos componentes, trabajados en forma conjunta y colaborativa:

    \n
  1. Social Inbox, desarrollado principalmente Distributed Press. Aporta la funcionalidad de recibir artículos, responder y mencionar otras cuentas en el Fediverso.

  2. \n
  3. Jekyll Activity Pub Plugin, 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.

  4. \n

Sutty integra la funcionalidad completa en su CMS para sitios estáticos en Jekyll, permitiendo gestionarla desde una interfaz en continua mejora de su usabilidad.

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”.

Qué significa

Qué permite hacer

Qué se viene

¡Quiero usarlo!

Te invitamos a dar tus primeros pasos de la mano de nuestro tutorial.

Para tecno-curioses

Cómo funciona

Los sitios web y las redes sociales parecen ser especies distintas dentro del Universo de Internet. Al mismo tiempo, las redes sociales corporativas y concentradas como Instagram, Facebook, X (ex Twitter), entre otras, demostraron ser hostiles con algunos grupos o colectivos sociales en particular (censurando contenido, persiguiendo pezones, ocultando publicaciones por color de piel y de pelo, etc.) y con todes sus usuaries en general (vendiendo data en forma masiva, violando acuerdos de privacidad, eligiendo diseños de interfaz y uso que generan ansiedad y adicción, etc.). Pese a esto, siguen funcionando como espacios obligados a la hora de publicitar un emprendimiento o difundir noticias urgentes.

El Fediverso es una red federada, descentralizada y distribuida de redes sociales libres, cada una con sus características, preferencias, grupos de usuaries. Están diseñadas para facilitar el diálogo entre todas ellas. Es decir, para que los contenidos puedan ser visibles y se puedan generar respuestas entre usuaries, fomentando una cultura de participación y pluralidad de voces, basadas en estándares de desarrollo libre y que buscan ser éticos antes que con fines de lucro sin fin.

Los sitios web siguen siendo formatos para medios de comunicación que, debido a sus características, favorecen la difusión de contenidos como artículos multimedia. Permiten adecuar un estilo a una identidad visual del medio, mantener secciones y contenido institucional variado, entre otras cosas.

Las redes sociales se destacan por sus características de inmediatez, favoreciendo un flujo dialógico en tiempo real con otros tiempos de atención y características de navegación que lo hacen más breve, rápido, a veces efímero. Los medios de comunicación (personas o emprendimientos mediáticos) suelen utilizarlos para llamar la atención sobre contenidos publicados en sus sitios, apostando a la divulgación rápida y las discusiones que puedan darse entre usuaries.

La funcionalidad que desarrollamos en Sutty contempla los casos de uso en los que un contenido quiera ser compartido a más personas, en menor tiempo, con la posibilidad de generar diálogos. Las particularidades de nuestros sitios y redes sociales libres generan condiciones favorables para la libertad de expresión, que preferimos llamar Derecho a la Comunicación, evadiendo las variadas y cada vez más sofisticadas formas de censura de las plataformas corporativas tradicionales. Un contenido reproducido en varios lugares al mismo tiempo ayuda a su divulgación y es ideal para aquellas voces y discursos contrahegemónicos en la web y su supervivencia al paso del tiempo, preservando la memoria popular.

Cómo funciona el Fediverso en la moderación

El Fediverso intenta funcionar como comunidades en línea interconectadas que se autogobiernan en las formas de cuidados colectivos. Así, cada instancia podría ser algo así como un municipio que aloja diferentes cuentas/usuaries bajo unas reglas consensuadas y que pueden ser puestas en discusión si fuera necesario. De esta forma, es posible regular la circulación de contenidos fascistas y discursos de odio que puedan dañar no solamente la participación de diverses usuaries sino también su salud.

Para ello, cada instancia elige sus formas de moderación y puede excluir otras instancias con denuncias previas de contenidos antidemocráticos, odiantes o contrarios a los valores y cuidados de sus habitantes.

En Sutty en particular, nos interesan las estrategias y los mecanismos de cuidados colectivos, por lo que seguimos diseñando modelos que permitan sostenerlos en nuestras tecnologías. Podés revisar nuestros términos y condiciones, política de privacidad y acuerdos de convivencia para más información.

¿Te interesa participar?

Si sos parte de una organización social, grupo de activismo o colectivo social que pensás que podría beneficiarse de estas características, te invitamos a contactarnos a través de nuestro formulario. Estamos busando mejorar los usos de las tecnologías para ustedes y valoramos sus experiencias.

Otras posibilidades de integración de Social Inbox en sitios estáticos

Si te interesa incorporar esta funcionalidad para otros gestores de sitios estáticos, no dudes en contactarnos. Además, mantenete al tanto de las novedades que compartimos en https://dweb.sutty.nl y en nuestro blog https://sutty.nl/blog

Recomendado para saber más

\n" }, '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".' }] } ] end def update authorize post service = PostService.new(site: site, post: post, usuarie: current_usuarie, params: params) if service.update.persisted? site.touch forget_content redirect_to site_post_path(site, post) else render 'posts/edit' end end # Eliminar artículos def destroy authorize post service = PostService.new(site: site, post: post, usuarie: current_usuarie, params: params) # TODO: Notificar si se pudo o no service.destroy site.touch redirect_to site_posts_path(site, locale: post.lang.value) end # Reordenar los artículos def reorder authorize site service = PostService.new(site: site, usuarie: current_usuarie, params: params) service.reorder site.touch redirect_to site_posts_path(site, locale: site.default_locale) end # Devuelve el idioma solicitado a través de un parámetro, validando # 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] end 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 end