Skip to main content

yggdrasil/api/posts/
create.rs

1//! 创建文章接口。
2//!
3//! 校验标题、内容与 slug,生成唯一 slug 并渲染 Markdown,
4//! 在事务中写入 posts 表并同步标签关联,最后失效相关缓存。
5//! Leptos server function,注册在 `/api` 路径下。
6//! 仅在 `feature = "server"` 启用的服务端构建中写入数据库。
7
8#![allow(clippy::too_many_arguments)]
9
10use crate::api::error::ApiError;
11use leptos::prelude::*;
12
13#[cfg(feature = "server")]
14use super::helpers::get_current_admin_user;
15use super::types::CreatePostResponse;
16#[cfg(feature = "server")]
17use super::{service, types::write_response};
18
19/// 创建一篇新文章。
20///
21/// 校验标题与内容非空、slug 格式合法;未提供 slug 时从标题自动生成。
22/// 首次发布时填充 published_at,并同步标签与缓存失效。
23#[server(CreatePost, endpoint = "create_post", input = leptos::server_fn::codec::Json)]
24pub async fn create_post(
25    title: String,
26    slug: Option<String>,
27    summary: Option<String>,
28    content_md: String,
29    status: String,
30    tags: Vec<String>,
31    cover_image: Option<String>,
32) -> Result<CreatePostResponse, ApiError> {
33    let user = get_current_admin_user().await?;
34    let draft = service::PostDraft {
35        title,
36        slug,
37        summary,
38        content_md,
39        status,
40        tags,
41        cover_image,
42    };
43    write_response(service::create(user.id, draft, None).await, "创建成功")
44}