]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/instance.rs
Moving settings to Database. (#2492)
[lemmy.git] / crates / db_schema / src / impls / instance.rs
1 use crate::{
2   newtypes::InstanceId,
3   schema::{federation_allowlist, federation_blocklist, instance},
4   source::instance::{Instance, InstanceForm},
5   utils::naive_now,
6 };
7 use diesel::{dsl::*, result::Error, *};
8 use lemmy_utils::utils::generate_domain_url;
9 use url::Url;
10
11 impl Instance {
12   fn create_from_form(conn: &mut PgConnection, form: &InstanceForm) -> Result<Self, Error> {
13     // Do upsert on domain name conflict
14     insert_into(instance::table)
15       .values(form)
16       .on_conflict(instance::domain)
17       .do_update()
18       .set(form)
19       .get_result::<Self>(conn)
20   }
21   pub fn create(conn: &mut PgConnection, domain: &str) -> Result<Self, Error> {
22     let form = InstanceForm {
23       domain: domain.to_string(),
24       updated: Some(naive_now()),
25     };
26     Self::create_from_form(conn, &form)
27   }
28   pub fn create_from_actor_id(conn: &mut PgConnection, actor_id: &Url) -> Result<Self, Error> {
29     let domain = &generate_domain_url(actor_id).expect("actor id missing a domain");
30     Self::create(conn, domain)
31   }
32   pub fn delete(conn: &mut PgConnection, instance_id: InstanceId) -> Result<usize, Error> {
33     diesel::delete(instance::table.find(instance_id)).execute(conn)
34   }
35   pub fn delete_all(conn: &mut PgConnection) -> Result<usize, Error> {
36     diesel::delete(instance::table).execute(conn)
37   }
38   pub fn allowlist(conn: &mut PgConnection) -> Result<Vec<String>, Error> {
39     instance::table
40       .inner_join(federation_allowlist::table)
41       .select(instance::domain)
42       .load::<String>(conn)
43   }
44
45   pub fn blocklist(conn: &mut PgConnection) -> Result<Vec<String>, Error> {
46     instance::table
47       .inner_join(federation_blocklist::table)
48       .select(instance::domain)
49       .load::<String>(conn)
50   }
51
52   pub fn linked(conn: &mut PgConnection) -> Result<Vec<String>, Error> {
53     instance::table
54       .left_join(federation_blocklist::table)
55       .filter(federation_blocklist::id.is_null())
56       .select(instance::domain)
57       .load::<String>(conn)
58   }
59 }