Skip to main content

max / makenotwork

1.6 KB · 41 lines History Blame Raw
1 //! Seed blog posts on each project (Phase 4).
2 //!
3 //! Drives the project blog page (`/p/{slug}/blog`) and per-project RSS
4 //! (`/p/{slug}/blog/feed.xml`). Posts are published (`published_at = NOW()`); the
5 //! owning project is already public and the creator non-sandbox, so they render to
6 //! anonymous fans. `body_html` is pre-rendered the same way the live blog handler
7 //! does (`render_creator_markdown`).
8
9 use super::SeedError;
10 use super::projects::SeededProject;
11 use crate::db;
12 use crate::formatting::slugify;
13 use crate::markdown::render_creator_markdown;
14
15 /// Publish every roster blog post under its project.
16 pub async fn seed_blog(pool: &sqlx::PgPool, projects: &[SeededProject]) -> Result<(), SeedError> {
17 for project in projects {
18 for post in project.spec.blog {
19 let slug = slugify(post.title);
20 // Bodies are plain prose with no embedded media, so the CDN base used
21 // for media-path rewriting is irrelevant here.
22 let body_html = render_creator_markdown(post.body, project.user_id, "");
23 db::blog_posts::create_blog_post(
24 pool,
25 project.project.id,
26 project.user_id,
27 post.title,
28 &slug,
29 post.body,
30 &body_html,
31 true, // publish -> published_at = NOW()
32 false, // web_only
33 false, // show_on_landing (inert off the changelog project)
34 )
35 .await?;
36 tracing::info!(title = post.title, slug = %slug, "example seed: published blog post");
37 }
38 }
39 Ok(())
40 }
41