airlab_lib/model/
view_member.rs1use 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}