]> Untitled Git - lemmy.git/blob - crates/db_views_moderator/src/mod_add_view.rs
Add cargo feature for building lemmy_api_common with mininum deps (#2243)
[lemmy.git] / crates / db_views_moderator / src / mod_add_view.rs
1 use crate::structs::ModAddView;
2 use diesel::{result::Error, *};
3 use lemmy_db_schema::{
4   newtypes::PersonId,
5   schema::{mod_add, person, person_alias_1},
6   source::{
7     moderator::ModAdd,
8     person::{Person, PersonAlias1, PersonSafe, PersonSafeAlias1},
9   },
10   traits::{ToSafe, ViewToVec},
11   utils::limit_and_offset,
12 };
13
14 type ModAddViewTuple = (ModAdd, PersonSafe, PersonSafeAlias1);
15
16 impl ModAddView {
17   pub fn list(
18     conn: &PgConnection,
19     mod_person_id: Option<PersonId>,
20     page: Option<i64>,
21     limit: Option<i64>,
22   ) -> Result<Vec<Self>, Error> {
23     let mut query = mod_add::table
24       .inner_join(person::table.on(mod_add::mod_person_id.eq(person::id)))
25       .inner_join(person_alias_1::table.on(mod_add::other_person_id.eq(person_alias_1::id)))
26       .select((
27         mod_add::all_columns,
28         Person::safe_columns_tuple(),
29         PersonAlias1::safe_columns_tuple(),
30       ))
31       .into_boxed();
32
33     if let Some(mod_person_id) = mod_person_id {
34       query = query.filter(mod_add::mod_person_id.eq(mod_person_id));
35     };
36
37     let (limit, offset) = limit_and_offset(page, limit);
38
39     let res = query
40       .limit(limit)
41       .offset(offset)
42       .order_by(mod_add::when_.desc())
43       .load::<ModAddViewTuple>(conn)?;
44
45     Ok(Self::from_tuple_to_vec(res))
46   }
47 }
48
49 impl ViewToVec for ModAddView {
50   type DbTuple = ModAddViewTuple;
51   fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
52     items
53       .iter()
54       .map(|a| Self {
55         mod_add: a.0.to_owned(),
56         moderator: a.1.to_owned(),
57         modded_person: a.2.to_owned(),
58       })
59       .collect::<Vec<Self>>()
60   }
61 }