cyfs_core/app/
default_app.rs

1use crate::coreobj::CoreObjectType;
2use crate::DecAppId;
3use cyfs_base::*;
4use std::collections::{hash_map, HashMap};
5use serde::Serialize;
6
7// 默认app的描述信息
8#[derive(RawEncode, RawDecode, Clone, Debug, Serialize)]
9pub struct DefaultAppInfo {
10    pub name: String,
11    pub desc: String,
12    pub copyright: String,
13    pub dec_id: DecAppId,
14}
15
16#[derive(RawEncode, RawDecode, Clone, Serialize)]
17pub struct DefaultAppListDescContent {
18    id: String,
19}
20
21impl DescContent for DefaultAppListDescContent {
22    fn obj_type() -> u16 {
23        CoreObjectType::DefaultAppList as u16
24    }
25
26    type OwnerType = Option<ObjectId>;
27    type AreaType = SubDescNone;
28    type AuthorType = SubDescNone;
29    type PublicKeyType = SubDescNone;
30}
31
32#[derive(RawEncode, RawDecode, Clone, Serialize)]
33pub struct DefaultAppListContent {
34    list: HashMap<String, DefaultAppInfo>,
35}
36
37impl BodyContent for DefaultAppListContent {}
38
39type DefaultAppListType = NamedObjType<DefaultAppListDescContent, DefaultAppListContent>;
40type DefaultAppListBuilder = NamedObjectBuilder<DefaultAppListDescContent, DefaultAppListContent>;
41type DefaultAppListDesc = NamedObjectDesc<DefaultAppListDescContent>;
42
43pub type DefaultAppListId = NamedObjectId<DefaultAppListType>;
44pub type DefaultAppList = NamedObjectBase<DefaultAppListType>;
45
46pub trait DefaultAppListObj {
47    fn create(owner: ObjectId, id: &str) -> Self;
48    fn id(&self) -> &str;
49
50    fn set(&mut self, group: &str, app: DefaultAppInfo);
51    fn remove(&mut self, group: &str, dec_id: Option<DecAppId>) -> Option<DefaultAppInfo>;
52    fn app_list(&self) -> &HashMap<String, DefaultAppInfo>;
53    fn get(&self, group: &str) -> Option<&DefaultAppInfo>;
54
55    fn generate_id(owner: ObjectId, id: &str) -> ObjectId;
56}
57
58impl DefaultAppListObj for DefaultAppList {
59    fn create(owner: ObjectId, id: &str) -> Self {
60        let body = DefaultAppListContent {
61            list: HashMap::new(),
62        };
63        let desc = DefaultAppListDescContent { id: id.to_owned() };
64        DefaultAppListBuilder::new(desc, body)
65            .owner(owner)
66            .no_create_time()
67            .build()
68    }
69
70    fn id(&self) -> &str {
71        &self.desc().content().id
72    }
73
74    fn set(&mut self, group: &str, info: DefaultAppInfo) {
75        match self
76            .body_mut_expect("")
77            .content_mut()
78            .list
79            .entry(group.to_owned())
80        {
81            hash_map::Entry::Vacant(v) => {
82                info!(
83                    "will add new default app for group={}, app={:?}",
84                    group, info
85                );
86                v.insert(info);
87            }
88            hash_map::Entry::Occupied(mut v) => {
89                let c = v.get_mut();
90                if c.dec_id != info.dec_id {
91                    info!(
92                        "will change default app for group={}, old={:?}, new app={:?}",
93                        group, c, info
94                    );
95                    *c = info;
96                } else {
97                    info!(
98                        "will update default app info for group={}, app={:?}",
99                        group, info
100                    );
101                    *c = info;
102                }
103            }
104        }
105
106        self.body_mut_expect("")
107            .increase_update_time(bucky_time_now());
108    }
109
110    fn remove(&mut self, group: &str, dec_id: Option<DecAppId>) -> Option<DefaultAppInfo> {
111        let c = self.body_mut_expect("").content_mut().list.get(group);
112        if c.is_none() {
113            warn!(
114                "revoke defualt app for group but not found! group={}",
115                group
116            );
117            return None;
118        }
119
120        let c = c.unwrap();
121
122        let ret = match dec_id {
123            Some(id) => {
124                if c.dec_id == id {
125                    info!("will revoke default app for group={}, app={:?}", group, c);
126                    drop(c);
127                    self.body_mut_expect("").content_mut().list.remove(group)
128                } else {
129                    error!("revoke default app for group but dec_id not match! group={}, expect={}, got={}", group, id, c.dec_id);
130                    None
131                }
132            }
133            None => {
134                info!("will revoke default app for group={}, app={:?}", group, c);
135                drop(c);
136                self.body_mut_expect("").content_mut().list.remove(group)
137            }
138        };
139
140        if ret.is_some() {
141            self.body_mut_expect("")
142                .increase_update_time(bucky_time_now());
143        }
144
145        ret
146    }
147
148    fn get(&self, group: &str) -> Option<&DefaultAppInfo> {
149        self.body_expect("").content().list.get(group)
150    }
151
152    fn app_list(&self) -> &HashMap<String, DefaultAppInfo> {
153        &self.body_expect("").content().list
154    }
155
156    fn generate_id(owner: ObjectId, id: &str) -> ObjectId {
157        Self::create(owner, id).desc().calculate_id()
158    }
159}