Skip to main content

yggdrasil/api/posts/
update.rs

1//! 更新文章接口。
2//!
3//! 校验管理员权限与文章归属,重新生成唯一 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/// 校验文章存在且属于当前 admin;处理 slug 变更、发布状态转换、标签同步,
22/// 并失效文章详情、列表、标签与统计缓存。
23#[server(UpdatePost, endpoint = "update_post", input = leptos::server_fn::codec::Json)]
24pub async fn update_post(
25    post_id: i32,
26    title: String,
27    slug: Option<String>,
28    summary: Option<String>,
29    content_md: String,
30    status: String,
31    tags: Vec<String>,
32    cover_image: Option<String>,
33) -> Result<CreatePostResponse, ApiError> {
34    let user = get_current_admin_user().await?;
35    let draft = service::PostDraft {
36        title,
37        slug,
38        summary,
39        content_md,
40        status,
41        tags,
42        cover_image,
43    };
44    write_response(
45        service::update(user.id, post_id, service::UpdatePost::Replace(draft)).await,
46        "更新成功",
47    )
48}