]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/site.rs
Check user accepted before sending jwt in password reset (fixes #2591) (#2597)
[lemmy.git] / crates / db_schema / src / impls / site.rs
1 use crate::{
2   newtypes::{DbUrl, SiteId},
3   schema::site::dsl::{actor_id, id, site},
4   source::{
5     actor_language::SiteLanguage,
6     site::{Site, SiteInsertForm, SiteUpdateForm},
7   },
8   traits::Crud,
9   utils::{get_conn, DbPool},
10 };
11 use diesel::{dsl::insert_into, result::Error, ExpressionMethods, QueryDsl};
12 use diesel_async::RunQueryDsl;
13 use url::Url;
14
15 #[async_trait]
16 impl Crud for Site {
17   type InsertForm = SiteInsertForm;
18   type UpdateForm = SiteUpdateForm;
19   type IdType = SiteId;
20
21   async fn read(pool: &DbPool, _site_id: SiteId) -> Result<Self, Error> {
22     let conn = &mut get_conn(pool).await?;
23     site.first::<Self>(conn).await
24   }
25
26   async fn create(pool: &DbPool, form: &Self::InsertForm) -> Result<Self, Error> {
27     let conn = &mut get_conn(pool).await?;
28     let site_ = insert_into(site)
29       .values(form)
30       .on_conflict(actor_id)
31       .do_update()
32       .set(form)
33       .get_result::<Self>(conn)
34       .await?;
35
36     // initialize with all languages
37     SiteLanguage::update(pool, vec![], &site_).await?;
38     Ok(site_)
39   }
40
41   async fn update(
42     pool: &DbPool,
43     site_id: SiteId,
44     new_site: &Self::UpdateForm,
45   ) -> Result<Self, Error> {
46     let conn = &mut get_conn(pool).await?;
47     diesel::update(site.find(site_id))
48       .set(new_site)
49       .get_result::<Self>(conn)
50       .await
51   }
52
53   async fn delete(pool: &DbPool, site_id: SiteId) -> Result<usize, Error> {
54     let conn = &mut get_conn(pool).await?;
55     diesel::delete(site.find(site_id)).execute(conn).await
56   }
57 }
58
59 impl Site {
60   pub async fn read_from_apub_id(pool: &DbPool, object_id: Url) -> Result<Option<Self>, Error> {
61     let conn = &mut get_conn(pool).await?;
62     let object_id: DbUrl = object_id.into();
63     Ok(
64       site
65         .filter(actor_id.eq(object_id))
66         .first::<Site>(conn)
67         .await
68         .ok()
69         .map(Into::into),
70     )
71   }
72
73   // TODO this needs fixed
74   pub async fn read_remote_sites(pool: &DbPool) -> Result<Vec<Self>, Error> {
75     let conn = &mut get_conn(pool).await?;
76     site.order_by(id).offset(1).get_results::<Self>(conn).await
77   }
78 }