]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/site.rs
Implement instance actor (#1798)
[lemmy.git] / crates / db_schema / src / impls / site.rs
1 use crate::{source::site::*, traits::Crud, DbUrl};
2 use diesel::{dsl::*, result::Error, *};
3 use url::Url;
4
5 impl Crud for Site {
6   type Form = SiteForm;
7   type IdType = i32;
8   fn read(conn: &PgConnection, _site_id: i32) -> Result<Self, Error> {
9     use crate::schema::site::dsl::*;
10     site.first::<Self>(conn)
11   }
12
13   fn create(conn: &PgConnection, new_site: &SiteForm) -> Result<Self, Error> {
14     use crate::schema::site::dsl::*;
15     insert_into(site).values(new_site).get_result::<Self>(conn)
16   }
17
18   fn update(conn: &PgConnection, site_id: i32, new_site: &SiteForm) -> Result<Self, Error> {
19     use crate::schema::site::dsl::*;
20     diesel::update(site.find(site_id))
21       .set(new_site)
22       .get_result::<Self>(conn)
23   }
24   fn delete(conn: &PgConnection, site_id: i32) -> Result<usize, Error> {
25     use crate::schema::site::dsl::*;
26     diesel::delete(site.find(site_id)).execute(conn)
27   }
28 }
29
30 impl Site {
31   pub fn read_local_site(conn: &PgConnection) -> Result<Self, Error> {
32     use crate::schema::site::dsl::*;
33     site.order_by(id).first::<Self>(conn)
34   }
35
36   pub fn upsert(conn: &PgConnection, site_form: &SiteForm) -> Result<Site, Error> {
37     use crate::schema::site::dsl::*;
38     insert_into(site)
39       .values(site_form)
40       .on_conflict(actor_id)
41       .do_update()
42       .set(site_form)
43       .get_result::<Self>(conn)
44   }
45
46   pub fn read_from_apub_id(conn: &PgConnection, object_id: Url) -> Result<Option<Self>, Error> {
47     use crate::schema::site::dsl::*;
48     let object_id: DbUrl = object_id.into();
49     Ok(
50       site
51         .filter(actor_id.eq(object_id))
52         .first::<Site>(conn)
53         .ok()
54         .map(Into::into),
55     )
56   }
57
58   pub fn read_remote_sites(conn: &PgConnection) -> Result<Vec<Self>, Error> {
59     use crate::schema::site::dsl::*;
60     site.order_by(id).offset(1).get_results::<Self>(conn)
61   }
62 }