Skip to main content

yggdrasil/tasks/
ip_purge.rs

1//! IP 与用户代理信息定期清理后台任务。
2//!
3//! 仅在 `server` feature 启用时编译,每天运行一次。
4
5use std::time::Duration;
6
7use tokio::time::interval;
8
9use crate::db::pool::get_conn;
10
11/// 启动 IP 信息清理循环,每天将 90 天前的评论的 `ip_address` 与 `user_agent` 置空。
12pub async fn run_purge() {
13    // 每天触发一次
14    let mut ticker = interval(Duration::from_secs(86400));
15    loop {
16        match get_conn().await {
17            Ok(client) => {
18                // 仅清理 90 天前且仍保留 IP 的评论
19                if let Err(e) = client
20                    .execute("UPDATE comments SET ip_address = NULL, user_agent = NULL WHERE created_at < NOW() - INTERVAL '90 days' AND ip_address IS NOT NULL", &[])
21                    .await
22                {
23                    tracing::error!("IP purge error: {:?}", e);
24                }
25            }
26            Err(e) => {
27                tracing::error!("Failed to get DB connection for IP purge: {:?}", e);
28            }
29        }
30        ticker.tick().await;
31    }
32}