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