airlab_lib/model/
view_member.rs

1use crate::ctx::Ctx;
2use crate::model::ModelManager;
3use crate::model::Result;
4use crate::model::member::{MemberBmc, MemberFilter};
5use crate::model::user::{User, UserBmc};
6use modql::filter::ListOptions;
7use serde::{Deserialize, Serialize};
8use std::collections::HashMap;
9
10#[derive(Serialize, Deserialize, Debug, Clone, Default)]
11#[serde(deny_unknown_fields)]
12pub struct ViewMember {
13    pub id: i32,
14    pub group_id: i32,
15    pub user_id: i32,
16    pub created_at: chrono::NaiveDateTime,
17    #[serde(rename = "isActive")]
18    pub is_active: bool,
19    #[serde(rename = "allPanels")]
20    pub all_panels: bool,
21    pub role: i16,
22    pub updated_at: chrono::NaiveDateTime,
23    pub url: Option<String>,
24    pub user: User,
25}
26
27pub struct ViewMemberBmc;
28
29impl ViewMemberBmc {
30    pub async fn list(
31        ctx: &Ctx,
32        mm: &ModelManager,
33        filters: Option<Vec<MemberFilter>>,
34        list_options: Option<ListOptions>,
35    ) -> Result<Vec<ViewMember>> {
36        let members = MemberBmc::list(ctx, mm, filters, list_options).await?;
37        let mut returns = vec![];
38        let mut user_map = HashMap::new();
39        let mem_map: HashMap<i32, i32> = members.iter().map(|e| (e.user_id, e.id)).collect();
40
41        let op = ListOptions {
42            limit: Some(10_000),
43            ..Default::default()
44        };
45        let users: Vec<User> = UserBmc::list(ctx, mm, None, Some(op)).await?;
46        for user in users {
47            let member_id = mem_map.get(&user.id).unwrap_or(&0);
48            user_map.insert(*member_id, user);
49        }
50        for member in members {
51            let user = match user_map.get(&member.id) {
52                Some(v) => v.clone(),
53                None => User::default(),
54            };
55            returns.push(ViewMember {
56                id: member.id,
57                group_id: member.group_id,
58                created_at: member.created_at.naive_utc(),
59                is_active: member.is_active,
60                all_panels: member.all_panels,
61                role: member.role,
62                updated_at: member.updated_at.naive_utc(),
63                user_id: member.user_id,
64                url: None,
65                user,
66            });
67        }
68
69        Ok(returns)
70    }
71    pub async fn get(ctx: &Ctx, mm: &ModelManager, id: i32) -> Result<ViewMember> {
72        let member = MemberBmc::get(ctx, mm, id).await?;
73        Ok(ViewMember {
74            id: member.id,
75            group_id: member.group_id,
76            created_at: member.created_at.naive_utc(),
77            is_active: member.is_active,
78            all_panels: member.all_panels,
79            role: member.role,
80            updated_at: member.updated_at.naive_utc(),
81            user_id: member.user_id,
82            url: None,
83            user: User::default(),
84        })
85    }
86}
87
88#[cfg(test)]
89mod tests {
90    use super::*;
91    use anyhow::Result;
92
93    #[ignore]
94    #[test]
95    fn test_view_member_deserialize() -> Result<()> {
96        let g: ViewMember = serde_json::from_str(
97            r###"
98    {
99      "created_at": "2021-03-04T17:37:27.391811",
100      "group_id": 1,
101      "id": 1,
102      "is_active": true,
103      "role": 100,
104      "updated_at": "2021-03-04T17:37:27.391811",
105      "user": {
106        "email": "anton.rau@gmail.com",
107        "id": 1,
108        "name": "Anton Rau"
109      },
110      "user_id": 1
111    }
112
113
114
115            "###,
116        )?;
117        println!("{g:?}");
118        Ok(())
119    }
120}