]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/site.rs
implement language tags for site/community in db and api (#2434)
[lemmy.git] / crates / db_schema / src / impls / site.rs
1 use crate::{
2   newtypes::{DbUrl, SiteId},
3   source::{actor_language::SiteLanguage, site::*},
4   traits::Crud,
5 };
6 use diesel::{dsl::*, result::Error, *};
7 use url::Url;
8
9 impl Crud for Site {
10   type Form = SiteForm;
11   type IdType = SiteId;
12   fn read(conn: &mut PgConnection, _site_id: SiteId) -> Result<Self, Error> {
13     use crate::schema::site::dsl::*;
14     site.first::<Self>(conn)
15   }
16
17   fn create(conn: &mut PgConnection, new_site: &SiteForm) -> Result<Self, Error> {
18     use crate::schema::site::dsl::*;
19     let site_ = insert_into(site)
20       .values(new_site)
21       .get_result::<Self>(conn)?;
22
23     // initialize with all languages
24     SiteLanguage::update(conn, vec![], site_.id)?;
25     Ok(site_)
26   }
27
28   fn update(conn: &mut PgConnection, site_id: SiteId, new_site: &SiteForm) -> Result<Self, Error> {
29     use crate::schema::site::dsl::*;
30     diesel::update(site.find(site_id))
31       .set(new_site)
32       .get_result::<Self>(conn)
33   }
34
35   fn delete(conn: &mut PgConnection, site_id: SiteId) -> Result<usize, Error> {
36     use crate::schema::site::dsl::*;
37     diesel::delete(site.find(site_id)).execute(conn)
38   }
39 }
40
41 impl Site {
42   pub fn read_local(conn: &mut PgConnection) -> Result<Self, Error> {
43     use crate::schema::site::dsl::*;
44     site.order_by(id).first::<Self>(conn)
45   }
46
47   pub fn upsert(conn: &mut PgConnection, site_form: &SiteForm) -> Result<Site, Error> {
48     use crate::schema::site::dsl::*;
49     insert_into(site)
50       .values(site_form)
51       .on_conflict(actor_id)
52       .do_update()
53       .set(site_form)
54       .get_result::<Self>(conn)
55   }
56
57   pub fn read_from_apub_id(conn: &mut PgConnection, object_id: Url) -> Result<Option<Self>, Error> {
58     use crate::schema::site::dsl::*;
59     let object_id: DbUrl = object_id.into();
60     Ok(
61       site
62         .filter(actor_id.eq(object_id))
63         .first::<Site>(conn)
64         .ok()
65         .map(Into::into),
66     )
67   }
68
69   pub fn read_remote_sites(conn: &mut PgConnection) -> Result<Vec<Self>, Error> {
70     use crate::schema::site::dsl::*;
71     site.order_by(id).offset(1).get_results::<Self>(conn)
72   }
73 }