]> Untitled Git - lemmy.git/blob - crates/db_views_moderator/src/mod_ban_view.rs
Fixing modlog not showing bans and adds. Fixes #1376
[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, user_, user_alias_1},
5   source::{
6     moderator::ModBan,
7     user::{UserAlias1, UserSafe, UserSafeAlias1, User_},
8   },
9 };
10 use serde::Serialize;
11
12 #[derive(Debug, Serialize, Clone)]
13 pub struct ModBanView {
14   pub mod_ban: ModBan,
15   pub moderator: UserSafe,
16   pub banned_user: UserSafeAlias1,
17 }
18
19 type ModBanViewTuple = (ModBan, UserSafe, UserSafeAlias1);
20
21 impl ModBanView {
22   pub fn list(
23     conn: &PgConnection,
24     mod_user_id: Option<i32>,
25     page: Option<i64>,
26     limit: Option<i64>,
27   ) -> Result<Vec<Self>, Error> {
28     let mut query = mod_ban::table
29       .inner_join(user_::table.on(mod_ban::mod_user_id.eq(user_::id)))
30       .inner_join(user_alias_1::table.on(mod_ban::other_user_id.eq(user_alias_1::id)))
31       .select((
32         mod_ban::all_columns,
33         User_::safe_columns_tuple(),
34         UserAlias1::safe_columns_tuple(),
35       ))
36       .into_boxed();
37
38     if let Some(mod_user_id) = mod_user_id {
39       query = query.filter(mod_ban::mod_user_id.eq(mod_user_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_ban::when_.desc())
48       .load::<ModBanViewTuple>(conn)?;
49
50     Ok(Self::from_tuple_to_vec(res))
51   }
52 }
53
54 impl ViewToVec for ModBanView {
55   type DbTuple = ModBanViewTuple;
56   fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
57     items
58       .iter()
59       .map(|a| Self {
60         mod_ban: a.0.to_owned(),
61         moderator: a.1.to_owned(),
62         banned_user: a.2.to_owned(),
63       })
64       .collect::<Vec<Self>>()
65   }
66 }