Skip to main content

tdm_server_rust/cache/
invalidate.rs

1//! 缓存统一失效入口(突变 → 语义化 helper,避免 service 层散落遗漏)
2//!
3//! ## 突变矩阵
4//!
5//! | 突变 | Helper |
6//! |------|--------|
7//! | 话数 CRUD/接稿/交稿/OSS/上传/回退 | [`on_episode_mutated`] |
8//! | 漫画增删改 | [`on_manga_mutated`] |
9//! | 组员增删改 | [`on_member_mutated`] |
10//! | 常驻变更且影响话数 | [`on_station_mutated`] |
11//! | 作者/杂志改名影响列表筛选 | [`on_author_or_magazine_renamed`] |
12
13use crate::app::AppState;
14use crate::cache::{
15    invalidate_all_member_workbenches, invalidate_auth_snapshot, invalidate_episode_statistics,
16    invalidate_magazine_manga_caches, invalidate_manga_episode_caches, invalidate_manga_names,
17    invalidate_manga_page_caches, invalidate_member_all, invalidate_member_episodes,
18    invalidate_member_page_caches, invalidate_member_workbench, invalidate_stationed_mangas,
19    invalidate_task_tracking, invalidate_uploaded_submit_caches,
20};
21
22/// 话数相关突变后失效缓存
23pub async fn on_episode_mutated(state: &AppState, manga_id: i32, member_ids: &[i32]) {
24    let member_cache = async {
25        if member_ids.is_empty() {
26            invalidate_all_member_workbenches(state).await;
27        }
28        for &id in member_ids {
29            invalidate_member_episodes(state, id).await;
30            invalidate_member_workbench(state, id).await;
31        }
32    };
33    let _ = tokio::join!(
34        invalidate_manga_episode_caches(state, manga_id),
35        invalidate_uploaded_submit_caches(state),
36        invalidate_task_tracking(state),
37        invalidate_episode_statistics(state),
38        member_cache,
39    );
40}
41
42/// 漫画增删改后失效缓存
43pub async fn on_manga_mutated(state: &AppState, manga_id: Option<i32>) {
44    invalidate_manga_names(state).await;
45    invalidate_manga_page_caches(state).await;
46    invalidate_magazine_manga_caches(state).await;
47    invalidate_all_member_workbenches(state).await;
48    if let Some(id) = manga_id {
49        invalidate_manga_episode_caches(state, id).await;
50        invalidate_uploaded_submit_caches(state).await;
51        invalidate_task_tracking(state).await;
52        invalidate_episode_statistics(state).await;
53    }
54}
55
56/// 组员数据突变后失效缓存
57pub async fn on_member_mutated(state: &AppState, member_ids: &[i32]) {
58    invalidate_member_all(state).await;
59    invalidate_member_page_caches(state).await;
60    for &id in member_ids {
61        invalidate_auth_snapshot(state, id).await;
62        invalidate_member_episodes(state, id).await;
63        invalidate_member_workbench(state, id).await;
64    }
65}
66
67/// 常驻变更且影响话数岗位后失效缓存
68pub async fn on_station_mutated(state: &AppState, manga_id: i32, member_id: i32) {
69    invalidate_stationed_mangas(state, member_id).await;
70    on_episode_mutated(state, manga_id, &[member_id]).await;
71}
72
73/// 作者名/杂志名变更影响漫画列表筛选时失效
74pub async fn on_author_or_magazine_renamed(state: &AppState) {
75    invalidate_manga_page_caches(state).await;
76    invalidate_magazine_manga_caches(state).await;
77}