feat: return total count from post list server functions

This commit is contained in:
xfy 2026-06-10 14:14:04 +08:00
parent 116f3281a4
commit 44eba24121
2 changed files with 28 additions and 15 deletions

View File

@ -14,12 +14,22 @@ pub async fn list_published_posts(
#[cfg(feature = "server")] #[cfg(feature = "server")]
{ {
let cache_key = crate::cache::CacheKey::PublishedPosts { page, per_page }; let cache_key = crate::cache::CacheKey::PublishedPosts { page, per_page };
if let Some(cached) = crate::cache::get_post_list(&cache_key).await { if let Some((cached_posts, cached_total)) = crate::cache::get_post_list(&cache_key).await {
return Ok(PostListResponse { posts: cached }); return Ok(PostListResponse { posts: cached_posts, total: cached_total });
} }
let client = get_conn().await.map_err(AppError::db_conn)?; let client = get_conn().await.map_err(AppError::db_conn)?;
// Get total count
let count_row = client
.query_one(
"SELECT COUNT(*) FROM posts WHERE status = 'published' AND deleted_at IS NULL",
&[],
)
.await
.map_err(AppError::query)?;
let total: i64 = count_row.get(0);
let offset = ((page - 1).max(0) as i64) * (per_page as i64); let offset = ((page - 1).max(0) as i64) * (per_page as i64);
let limit = per_page as i64; let limit = per_page as i64;
let rows = client let rows = client
@ -45,13 +55,13 @@ pub async fn list_published_posts(
posts.push(row_to_post_list(&client, row).await); posts.push(row_to_post_list(&client, row).await);
} }
crate::cache::set_post_list(&cache_key, posts.clone()).await; crate::cache::set_post_list(&cache_key, posts.clone(), total).await;
Ok(PostListResponse { posts }) Ok(PostListResponse { posts, total })
} }
#[cfg(not(feature = "server"))] #[cfg(not(feature = "server"))]
{ {
Ok(PostListResponse { posts: Vec::new() }) Ok(PostListResponse { posts: Vec::new(), total: 0 })
} }
} }
@ -85,12 +95,13 @@ pub async fn list_posts() -> Result<PostListResponse, ServerFnError> {
posts.push(row_to_post_list(&client, row).await); posts.push(row_to_post_list(&client, row).await);
} }
Ok(PostListResponse { posts }) let total = posts.len() as i64;
Ok(PostListResponse { posts, total })
} }
#[cfg(not(feature = "server"))] #[cfg(not(feature = "server"))]
{ {
Ok(PostListResponse { posts: Vec::new() }) Ok(PostListResponse { posts: Vec::new(), total: 0 })
} }
} }
@ -98,8 +109,8 @@ pub async fn list_posts() -> Result<PostListResponse, ServerFnError> {
pub async fn get_posts_by_tag(tag_name: String) -> Result<PostListResponse, ServerFnError> { pub async fn get_posts_by_tag(tag_name: String) -> Result<PostListResponse, ServerFnError> {
#[cfg(feature = "server")] #[cfg(feature = "server")]
{ {
if let Some(cached) = crate::cache::get_posts_by_tag(&tag_name).await { if let Some((cached_posts, cached_total)) = crate::cache::get_posts_by_tag(&tag_name).await {
return Ok(PostListResponse { posts: cached }); return Ok(PostListResponse { posts: cached_posts, total: cached_total });
} }
let client = get_conn().await.map_err(AppError::db_conn)?; let client = get_conn().await.map_err(AppError::db_conn)?;
@ -128,12 +139,13 @@ pub async fn get_posts_by_tag(tag_name: String) -> Result<PostListResponse, Serv
posts.push(row_to_post_list(&client, row).await); posts.push(row_to_post_list(&client, row).await);
} }
crate::cache::set_posts_by_tag(&tag_name, posts.clone()).await; let total = posts.len() as i64;
Ok(PostListResponse { posts }) crate::cache::set_posts_by_tag(&tag_name, posts.clone(), total).await;
Ok(PostListResponse { posts, total })
} }
#[cfg(not(feature = "server"))] #[cfg(not(feature = "server"))]
{ {
Ok(PostListResponse { posts: Vec::new() }) Ok(PostListResponse { posts: Vec::new(), total: 0 })
} }
} }

View File

@ -14,7 +14,7 @@ pub async fn search_posts(query: String) -> Result<PostListResponse, ServerFnErr
let q = query.trim(); let q = query.trim();
if q.is_empty() { if q.is_empty() {
return Ok(PostListResponse { posts: Vec::new() }); return Ok(PostListResponse { posts: Vec::new(), total: 0 });
} }
let rows = client let rows = client
@ -42,11 +42,12 @@ pub async fn search_posts(query: String) -> Result<PostListResponse, ServerFnErr
posts.push(row_to_post_list(&client, row).await); posts.push(row_to_post_list(&client, row).await);
} }
Ok(PostListResponse { posts }) let total = posts.len() as i64;
Ok(PostListResponse { posts, total })
} }
#[cfg(not(feature = "server"))] #[cfg(not(feature = "server"))]
{ {
Ok(PostListResponse { posts: Vec::new() }) Ok(PostListResponse { posts: Vec::new(), total: 0 })
} }
} }