feat(posts): add caching to read operations
This commit is contained in:
parent
0b594ff719
commit
4c44b62e3d
@ -11,6 +11,8 @@ use crate::models::post::{Post, PostStats, PostStatus, Tag};
|
|||||||
use crate::models::user::{User, UserRole};
|
use crate::models::user::{User, UserRole};
|
||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
use crate::utils::text::{auto_summary, count_words};
|
use crate::utils::text::{auto_summary, count_words};
|
||||||
|
#[cfg(feature = "server")]
|
||||||
|
use crate::cache;
|
||||||
|
|
||||||
// Re-export extracted modules
|
// Re-export extracted modules
|
||||||
#[cfg(feature = "server")]
|
#[cfg(feature = "server")]
|
||||||
@ -554,6 +556,10 @@ pub async fn get_post_by_id(post_id: i32) -> Result<SinglePostResponse, ServerFn
|
|||||||
|
|
||||||
#[server(GetPostBySlug, "/api")]
|
#[server(GetPostBySlug, "/api")]
|
||||||
pub async fn get_post_by_slug(slug: String) -> Result<SinglePostResponse, ServerFnError> {
|
pub async fn get_post_by_slug(slug: String) -> Result<SinglePostResponse, ServerFnError> {
|
||||||
|
if let Some(cached) = cache::get_post_by_slug(&slug).await {
|
||||||
|
return Ok(SinglePostResponse { post: cached });
|
||||||
|
}
|
||||||
|
|
||||||
let client = get_conn().await.map_err(db_conn_error)?;
|
let client = get_conn().await.map_err(db_conn_error)?;
|
||||||
|
|
||||||
let row = client
|
let row = client
|
||||||
@ -595,6 +601,7 @@ pub async fn get_post_by_slug(slug: String) -> Result<SinglePostResponse, Server
|
|||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cache::set_post_by_slug(&slug, post.clone()).await;
|
||||||
Ok(SinglePostResponse { post })
|
Ok(SinglePostResponse { post })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -603,6 +610,11 @@ pub async fn list_published_posts(
|
|||||||
page: i32,
|
page: i32,
|
||||||
per_page: i32,
|
per_page: i32,
|
||||||
) -> Result<PostListResponse, ServerFnError> {
|
) -> Result<PostListResponse, ServerFnError> {
|
||||||
|
let cache_key = cache::CacheKey::PublishedPosts { page, per_page };
|
||||||
|
if let Some(cached) = cache::get_post_list(&cache_key).await {
|
||||||
|
return Ok(PostListResponse { posts: cached });
|
||||||
|
}
|
||||||
|
|
||||||
let client = get_conn().await.map_err(db_conn_error)?;
|
let client = get_conn().await.map_err(db_conn_error)?;
|
||||||
|
|
||||||
let offset = ((page - 1).max(0) as i64) * (per_page as i64);
|
let offset = ((page - 1).max(0) as i64) * (per_page as i64);
|
||||||
@ -630,6 +642,7 @@ pub async fn list_published_posts(
|
|||||||
posts.push(row_to_post_list(&client, row).await);
|
posts.push(row_to_post_list(&client, row).await);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cache::set_post_list(&cache_key, posts.clone()).await;
|
||||||
Ok(PostListResponse { posts })
|
Ok(PostListResponse { posts })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -700,6 +713,10 @@ pub async fn delete_post(post_id: i32) -> Result<CreatePostResponse, ServerFnErr
|
|||||||
|
|
||||||
#[server(ListTags, "/api")]
|
#[server(ListTags, "/api")]
|
||||||
pub async fn list_tags() -> Result<TagListResponse, ServerFnError> {
|
pub async fn list_tags() -> Result<TagListResponse, ServerFnError> {
|
||||||
|
if let Some(cached) = cache::get_tag_list().await {
|
||||||
|
return Ok(TagListResponse { tags: cached });
|
||||||
|
}
|
||||||
|
|
||||||
let client = get_conn().await.map_err(db_conn_error)?;
|
let client = get_conn().await.map_err(db_conn_error)?;
|
||||||
|
|
||||||
let rows = client
|
let rows = client
|
||||||
@ -724,11 +741,16 @@ pub async fn list_tags() -> Result<TagListResponse, ServerFnError> {
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
cache::set_tag_list(tags.clone()).await;
|
||||||
Ok(TagListResponse { tags })
|
Ok(TagListResponse { tags })
|
||||||
}
|
}
|
||||||
|
|
||||||
#[server(GetPostsByTag, "/api")]
|
#[server(GetPostsByTag, "/api")]
|
||||||
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> {
|
||||||
|
if let Some(cached) = cache::get_posts_by_tag(&tag_name).await {
|
||||||
|
return Ok(PostListResponse { posts: cached });
|
||||||
|
}
|
||||||
|
|
||||||
let client = get_conn().await.map_err(db_conn_error)?;
|
let client = get_conn().await.map_err(db_conn_error)?;
|
||||||
|
|
||||||
let rows = client
|
let rows = client
|
||||||
@ -755,6 +777,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cache::set_posts_by_tag(&tag_name, posts.clone()).await;
|
||||||
Ok(PostListResponse { posts })
|
Ok(PostListResponse { posts })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,6 +785,10 @@ pub async fn get_posts_by_tag(tag_name: String) -> Result<PostListResponse, Serv
|
|||||||
pub async fn get_post_stats() -> Result<PostStatsResponse, ServerFnError> {
|
pub async fn get_post_stats() -> Result<PostStatsResponse, ServerFnError> {
|
||||||
let _user = get_current_admin_user().await?;
|
let _user = get_current_admin_user().await?;
|
||||||
|
|
||||||
|
if let Some(cached) = cache::get_post_stats().await {
|
||||||
|
return Ok(PostStatsResponse { stats: cached });
|
||||||
|
}
|
||||||
|
|
||||||
let client = get_conn().await.map_err(db_conn_error)?;
|
let client = get_conn().await.map_err(db_conn_error)?;
|
||||||
|
|
||||||
let total: i64 = client
|
let total: i64 = client
|
||||||
@ -788,13 +815,13 @@ pub async fn get_post_stats() -> Result<PostStatsResponse, ServerFnError> {
|
|||||||
.map_err(query_error)?
|
.map_err(query_error)?
|
||||||
.get(0);
|
.get(0);
|
||||||
|
|
||||||
Ok(PostStatsResponse {
|
let stats = PostStats {
|
||||||
stats: PostStats {
|
|
||||||
total,
|
total,
|
||||||
drafts,
|
drafts,
|
||||||
published,
|
published,
|
||||||
},
|
};
|
||||||
})
|
cache::set_post_stats(stats.clone()).await;
|
||||||
|
Ok(PostStatsResponse { stats })
|
||||||
}
|
}
|
||||||
|
|
||||||
#[server(SearchPosts, "/api")]
|
#[server(SearchPosts, "/api")]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user