bios_iam/
iam_enumeration.rs

1use std::str::FromStr;
2
3use serde::{Deserialize, Serialize};
4use strum::Display;
5use tardis::basic::error::TardisError;
6use tardis::basic::result::TardisResult;
7use tardis::db::sea_orm;
8use tardis::db::sea_orm::{DbErr, QueryResult, TryGetError, TryGetable};
9use tardis::web::poem_openapi;
10
11#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum)]
12pub enum IamRoleKind {
13    System,
14    Tenant,
15    App,
16}
17
18impl IamRoleKind {
19    pub fn from_int(s: i16) -> TardisResult<IamRoleKind> {
20        match s {
21            0 => Ok(IamRoleKind::System),
22            1 => Ok(IamRoleKind::Tenant),
23            2 => Ok(IamRoleKind::App),
24            _ => Err(TardisError::format_error(&format!("invalid IamRoleKind: {s}"), "406-rbum-*-enum-init-error")),
25        }
26    }
27
28    pub fn to_int(&self) -> i16 {
29        match self {
30            IamRoleKind::System => 0,
31            IamRoleKind::Tenant => 1,
32            IamRoleKind::App => 2,
33        }
34    }
35}
36
37impl TryGetable for IamRoleKind {
38    fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> {
39        let s = i16::try_get(res, pre, col)?;
40        IamRoleKind::from_int(s).map_err(|_| TryGetError::DbErr(DbErr::RecordNotFound(format!("{pre}:{col}"))))
41    }
42
43    fn try_get_by<I: sea_orm::ColIdx>(_res: &QueryResult, _index: I) -> Result<Self, TryGetError> {
44        panic!("not implement")
45    }
46}
47
48#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
49pub enum IamCertKernelKind {
50    UserPwd,
51    MailVCode,
52    PhoneVCode,
53    AkSk,
54}
55
56#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
57pub enum IamCertExtKind {
58    Ldap,
59    OAuth2,
60    /// No configuration exists,can't login in ,\
61    /// supplier can be "gitlab/cmbd-pwd/cmbd-ssh"
62    ThirdParty,
63}
64
65#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
66pub enum IamCertOAuth2Supplier {
67    // Weibo,
68    Github,
69    WechatMp,
70}
71
72impl IamCertOAuth2Supplier {
73    pub fn parse(kind: &str) -> TardisResult<IamCertOAuth2Supplier> {
74        IamCertOAuth2Supplier::from_str(kind).map_err(|_| TardisError::format_error(&format!("not supports OAuth2 kind: {kind}",), "404-iam-cert-oauth-kind-not-exist"))
75    }
76}
77
78#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
79pub enum IamCertTokenKind {
80    TokenDefault,
81    TokenPc,
82    TokenPhone,
83    TokenPad,
84    TokenOauth2,
85}
86
87impl IamCertTokenKind {
88    pub fn parse(kind: &Option<String>) -> IamCertTokenKind {
89        if let Some(kind) = kind {
90            IamCertTokenKind::from_str(kind).unwrap_or(IamCertTokenKind::TokenDefault)
91        } else {
92            IamCertTokenKind::TokenDefault
93        }
94    }
95}
96
97#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
98pub enum IamRelKind {
99    IamAccountRole,
100    IamResRole,
101    IamAccountApp,
102    IamResApi,
103    IamAccountRel,
104    IamCertRel,
105    IamOrgRel,
106
107    IamProductSpec,
108    IamCertProduct,
109    IamCertSpec,
110}
111
112#[derive(Display, Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum)]
113pub enum IamResKind {
114    #[default]
115    Menu,
116    Api,
117    Ele,
118    Product,
119    Spec,
120}
121
122impl IamResKind {
123    pub fn from_int(s: i16) -> TardisResult<IamResKind> {
124        match s {
125            0 => Ok(IamResKind::Menu),
126            1 => Ok(IamResKind::Api),
127            2 => Ok(IamResKind::Ele),
128            3 => Ok(IamResKind::Product),
129            4 => Ok(IamResKind::Spec),
130            _ => Err(TardisError::format_error(&format!("invalid IamResKind: {s}"), "406-rbum-*-enum-init-error")),
131        }
132    }
133
134    pub fn to_int(&self) -> i16 {
135        match self {
136            IamResKind::Menu => 0,
137            IamResKind::Api => 1,
138            IamResKind::Ele => 2,
139            IamResKind::Product => 3,
140            IamResKind::Spec => 4,
141        }
142    }
143}
144
145impl TryGetable for IamResKind {
146    fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> {
147        let s = i16::try_get(res, pre, col)?;
148        IamResKind::from_int(s).map_err(|_| TryGetError::DbErr(DbErr::RecordNotFound(format!("{pre}:{col}"))))
149    }
150
151    fn try_get_by<I: sea_orm::ColIdx>(_res: &QueryResult, _index: I) -> Result<Self, TryGetError> {
152        panic!("not implement")
153    }
154}
155
156#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum)]
157pub enum IamSetKind {
158    Org,
159    Res,
160    Apps,
161}
162
163#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
164pub enum IamSetCateKind {
165    Root,
166    System,
167    Tenant,
168    App,
169}
170
171impl IamSetCateKind {
172    pub fn parse(kind: &str) -> TardisResult<IamSetCateKind> {
173        IamSetCateKind::from_str(kind).map_err(|_| TardisError::format_error(&format!("not supports SetCate kind: {kind}"), "404-iam-cert-set-cate-kind-not-exist"))
174    }
175}
176
177#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
178pub enum Oauth2GrantType {
179    AuthorizationCode,
180    Password,
181    ClientCredentials,
182}
183
184impl Oauth2GrantType {
185    pub fn parse(kind: &str) -> TardisResult<Oauth2GrantType> {
186        Oauth2GrantType::from_str(kind).map_err(|_| TardisError::format_error(&format!("not supports OAuth2 kind: {kind}"), "404-iam-cert-oauth-kind-not-exist"))
187    }
188}
189
190#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString, Default)]
191pub enum WayToAdd {
192    ///同步账号同步凭证
193    #[default]
194    SynchronizeCert,
195    ///同步账号不凭证
196    NoSynchronizeCert,
197}
198
199#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString, Default)]
200pub enum WayToDelete {
201    ///什么也不做
202    #[default]
203    DoNotDelete,
204    ///取消授权
205    DeleteCert,
206    ///禁用账号
207    Disable,
208    ///同步删除账号凭证
209    DeleteAccount,
210}
211
212#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString, Default)]
213pub enum IamAccountLogoutTypeKind {
214    /// 未注销
215    #[default]
216    NotLogout,
217    /// 自动注销
218    AutomaticLogout,
219    /// 人工注销
220    ArtificialLogout,
221}
222
223#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString, Default)]
224pub enum IamAccountLockStateKind {
225    // 未锁定
226    #[default]
227    Unlocked,
228    // 密码锁定
229    PasswordLocked,
230    // 长期未登录锁定
231    LongTimeNoLoginLocked,
232    // 人工锁定
233    ManualLocked,
234}
235
236impl IamAccountLockStateKind {
237    pub fn from_int(s: i16) -> TardisResult<IamAccountLockStateKind> {
238        match s {
239            0 => Ok(IamAccountLockStateKind::Unlocked),
240            1 => Ok(IamAccountLockStateKind::PasswordLocked),
241            2 => Ok(IamAccountLockStateKind::LongTimeNoLoginLocked),
242            3 => Ok(IamAccountLockStateKind::ManualLocked),
243            _ => Err(TardisError::format_error(&format!("invalid IamResKind: {s}"), "406-rbum-*-enum-init-error")),
244        }
245    }
246
247    pub fn to_int(&self) -> i16 {
248        match self {
249            IamAccountLockStateKind::Unlocked => 0,
250            IamAccountLockStateKind::PasswordLocked => 1,
251            IamAccountLockStateKind::LongTimeNoLoginLocked => 2,
252            IamAccountLockStateKind::ManualLocked => 3,
253        }
254    }
255}
256
257impl TryGetable for IamAccountLockStateKind {
258    fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> {
259        let s = i16::try_get(res, pre, col)?;
260        IamAccountLockStateKind::from_int(s).map_err(|_| TryGetError::DbErr(DbErr::RecordNotFound(format!("{pre}:{col}"))))
261    }
262
263    fn try_get_by<I: sea_orm::ColIdx>(_res: &QueryResult, _index: I) -> Result<Self, TryGetError> {
264        panic!("not implement")
265    }
266}
267
268#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
269pub enum IamAccountStatusKind {
270    // 激活
271    Active,
272    // 休眠
273    Dormant,
274    // 注销
275    Logout,
276}
277impl IamAccountStatusKind {
278    pub fn parse(kind: &str) -> TardisResult<IamAccountStatusKind> {
279        IamAccountStatusKind::from_str(kind).map_err(|_| TardisError::format_error(&format!("not account status type kind: {kind}"), "404-iam-account-status-not-exist"))
280    }
281
282    pub fn from_int(s: i16) -> TardisResult<IamAccountStatusKind> {
283        match s {
284            0 => Ok(IamAccountStatusKind::Active),
285            1 => Ok(IamAccountStatusKind::Dormant),
286            2 => Ok(IamAccountStatusKind::Logout),
287            _ => Err(TardisError::format_error(&format!("invalid IamResKind: {s}"), "406-rbum-*-enum-init-error")),
288        }
289    }
290
291    pub fn to_int(&self) -> i16 {
292        match self {
293            IamAccountStatusKind::Active => 0,
294            IamAccountStatusKind::Dormant => 1,
295            IamAccountStatusKind::Logout => 2,
296        }
297    }
298}
299
300impl TryGetable for IamAccountStatusKind {
301    fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> {
302        let s = i16::try_get(res, pre, col)?;
303        IamAccountStatusKind::from_int(s).map_err(|_| TryGetError::DbErr(DbErr::RecordNotFound(format!("{pre}:{col}"))))
304    }
305
306    fn try_get_by<I: sea_orm::ColIdx>(_res: &QueryResult, _index: I) -> Result<Self, TryGetError> {
307        panic!("not implement")
308    }
309}
310
311#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
312pub enum IamConfigDataTypeKind {
313    // 月份
314    Month,
315    // 分钟
316    Minute,
317    // 小时
318    Hour,
319    // 天
320    Day,
321    // 数字
322    Number,
323    // 时间周期
324    DatetimeRange,
325    // 时间段
326    TimeRange,
327    // ip段
328    Ips,
329}
330impl IamConfigDataTypeKind {
331    pub fn parse(kind: &str) -> TardisResult<IamConfigDataTypeKind> {
332        IamConfigDataTypeKind::from_str(kind).map_err(|_| TardisError::format_error(&format!("not config data type kind: {kind}"), "404-iam-config-data-type-not-exist"))
333    }
334
335    pub fn to_int(&self, value: String) -> Option<i64> {
336        match self {
337            IamConfigDataTypeKind::Number => Some(value.parse().unwrap_or_default()),
338            IamConfigDataTypeKind::Month => None,
339            IamConfigDataTypeKind::Minute => None,
340            IamConfigDataTypeKind::Hour => None,
341            IamConfigDataTypeKind::Day => None,
342            IamConfigDataTypeKind::DatetimeRange => None,
343            IamConfigDataTypeKind::TimeRange => None,
344            IamConfigDataTypeKind::Ips => None,
345        }
346    }
347
348    pub fn to_float(&self, value: String) -> Option<f64> {
349        match self {
350            IamConfigDataTypeKind::Number => Some(value.parse().unwrap_or_default()),
351            IamConfigDataTypeKind::Month => None,
352            IamConfigDataTypeKind::Minute => None,
353            IamConfigDataTypeKind::Hour => None,
354            IamConfigDataTypeKind::Day => None,
355            IamConfigDataTypeKind::DatetimeRange => None,
356            IamConfigDataTypeKind::TimeRange => None,
357            IamConfigDataTypeKind::Ips => None,
358        }
359    }
360
361    pub fn to_sec(&self, value: String) -> Option<i64> {
362        match self {
363            IamConfigDataTypeKind::Number => Some(value.parse().unwrap_or_default()),
364            IamConfigDataTypeKind::Month => Some(value.parse::<i64>().unwrap_or_default() * 30 * 24 * 60 * 60),
365            IamConfigDataTypeKind::Minute => Some(value.parse::<i64>().unwrap_or_default() * 60),
366            IamConfigDataTypeKind::Hour => Some(value.parse::<i64>().unwrap_or_default() * 60 * 60),
367            IamConfigDataTypeKind::Day => Some(value.parse::<i64>().unwrap_or_default() * 24 * 60 * 60),
368            IamConfigDataTypeKind::DatetimeRange => None,
369            IamConfigDataTypeKind::TimeRange => None,
370            IamConfigDataTypeKind::Ips => None,
371        }
372    }
373}
374
375#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
376pub enum IamConfigKind {
377    /// 登陆时间限制
378    AccessTime,
379    /// 登陆Ip限制
380    AuthIp,
381    /// Token不活动失效 #分钟
382    TokenExpire,
383    /// 账号不活动锁定 #月
384    AccountInactivityLock,
385    /// 临时账号使用期限 #月
386    AccountTemporaryExpire,
387    /// 临时账号休眠期限 #月
388    AccountTemporarySleepExpire,
389    /// 临时账号休眠注销 #月
390    AccountTemporarySleepRemoveExpire,
391    /// 审计日志容量 #GB
392    AuditLogCapacity,
393    /// 在线人数限制 #人
394    MaxOnline,
395}
396
397impl IamConfigKind {
398    pub fn parse(kind: &str) -> TardisResult<IamConfigKind> {
399        IamConfigKind::from_str(kind).map_err(|_| TardisError::format_error(&format!("not config kind: {kind}"), "404-iam-config-kind-not-exist"))
400    }
401}