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 ThirdParty,
63}
64
65#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString)]
66pub enum IamCertOAuth2Supplier {
67 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 #[default]
194 SynchronizeCert,
195 NoSynchronizeCert,
197}
198
199#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString, Default)]
200pub enum WayToDelete {
201 #[default]
203 DoNotDelete,
204 DeleteCert,
206 Disable,
208 DeleteAccount,
210}
211
212#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString, Default)]
213pub enum IamAccountLogoutTypeKind {
214 #[default]
216 NotLogout,
217 AutomaticLogout,
219 ArtificialLogout,
221}
222
223#[derive(Display, Clone, Debug, PartialEq, Eq, Deserialize, Serialize, poem_openapi::Enum, strum::EnumString, Default)]
224pub enum IamAccountLockStateKind {
225 #[default]
227 Unlocked,
228 PasswordLocked,
230 LongTimeNoLoginLocked,
232 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 Active,
272 Dormant,
274 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 Month,
315 Minute,
317 Hour,
319 Day,
321 Number,
323 DatetimeRange,
325 TimeRange,
327 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 AccessTime,
379 AuthIp,
381 TokenExpire,
383 AccountInactivityLock,
385 AccountTemporaryExpire,
387 AccountTemporarySleepExpire,
389 AccountTemporarySleepRemoveExpire,
391 AuditLogCapacity,
393 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}