revolt_database/models/policy_changes/ops/
mongodb.rs1use 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 async fn fetch_policy_changes(&self) -> Result<Vec<PolicyChange>> {
17 query!(self, find, COL, doc! {})
18 }
19
20 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}