3 schema::{federation_allowlist, federation_blocklist, instance},
4 source::instance::{Instance, InstanceForm},
5 utils::{get_conn, naive_now, DbPool},
7 use diesel::{dsl::insert_into, result::Error, ExpressionMethods, QueryDsl};
8 use diesel_async::{AsyncPgConnection, RunQueryDsl};
9 use lemmy_utils::utils::generate_domain_url;
13 async fn create_from_form_conn(
14 conn: &mut AsyncPgConnection,
16 ) -> Result<Self, Error> {
17 // Do upsert on domain name conflict
18 insert_into(instance::table)
20 .on_conflict(instance::domain)
23 .get_result::<Self>(conn)
26 pub async fn create(pool: &DbPool, domain: &str) -> Result<Self, Error> {
27 let conn = &mut get_conn(pool).await?;
28 Self::create_conn(conn, domain).await
30 pub async fn create_from_actor_id(pool: &DbPool, actor_id: &Url) -> Result<Self, Error> {
31 let domain = &generate_domain_url(actor_id).expect("actor id missing a domain");
32 Self::create(pool, domain).await
34 pub async fn create_conn(conn: &mut AsyncPgConnection, domain: &str) -> Result<Self, Error> {
35 let form = InstanceForm {
36 domain: domain.to_string(),
37 updated: Some(naive_now()),
39 Self::create_from_form_conn(conn, &form).await
41 pub async fn delete(pool: &DbPool, instance_id: InstanceId) -> Result<usize, Error> {
42 let conn = &mut get_conn(pool).await?;
43 diesel::delete(instance::table.find(instance_id))
47 pub async fn delete_all(pool: &DbPool) -> Result<usize, Error> {
48 let conn = &mut get_conn(pool).await?;
49 diesel::delete(instance::table).execute(conn).await
51 pub async fn allowlist(pool: &DbPool) -> Result<Vec<String>, Error> {
52 let conn = &mut get_conn(pool).await?;
54 .inner_join(federation_allowlist::table)
55 .select(instance::domain)
60 pub async fn blocklist(pool: &DbPool) -> Result<Vec<String>, Error> {
61 let conn = &mut get_conn(pool).await?;
63 .inner_join(federation_blocklist::table)
64 .select(instance::domain)
69 pub async fn linked(pool: &DbPool) -> Result<Vec<String>, Error> {
70 let conn = &mut get_conn(pool).await?;
72 .left_join(federation_blocklist::table)
73 .filter(federation_blocklist::id.is_null())
74 .select(instance::domain)