]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/federation_blocklist.rs
Make functions work with both connection and pool (#3420)
[lemmy.git] / crates / db_schema / src / impls / federation_blocklist.rs
1 use crate::{
2   schema::federation_blocklist,
3   source::{
4     federation_blocklist::{FederationBlockList, FederationBlockListForm},
5     instance::Instance,
6   },
7   utils::{get_conn, DbPool},
8 };
9 use diesel::{dsl::insert_into, result::Error};
10 use diesel_async::{AsyncPgConnection, RunQueryDsl};
11
12 impl FederationBlockList {
13   pub async fn replace(pool: &mut DbPool<'_>, list_opt: Option<Vec<String>>) -> Result<(), Error> {
14     let conn = &mut get_conn(pool).await?;
15     conn
16       .build_transaction()
17       .run(|conn| {
18         Box::pin(async move {
19           if let Some(list) = list_opt {
20             Self::clear(conn).await?;
21
22             for domain in list {
23               // Upsert all of these as instances
24               let instance = Instance::read_or_create(&mut conn.into(), domain).await?;
25
26               let form = FederationBlockListForm {
27                 instance_id: instance.id,
28                 updated: None,
29               };
30               insert_into(federation_blocklist::table)
31                 .values(form)
32                 .get_result::<Self>(conn)
33                 .await?;
34             }
35             Ok(())
36           } else {
37             Ok(())
38           }
39         }) as _
40       })
41       .await
42   }
43
44   async fn clear(conn: &mut AsyncPgConnection) -> Result<usize, Error> {
45     diesel::delete(federation_blocklist::table)
46       .execute(conn)
47       .await
48   }
49 }