// POST /cms/admin/posts — create a post (author+). import "auth" as auth; import "util" as util; let g = auth::guard(ctx, ["admin", "author"]); if !g.ok { return g.response; } let user = g.user; let b = ctx.request.body; if b == () || b.title == () { return #{ statusCode: 400, body: #{ error: "title required" } }; } let posts = docs::collection("posts"); let idx = kv::collection("slugs"); let slug = if b.slug == () { util::slugify(b.title) } else { util::slugify(b.slug) }; if idx.has("post:" + slug) { slug = slug + "-" + random::string(4).to_lower(); } let now = time::now(); let status = if b.status == () { "draft" } else { b.status }; let publish_at = (); if status == "published" { publish_at = now; } else if status == "scheduled" && b.publish_at != () { publish_at = b.publish_at; } let data = #{ title: b.title, slug: slug, body_md: if b.body_md == () { "" } else { b.body_md }, excerpt: if b.excerpt == () { "" } else { b.excerpt }, status: status, author_id: user.id, author_name: user.display_name, tags: if b.tags == () { [] } else { b.tags }, publish_at: publish_at, }; let id = posts.create(data); idx.set("post:" + slug, id); #{ statusCode: 201, body: #{ id: id, slug: slug, status: status } }