//! Seed blog posts on each project (Phase 4). //! //! Drives the project blog page (`/p/{slug}/blog`) and per-project RSS //! (`/p/{slug}/blog/feed.xml`). Posts are published (`published_at = NOW()`); the //! owning project is already public and the creator non-sandbox, so they render to //! anonymous fans. `body_html` is pre-rendered the same way the live blog handler //! does (`render_creator_markdown`). use super::SeedError; use super::projects::SeededProject; use crate::db; use crate::formatting::slugify; use crate::markdown::render_creator_markdown; /// Publish every roster blog post under its project. pub async fn seed_blog(pool: &sqlx::PgPool, projects: &[SeededProject]) -> Result<(), SeedError> { for project in projects { for post in project.spec.blog { let slug = slugify(post.title); // Bodies are plain prose with no embedded media, so the CDN base used // for media-path rewriting is irrelevant here. let body_html = render_creator_markdown(post.body, project.user_id, ""); db::blog_posts::create_blog_post( pool, project.project.id, project.user_id, post.title, &slug, post.body, &body_html, true, // publish -> published_at = NOW() false, // web_only false, // show_on_landing (inert off the changelog project) ) .await?; tracing::info!(title = post.title, slug = %slug, "example seed: published blog post"); } } Ok(()) }