refactor(posts): remove orphan row_to_post_list and use row_to_post_full for get_post_by_id
This commit is contained in:
parent
1eedab8f21
commit
9f41ea7354
@ -14,53 +14,6 @@ use crate::utils::text::count_words;
|
|||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
pub(super) use crate::api::auth::get_current_admin_user;
|
pub(super) use crate::api::auth::get_current_admin_user;
|
||||||
|
|
||||||
/// 将数据库行转换为文章列表项。
|
|
||||||
///
|
|
||||||
/// 用于列表接口,包含标签聚合、字数与阅读时长估算,
|
|
||||||
/// 不包含上下篇导航与目录。
|
|
||||||
#[cfg(feature = "server")]
|
|
||||||
pub(super) async fn row_to_post_list(
|
|
||||||
_client: &tokio_postgres::Client,
|
|
||||||
row: &tokio_postgres::Row,
|
|
||||||
) -> Post {
|
|
||||||
let id: i32 = row.get("id");
|
|
||||||
let role_str: String = row.get("status");
|
|
||||||
let status = PostStatus::from_str(&role_str).unwrap_or(PostStatus::Draft);
|
|
||||||
|
|
||||||
// 聚合标签并过滤空字符串。
|
|
||||||
let tags: Vec<String> = row
|
|
||||||
.try_get::<_, Vec<String>>("tags")
|
|
||||||
.unwrap_or_default()
|
|
||||||
.into_iter()
|
|
||||||
.filter(|t| !t.is_empty())
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let content_md: String = row.get("content_md");
|
|
||||||
let word_count = count_words(&content_md);
|
|
||||||
|
|
||||||
Post {
|
|
||||||
id,
|
|
||||||
author_id: row.get("author_id"),
|
|
||||||
title: row.get("title"),
|
|
||||||
slug: row.get("slug"),
|
|
||||||
summary: row.get("summary"),
|
|
||||||
content_md,
|
|
||||||
content_html: row.get("content_html"),
|
|
||||||
status,
|
|
||||||
published_at: row.get("published_at"),
|
|
||||||
created_at: row.get("created_at"),
|
|
||||||
updated_at: row.get("updated_at"),
|
|
||||||
deleted_at: row.try_get("deleted_at").ok(),
|
|
||||||
tags,
|
|
||||||
cover_image: row.get("cover_image"),
|
|
||||||
reading_time: (word_count / 200).max(1),
|
|
||||||
word_count,
|
|
||||||
toc_html: None,
|
|
||||||
prev_post: None,
|
|
||||||
next_post: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 将数据库行转换为轻量列表项 DTO。
|
/// 将数据库行转换为轻量列表项 DTO。
|
||||||
///
|
///
|
||||||
/// 不包含 `content_md`/`content_html`;字数与阅读时长直接读取已持久化的列。
|
/// 不包含 `content_md`/`content_html`;字数与阅读时长直接读取已持久化的列。
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
use dioxus::prelude::*;
|
use dioxus::prelude::*;
|
||||||
|
|
||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
use super::helpers::{get_current_admin_user, row_to_post_full, row_to_post_list};
|
use super::helpers::{get_current_admin_user, row_to_post_full};
|
||||||
use super::types::SinglePostResponse;
|
use super::types::SinglePostResponse;
|
||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
use crate::api::error::AppError;
|
use crate::api::error::AppError;
|
||||||
@ -29,8 +29,9 @@ pub async fn get_post_by_id(post_id: i32) -> Result<SinglePostResponse, ServerFn
|
|||||||
let row = client
|
let row = client
|
||||||
.query_opt(
|
.query_opt(
|
||||||
"SELECT
|
"SELECT
|
||||||
p.id, p.author_id, p.title, p.slug, p.summary, p.content_md, p.content_html,
|
p.id, p.author_id, p.title, p.slug, p.summary, p.content_md, p.content_html, p.toc_html,
|
||||||
p.status, p.published_at, p.created_at, p.updated_at, p.cover_image,
|
p.status, p.published_at, p.created_at, p.updated_at, p.cover_image,
|
||||||
|
p.word_count, p.reading_time,
|
||||||
COALESCE(array_agg(t.name) FILTER (WHERE t.name IS NOT NULL), '{}') as tags
|
COALESCE(array_agg(t.name) FILTER (WHERE t.name IS NOT NULL), '{}') as tags
|
||||||
FROM posts p
|
FROM posts p
|
||||||
LEFT JOIN post_tags pt ON p.id = pt.post_id
|
LEFT JOIN post_tags pt ON p.id = pt.post_id
|
||||||
@ -43,7 +44,7 @@ pub async fn get_post_by_id(post_id: i32) -> Result<SinglePostResponse, ServerFn
|
|||||||
.map_err(AppError::query)?;
|
.map_err(AppError::query)?;
|
||||||
|
|
||||||
let post = match row {
|
let post = match row {
|
||||||
Some(row) => Some(row_to_post_list(&client, &row).await),
|
Some(row) => Some(row_to_post_full(&client, &row).await),
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user