]> Untitled Git - lemmy.git/blob - crates/db_views_moderator/src/mod_ban_view.rs
Use typed-builder crate for queries (#2379)
[lemmy.git] / crates / db_views_moderator / src / mod_ban_view.rs
1 use crate::structs::ModBanView;
2 use diesel::{result::Error, *};
3 use lemmy_db_schema::{
4   newtypes::PersonId,
5   schema::{mod_ban, person, person_alias_1},
6   source::{
7     moderator::ModBan,
8     person::{Person, PersonAlias1, PersonSafe, PersonSafeAlias1},
9   },
10   traits::{ToSafe, ViewToVec},
11   utils::limit_and_offset,
12 };
13
14 type ModBanViewTuple = (ModBan, PersonSafe, PersonSafeAlias1);
15
16 impl ModBanView {
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_ban::table
24       .inner_join(person::table.on(mod_ban::mod_person_id.eq(person::id)))
25       .inner_join(person_alias_1::table.on(mod_ban::other_person_id.eq(person_alias_1::id)))
26       .select((
27         mod_ban::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_ban::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_ban::when_.desc())
43       .load::<ModBanViewTuple>(conn)?;
44
45     Ok(Self::from_tuple_to_vec(res))
46   }
47 }
48
49 impl ViewToVec for ModBanView {
50   type DbTuple = ModBanViewTuple;
51   fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
52     items
53       .into_iter()
54       .map(|a| Self {
55         mod_ban: a.0,
56         moderator: a.1,
57         banned_person: a.2,
58       })
59       .collect::<Vec<Self>>()
60   }
61 }