]> Untitled Git - lemmy.git/blob - crates/db_views_moderator/src/mod_ban_view.rs
Merge branch 'split_user_table' into strictly_type_db_ids
[lemmy.git] / crates / db_views_moderator / src / mod_ban_view.rs
1 use diesel::{result::Error, *};
2 use lemmy_db_queries::{limit_and_offset, ToSafe, ViewToVec};
3 use lemmy_db_schema::{
4   schema::{mod_ban, person, person_alias_1},
5   source::{
6     moderator::ModBan,
7     person::{Person, PersonAlias1, PersonSafe, PersonSafeAlias1},
8   },
9   PersonId,
10 };
11 use serde::Serialize;
12
13 #[derive(Debug, Serialize, Clone)]
14 pub struct ModBanView {
15   pub mod_ban: ModBan,
16   pub moderator: PersonSafe,
17   pub banned_person: PersonSafeAlias1,
18 }
19
20 type ModBanViewTuple = (ModBan, PersonSafe, PersonSafeAlias1);
21
22 impl ModBanView {
23   pub fn list(
24     conn: &PgConnection,
25     mod_person_id: Option<PersonId>,
26     page: Option<i64>,
27     limit: Option<i64>,
28   ) -> Result<Vec<Self>, Error> {
29     let mut query = mod_ban::table
30       .inner_join(person::table.on(mod_ban::mod_person_id.eq(person::id)))
31       .inner_join(person_alias_1::table.on(mod_ban::other_person_id.eq(person_alias_1::id)))
32       .select((
33         mod_ban::all_columns,
34         Person::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_ban::mod_person_id.eq(mod_person_id));
41     };
42
43     let (limit, offset) = limit_and_offset(page, limit);
44
45     let res = query
46       .limit(limit)
47       .offset(offset)
48       .order_by(mod_ban::when_.desc())
49       .load::<ModBanViewTuple>(conn)?;
50
51     Ok(Self::from_tuple_to_vec(res))
52   }
53 }
54
55 impl ViewToVec for ModBanView {
56   type DbTuple = ModBanViewTuple;
57   fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
58     items
59       .iter()
60       .map(|a| Self {
61         mod_ban: a.0.to_owned(),
62         moderator: a.1.to_owned(),
63         banned_person: a.2.to_owned(),
64       })
65       .collect::<Vec<Self>>()
66   }
67 }