tdm_server_rust/cache/
member_workbench_cache.rs1use crate::{
11 app::AppState,
12 common::{page_bean::PageBean, result::ResultBody},
13 entity::member::{MemberWorkbenchOverview, MemberWorkbenchTaskGroup},
14 utils::fast_json,
15};
16use std::sync::Arc;
17
18pub struct MemberWorkbenchCache;
20
21pub fn new_member_workbench_cache() -> MemberWorkbenchCache {
23 MemberWorkbenchCache
24}
25
26fn cache_ttl_secs() -> u64 {
28 std::env::var("MEMBER_WORKBENCH_CACHE_SECS")
29 .ok()
30 .and_then(|v| v.parse().ok())
31 .unwrap_or(60)
32}
33
34pub fn member_workbench_overview_cache_key(member_id: i32) -> String {
36 format!("workbench_overview:{member_id}")
37}
38
39pub fn member_workbench_tasks_cache_key(
41 member_id: i32,
42 tab: &str,
43 view: &str,
44 keyword: Option<&str>,
45 page: i32,
46 page_size: i32,
47) -> String {
48 let keyword = keyword.unwrap_or("").trim();
49 format!("workbench_tasks:{member_id}:{page}:{page_size}:{tab}:{view}:{keyword}")
50}
51
52pub async fn get_workbench_overview_json_cached(
54 state: &AppState,
55 key: &str,
56) -> Option<Arc<Vec<u8>>> {
57 state.redis.get_json_bytes(key).await
58}
59
60pub async fn set_workbench_overview_json_cached(
62 state: &AppState,
63 key: String,
64 data: MemberWorkbenchOverview,
65) {
66 let body = ResultBody::success_data(&data);
67 let json = match fast_json::to_vec(&body) {
68 Ok(bytes) => Arc::new(bytes),
69 Err(_) => return,
70 };
71 state
72 .redis
73 .set_json_bytes_ttl(&key, json.as_ref(), cache_ttl_secs())
74 .await;
75}
76
77pub async fn get_workbench_tasks_json_cached(state: &AppState, key: &str) -> Option<Arc<Vec<u8>>> {
79 state.redis.get_json_bytes(key).await
80}
81
82pub async fn set_workbench_tasks_json_cached(
84 state: &AppState,
85 key: String,
86 data: PageBean<MemberWorkbenchTaskGroup>,
87) {
88 let body = ResultBody::success_data(&data);
89 let json = match fast_json::to_vec(&body) {
90 Ok(bytes) => Arc::new(bytes),
91 Err(_) => return,
92 };
93 state
94 .redis
95 .set_json_bytes_ttl(&key, json.as_ref(), cache_ttl_secs())
96 .await;
97}
98
99pub async fn invalidate_member_workbench(state: &AppState, member_id: i32) {
101 state
102 .redis
103 .del_json(&member_workbench_overview_cache_key(member_id))
104 .await;
105 state
106 .redis
107 .del_json_pattern(&format!("workbench_tasks:{member_id}:*"))
108 .await;
109}
110
111pub async fn invalidate_all_member_workbenches(state: &AppState) {
113 state.redis.del_json_pattern("workbench_overview:*").await;
114 state.redis.del_json_pattern("workbench_tasks:*").await;
115}