revolt_database/models/policy_changes/ops/
mongodb.rs

1use bson::to_bson;
2use iso8601_timestamp::Timestamp;
3use revolt_result::Result;
4
5use crate::MongoDb;
6use crate::PolicyChange;
7use crate::User;
8
9use super::AbstractPolicyChange;
10
11static COL: &str = "policy_changes";
12
13#[async_trait]
14impl AbstractPolicyChange for MongoDb {
15    /// Fetch all policy changes
16    async fn fetch_policy_changes(&self) -> Result<Vec<PolicyChange>> {
17        query!(self, find, COL, doc! {})
18    }
19
20    /// Acknowledge policy changes
21    async fn acknowledge_policy_changes(&self, user_id: &str) -> Result<()> {
22        let latest_policy = self
23            .fetch_policy_changes()
24            .await?
25            .into_iter()
26            .map(|policy| policy.created_time)
27            .max()
28            .unwrap_or(Timestamp::UNIX_EPOCH);
29
30        self.col::<User>("users")
31            .update_one(
32                doc! {
33                    "_id": user_id
34                },
35                doc! {
36                    "$set": {
37                        "last_acknowledged_policy_change": to_bson(&latest_policy)
38                            .map_err(|_| create_database_error!("to_bson", "timestamp"))?
39                    }
40                },
41            )
42            .await
43            .map(|_| ())
44            .map_err(|_| create_database_error!("update_one", COL))
45    }
46}