]> Untitled Git - lemmy.git/blob - crates/db_views_moderator/src/mod_add_view.rs
~80% done
[lemmy.git] / crates / db_views_moderator / src / mod_add_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_add, person, person_alias_1},
5   source::{
6     moderator::ModAdd,
7     person::{PersonAlias1, PersonSafe, PersonSafeAlias1, Person},
8   },
9 };
10 use serde::Serialize;
11
12 #[derive(Debug, Serialize, Clone)]
13 pub struct ModAddView {
14   pub mod_add: ModAdd,
15   pub moderator: PersonSafe,
16   pub modded_person: PersonSafeAlias1,
17 }
18
19 type ModAddViewTuple = (ModAdd, PersonSafe, PersonSafeAlias1);
20
21 impl ModAddView {
22   pub fn list(
23     conn: &PgConnection,
24     mod_person_id: Option<i32>,
25     page: Option<i64>,
26     limit: Option<i64>,
27   ) -> Result<Vec<Self>, Error> {
28     let mut query = mod_add::table
29       .inner_join(person::table.on(mod_add::mod_person_id.eq(person::id)))
30       .inner_join(person_alias_1::table.on(mod_add::other_person_id.eq(person_alias_1::id)))
31       .select((
32         mod_add::all_columns,
33         Person::safe_columns_tuple(),
34         PersonAlias1::safe_columns_tuple(),
35       ))
36       .into_boxed();
37
38     if let Some(mod_person_id) = mod_person_id {
39       query = query.filter(mod_add::mod_person_id.eq(mod_person_id));
40     };
41
42     let (limit, offset) = limit_and_offset(page, limit);
43
44     let res = query
45       .limit(limit)
46       .offset(offset)
47       .order_by(mod_add::when_.desc())
48       .load::<ModAddViewTuple>(conn)?;
49
50     Ok(Self::from_tuple_to_vec(res))
51   }
52 }
53
54 impl ViewToVec for ModAddView {
55   type DbTuple = ModAddViewTuple;
56   fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
57     items
58       .iter()
59       .map(|a| Self {
60         mod_add: a.0.to_owned(),
61         moderator: a.1.to_owned(),
62         modded_person: a.2.to_owned(),
63       })
64       .collect::<Vec<Self>>()
65   }
66 }