]> Untitled Git - lemmy.git/blob - crates/db_views_moderator/src/mod_add_community_view.rs
Merge branch 'Mart-Bogdan-1462-jwt-revocation-on-pwd-change' into jwt_revocation_dess
[lemmy.git] / crates / db_views_moderator / src / mod_add_community_view.rs
1 use diesel::{result::Error, *};
2 use lemmy_db_queries::{limit_and_offset, ToSafe, ViewToVec};
3 use lemmy_db_schema::{
4   schema::{community, mod_add_community, person, person_alias_1},
5   source::{
6     community::{Community, CommunitySafe},
7     moderator::ModAddCommunity,
8     person::{Person, PersonAlias1, PersonSafe, PersonSafeAlias1},
9   },
10   CommunityId,
11   PersonId,
12 };
13 use serde::Serialize;
14
15 #[derive(Debug, Serialize, Clone)]
16 pub struct ModAddCommunityView {
17   pub mod_add_community: ModAddCommunity,
18   pub moderator: PersonSafe,
19   pub community: CommunitySafe,
20   pub modded_person: PersonSafeAlias1,
21 }
22
23 type ModAddCommunityViewTuple = (ModAddCommunity, PersonSafe, CommunitySafe, PersonSafeAlias1);
24
25 impl ModAddCommunityView {
26   pub fn list(
27     conn: &PgConnection,
28     community_id: Option<CommunityId>,
29     mod_person_id: Option<PersonId>,
30     page: Option<i64>,
31     limit: Option<i64>,
32   ) -> Result<Vec<Self>, Error> {
33     let mut query = mod_add_community::table
34       .inner_join(person::table.on(mod_add_community::mod_person_id.eq(person::id)))
35       .inner_join(community::table)
36       .inner_join(
37         person_alias_1::table.on(mod_add_community::other_person_id.eq(person_alias_1::id)),
38       )
39       .select((
40         mod_add_community::all_columns,
41         Person::safe_columns_tuple(),
42         Community::safe_columns_tuple(),
43         PersonAlias1::safe_columns_tuple(),
44       ))
45       .into_boxed();
46
47     if let Some(mod_person_id) = mod_person_id {
48       query = query.filter(mod_add_community::mod_person_id.eq(mod_person_id));
49     };
50
51     if let Some(community_id) = community_id {
52       query = query.filter(mod_add_community::community_id.eq(community_id));
53     };
54
55     let (limit, offset) = limit_and_offset(page, limit);
56
57     let res = query
58       .limit(limit)
59       .offset(offset)
60       .order_by(mod_add_community::when_.desc())
61       .load::<ModAddCommunityViewTuple>(conn)?;
62
63     Ok(Self::from_tuple_to_vec(res))
64   }
65 }
66
67 impl ViewToVec for ModAddCommunityView {
68   type DbTuple = ModAddCommunityViewTuple;
69   fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
70     items
71       .iter()
72       .map(|a| Self {
73         mod_add_community: a.0.to_owned(),
74         moderator: a.1.to_owned(),
75         community: a.2.to_owned(),
76         modded_person: a.3.to_owned(),
77       })
78       .collect::<Vec<Self>>()
79   }
80 }