Skip to main content
Petanque Life

Blog & News

F18.04 11 features Planned

At a glance

A blog and news system where federations and clubs publish articles with rich text, categories, tags, featured images, multi-author bylines and scheduled publishing. Child sites can pull a parent federation's news feed automatically with attribution, every blog auto-generates an RSS feed for syndication, and an opt-in moderated comment system protected by Turnstile lets visitors react without inviting spam onto the federation's official voice.

How it works

Articles are a specialized CmsPage subtype with a `news` template, surfaced in a dedicated /news section per site. The rich text editor is a block-aware WYSIWYG that emits the same typed blocks the page builder uses, so an article can embed galleries, dynamic data widgets and pull-quotes alongside paragraphs. Categories and tags are taxonomies stored on the CmsPage with auto-generated archive pages (e.g. `/news/category/competition-results`) and faceted filtering.

The featured image and excerpt drive Open Graph cards, the news-list grid and RSS feeds. Multi-author support assigns one or more author OrgNodeMember references; their display name, avatar and short bio render in the byline and author archive pages. Scheduling reuses the page builder's publisher job — articles flip from draft to published at scheduled_at.

News feed aggregation is a pull mechanism: a child site can subscribe to its parent federation's published articles, optionally filtered by category or tag, and the renderer interleaves them into the local news list with a clear 'From <federation>' attribution badge. RSS is auto-generated at `/news/feed.xml` per site, including title, excerpt, author, categories and absolute media URLs, with an Atom variant for clients that prefer it. Comments are opt-in per site: when enabled, a Turnstile-protected form posts to a moderation queue; an editor or site owner approves or rejects, and approved comments appear under the article with the commenter's display name.

All article changes go through the same audit trail, RBAC and approval workflow as other CMS content.

Key capabilities

  • Rich text editor with embedded blocks, galleries and dynamic widgets
  • Categories and tags with auto-generated archive pages
  • Featured image and excerpt drive social cards and listings
  • Multi-author bylines with author archive pages
  • Schedule articles for future publish using the same publisher job
  • Pull parent-federation news into child sites with attribution
  • RSS/Atom feeds and moderated comment system protected by Turnstile

In practice

Pierre, communications lead for a French ligue, drafts a recap of the regional championship. He uses the rich-text editor to add three paragraphs, embeds a gallery of fifteen photos, drops in the live results widget for the final, and tags two players as co-authors. He sets the category 'Compétition régionale', adds tags for the venue and discipline, picks a featured image and writes a 140-character excerpt.

He schedules the article for Monday morning. Two affiliated club sites have subscribed to the ligue's news feed, so when the article publishes it appears on their home pages with a 'From Ligue Provence' badge — clubs get high-quality content without writing it themselves. The article's RSS entry is picked up by a community aggregator within minutes.

Features in this subsystem

11
ID Status Features
F18.04.01 Shipped Article creation with rich text editor — PL-F1804a ✅ 449770bd.m-7 — POST/GET /v1/cms/sites/{id}/blog + GET/PATCH/DELETE /v1/cms/blog/{id}, auto-slug ur m-1:s translitterering. Bokförd avvikelse: kroppen är m-2:s ordnade blockarray, aldrig fri rich-text-HTML — huset tar aldrig emot markup det sedan måste sanera; HTML GENERERAS i stället på servern för RSS full och syndikeringens content_html
F18.04.02 Shipped Categories and tags — PL-F1804a ✅ 449770bd.m-7 — de ÅTTA kategorierna som DATA i koden (internal/cms/blog_categories.go) med i18n-etiketter per lanseringsspråk, läsbara på GET /v1/cms/blog-categories; fria taggar i text[]; okänd kategori ⇒ 422 även i filterläge
F18.04.03 Shipped Featured image and excerpt — PL-F1804a ✅ 449770bd.m-7 — featured_image_ref är en REFERENS mot husets publika mediagate (aldrig en fri URL) med i18n alt-text, lede som excerpt; :feature/:unfeature + :pin/:unpin, och featured HÄRLEDS vid läsning ur featured_until (ingen jobbskrivare rör raden)
F18.04.04 Shipped Article scheduling (publish at future date) — PL-F1804a ✅ 449770bd.m-7 — statusmaskinen draft → in_review → scheduled → published → archived med kantmandat (inga nya capabilities), :schedule/:unschedule som planens enda vägar och F1-7-svepet cms_blog_schedule_tick som kanten scheduled → published:s ENDA skrivare (rutten vägrar den med 409)
F18.04.05 Shipped Multi-author support — PL-F1804b ✅ 449770bd.m-7 — authors jsonb med de FEM rollerna och …/authors-familjen (dubblett ⇒ 409, primär kan inte tas bort ⇒ 422); bylinen är ett VISNINGSNAMN — aldrig e-post, aldrig ett identitets-id i ett publikt svar
F18.04.06 Shipped News feed aggregation (pull news from parent federation) — PL-F1804b ✅ 449770bd.m-7 — interna prenumerationer där servern resolver OrgNoden till dess primärsajt (själv/annan tenant ⇒ 422, dubblett ⇒ 409, include_in_public styr publik synlighet) OCH externa källor genom porten NewsFeedFetcher med SSRF-vakt + svepet cms_news_external_fetch; det publika flödet är EN paginerad union med källmärkning egen|intern|extern och obligatorisk attribution. Ingen kopiering: aggregated_from_post_id är reserverad och oskriven
F18.04.07 Shipped RSS feed generation — PL-F1804b ✅ 449770bd.m-7 — RSS 2.0 byggt med encoding/xml, dc:creator per författare, category + enclosure genom mediagaten, serverbyggda länkar/feed_urls, content_mode lede|full, stark ETag + 304, ?language=-filter och rss_enabled=false ⇒ 404. ✅ web-exponeringen är 449770bd.m-7.t-2: rss.xml, /{lang}/rss.xml och serverns egen /blog/rss på sajtens EGEN värd STRÖMMAR API:ts feed (web bygger aldrig egen XML — grindat), och upptäcktslänken <link rel="alternate" type="application/rss+xml"> publiceras BARA när feeden faktiskt svarar 200 (huset har ingen publik läsning av rss_enabled, och en länk mot en avstängd feed hade gett läsaren ett trasigt flöde)
F18.04.08 Shipped Comment system (moderated) — PL-F1804b ✅ 449770bd.m-7 — publik POST ⇒ 202 {status:"pending"} utan id, trådning mot GODKÄND förälder, moderering (approve|reject) bakom cms:edit med stämplad moderated_by/at, auto-flagg vid tröskeln 3, honeypot-fältet website (byte-identiskt svar, noll rader) och den domänpersisterade missbruksvakten 30/timme/källa/sajt ⇒ 429 + Retry-After (oberoende av den globala rate-limit-flaggan)
F18.04.09 Shipped Publik nyhetsyta på sajtens egen värd — flöde, artikeldetalj och kommentars-UI ✅ 449770bd.m-7.t-2 — news_feed-blocket SSR-först utan JS (poster i FÖRSTA HTML-svaret, källbadges egen|intern|extern, ETT featured-kort i hero-läge, attributionsnot, tre riktiga tillstånd), kategori- och källfilter som LÄNKAR med serverns egna query-parametrar (ingen klientfiltrering), artikeldetaljen på serverns EGEN väg /blog/{slug} med m-5/m-6:s blockrenderare återanvänd och byte-identisk neutral 404 för utkast/granskning/arkiv, samt kommentarsformuläret (namn + text + frivillig e-post) genom sajtens EGET ursprung. Ingen optimistisk rendering: inskicket ger pending-beskedet, kommentaren visas först när den godkänts. Vy-spec: specs/web/views/nyheter.md
F18.04.10 Shipped Redaktionens adminflikar (Artiklar · Skriv/redigera · Prenumerationer · Flöde & RSS) + modereringskön ✅ 449770bd.m-7.t-2 — de fyra flikarna i SAMMA sida /nyheter som D-COMM:s synd/outlets, med mandatet per FLIK (cms:view respektive syndication:manage, båda riktningarna mekaniskt bevisade). Artikellistan med FYRA SERVERfilter, editorn som återanvänder sidbyggarens blockredigerare (ingen andra blockeditor), prenumerationsflikens tre paneler (auto_republish, include_in_public, :republish), flödesflikens källtabell + RSS-panel med serverbyggda feed_urls under ETag-lås, och modereringskön (pending/flagged först, godkänn/avvisa med motivering, trådkontext, artikelreferens). ⊘ fliken Social media (some) är F09.05/F09.08 och renderas INTE ALLS. Vy-spec: specs/admin/views/nyheter.md
F18.04.11 Shipped Feed-upptäckt och RSS på tenantens egen värd ✅ 449770bd.m-7.t-2 — middlewarens rewrite av rss.xml / /{lang}/rss.xml / /blog/rss till strömnings-sömmen /sajt-rss; sajten är VÄRDENS, inte frågans (sajt-id ur Host, språk ur VÄGEN), serverns status och cachehuvuden bärs vidare oförändrade och rss_enabled = false ⇒ 404. Bevisat med curl -H "Host: …" i tools/gate/dcms-m7-e2e.mjs (m-5:s bevismekanism)

Stakeholders who need this subsystem

Surfaces in 1 stakeholder analyses