Skip to content

Commit feaf831

Browse files
committed
Optimize some helpers.
1 parent bf14a6e commit feaf831

File tree

70 files changed

+434
-399
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+434
-399
lines changed

backend/basic/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ tardis = { workspace = true, optional = true }
3939
strum = { workspace = true }
4040
testcontainers-modules = { workspace = true, features = ["redis"] }
4141
bios-sdk-invoke = { path = "../../frontend/sdks/invoke", features = ["default"] }
42+
4243
[dev-dependencies]
4344
tardis = { workspace = true, features = ["test"] }
4445
bios-sdk-invoke = { path = "../../frontend/sdks/invoke", features = ["default"] }
46+
4547
[[test]]
4648
name = "test_rbum"
4749
required-features = ["default", "with-mq", "test"]

backend/basic/src/dto.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::HashMap;
33
use serde::{Deserialize, Serialize};
44
use tardis::{basic::result::TardisResult, serde_json::Value};
55

6-
use crate::basic_enumeration::BasicQueryOpKind;
6+
use crate::enumeration::BasicQueryOpKind;
77
#[cfg(feature = "default")]
88
use tardis::web::poem_openapi;
99

@@ -93,7 +93,7 @@ mod tests {
9393

9494
use tardis::{basic::result::TardisResult, serde_json::json};
9595

96-
use crate::{basic_enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo};
96+
use crate::{enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo};
9797

9898
#[test]
9999
fn test_check_or_and_conds() -> TardisResult<()> {

backend/basic/src/helper.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#[cfg(feature = "default")]
12
pub mod db_helper;
2-
pub mod request_helper;
3-
pub mod url_helper;
3+
#[cfg(feature = "default")]
4+
pub mod request_helper;

backend/basic/src/helper/db_helper.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
//! Database operations helper.
12
use tardis::{
23
chrono::{DateTime, ParseError, Utc},
34
db::sea_orm,
5+
log::warn,
46
serde_json,
57
};
68

9+
/// Convert JSON value to SeaORM value.
10+
///
11+
/// When the JSON value is a string, you can specify whether to add % on both sides of the string through the ``like_by_str`` parameter.
712
pub fn json_to_sea_orm_value(json_value: &serde_json::Value, like_by_str: bool) -> Option<Vec<sea_orm::Value>> {
813
match json_value {
914
serde_json::Value::Null => None,
@@ -23,29 +28,27 @@ pub fn json_to_sea_orm_value(json_value: &serde_json::Value, like_by_str: bool)
2328
}
2429
},
2530
serde_json::Value::Array(val) => {
31+
// If the array is empty, return None.
2632
if val.is_empty() {
2733
return None;
2834
}
29-
let _dt = match val.first().unwrap() {
30-
serde_json::Value::Bool(_) => sea_orm::sea_query::ArrayType::Bool,
31-
serde_json::Value::Number(n) if n.is_i64() => sea_orm::sea_query::ArrayType::BigInt,
32-
serde_json::Value::Number(n) if n.is_u64() => sea_orm::sea_query::ArrayType::BigInt,
33-
serde_json::Value::Number(n) if n.is_f64() => sea_orm::sea_query::ArrayType::Double,
34-
serde_json::Value::String(_) => sea_orm::sea_query::ArrayType::String,
35-
serde_json::Value::Object(_) => sea_orm::sea_query::ArrayType::Json,
36-
_ => return None,
37-
};
35+
// Convert each element in the array to SeaORM value.
3836
let vals = val.iter().map(|json| json_to_sea_orm_value(json, like_by_str)).collect::<Vec<Option<Vec<sea_orm::Value>>>>();
3937
if vals.iter().any(|v| v.is_none()) {
38+
warn!("[Basic] json_to_sea_orm_value: json array conversion failed.");
4039
return None;
4140
}
42-
let vals = vals.into_iter().flat_map(|v| v.unwrap().into_iter()).collect::<Vec<sea_orm::Value>>();
41+
let vals = vals.into_iter().flat_map(|v| v.expect("ignore").into_iter()).collect::<Vec<sea_orm::Value>>();
4342
Some(vals)
4443
}
45-
_ => None,
44+
_ => {
45+
warn!("[Basic] json_to_sea_orm_value: json conversion failed.");
46+
None
47+
}
4648
}
4749
}
4850

49-
fn str_to_datetime(input: &str) -> Result<DateTime<Utc>, ParseError> {
51+
/// Convert string to DateTime<Utc>.
52+
pub fn str_to_datetime(input: &str) -> Result<DateTime<Utc>, ParseError> {
5053
DateTime::parse_from_rfc3339(input).map(|dt| dt.with_timezone(&Utc))
5154
}
Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,82 @@
1+
//! Http request helper
2+
use std::{collections::HashMap, net::IpAddr, str::FromStr};
3+
4+
use itertools::Itertools;
15
use tardis::{
26
basic::{dto::TardisContext, result::TardisResult},
3-
web::poem::Request,
7+
web::poem::{http::header::FORWARDED, Request},
48
};
59

610
pub const REMOTE_ADDR: &str = "remote-addr";
711

8-
// Add ip to context
12+
/// Add ip to context
913
pub async fn add_ip(ip: Option<String>, ctx: &TardisContext) -> TardisResult<()> {
1014
if let Some(ip) = ip {
1115
ctx.add_ext(REMOTE_ADDR, &ip).await?;
1216
}
1317
Ok(())
1418
}
1519

16-
pub async fn add_remote_ip(request: &Request, ctx: &TardisContext) -> TardisResult<()> {
17-
ctx.add_ext(REMOTE_ADDR, &get_ip(request).await?.unwrap_or_default()).await?;
20+
/// Try to set real ip from request to context
21+
pub async fn try_set_real_ip_from_req_to_ctx(request: &Request, ctx: &TardisContext) -> TardisResult<()> {
22+
ctx.add_ext(REMOTE_ADDR, &try_get_real_ip_from_req(request).await?.unwrap_or_default()).await?;
1823
Ok(())
1924
}
2025

21-
pub async fn get_ip(request: &Request) -> TardisResult<Option<String>> {
22-
let back_ip = request.remote_addr().as_socket_addr().map(|socket_addr| socket_addr.ip().to_string());
23-
let ip = if let Some(real_ips) = request.headers().get("X-Forwarded-For") {
24-
if let Some(real_ip) = real_ips.to_str().ok().and_then(|ips| ips.split(',').collect::<Vec<_>>().first().map(|ip| ip.to_string())) {
25-
Some(real_ip)
26-
} else {
27-
back_ip
26+
/// Try to get real ip from request
27+
pub async fn try_get_real_ip_from_req(request: &Request) -> TardisResult<Option<String>> {
28+
fn parse_forwarded_ip(field: &str) -> Option<IpAddr> {
29+
if let Some(pos) = field.find("for=") {
30+
let ip_str = &field[pos + 4..];
31+
if let Ok(ip) = IpAddr::from_str(ip_str) {
32+
return Some(ip);
33+
}
34+
}
35+
None
36+
}
37+
if let Some(forwarded_header) = request.headers().get(FORWARDED) {
38+
if let Ok(forwarded_value) = forwarded_header.to_str() {
39+
for field in forwarded_value.split(',') {
40+
if let Some(ip) = parse_forwarded_ip(field.trim()) {
41+
return Ok(Some(ip.to_string()));
42+
}
43+
}
44+
}
45+
}
46+
if let Some(xff_header) = request.headers().get("X-Forwarded-For") {
47+
if let Ok(xff_value) = xff_header.to_str() {
48+
if let Some(ip) = xff_value.split(',').next().and_then(|s| IpAddr::from_str(s.trim()).ok()) {
49+
return Ok(Some(ip.to_string()));
50+
}
51+
}
52+
}
53+
if let Some(xff_header) = request.headers().get("X-Real-IP") {
54+
if let Ok(xff_value) = xff_header.to_str() {
55+
if let Some(ip) = xff_value.split(',').next().and_then(|s| IpAddr::from_str(s.trim()).ok()) {
56+
return Ok(Some(ip.to_string()));
57+
}
2858
}
29-
} else {
30-
back_ip
31-
};
32-
Ok(ip)
59+
}
60+
Ok(request.remote_addr().as_socket_addr().map(|addr| addr.ip().to_string()))
3361
}
3462

35-
pub async fn get_remote_ip(ctx: &TardisContext) -> TardisResult<Option<String>> {
63+
/// Get real ip from context
64+
pub async fn get_real_ip_from_ctx(ctx: &TardisContext) -> TardisResult<Option<String>> {
3665
ctx.get_ext(REMOTE_ADDR).await
3766
}
67+
68+
/// Sort query string and convert to lowercase
69+
pub fn sort_query(query: &str) -> String {
70+
if query.is_empty() {
71+
return "".to_string();
72+
}
73+
query.split('&').sorted_by(|a, b| Ord::cmp(&a.to_lowercase(), &b.to_lowercase())).join("&")
74+
}
75+
76+
/// Sort query and convert to lowercase
77+
pub fn sort_hashmap_query(query: HashMap<String, String>) -> String {
78+
if query.is_empty() {
79+
return "".to_string();
80+
}
81+
query.iter().map(|a| format!("{}={}", a.0, a.1)).sorted_by(|a, b| Ord::cmp(&a.to_lowercase(), &b.to_lowercase())).join("&")
82+
}

backend/basic/src/helper/url_helper.rs

Lines changed: 0 additions & 16 deletions
This file was deleted.

backend/basic/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
extern crate lazy_static;
22

3-
pub mod basic_enumeration;
3+
pub mod enumeration;
44
pub mod dto;
55
pub mod helper;
66
pub mod process;
@@ -9,7 +9,7 @@ pub mod spi;
99
#[cfg(feature = "test")]
1010
pub mod test;
1111

12-
pub use basic_enumeration::ApiTag;
12+
pub use enumeration::ApiTag;
1313
use tardis::{TardisFuns, TardisFunsInst};
1414

1515
pub trait TardisFunInstExtractor {

backend/basic/src/process/ci_processor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use serde::{Deserialize, Serialize};
22
use tardis::{basic::result::TardisResult, chrono::Utc, TardisFuns};
33

4-
use crate::helper::url_helper::sort_query;
4+
use crate::helper::request_helper::sort_query;
55

66
#[derive(Debug, Serialize, Deserialize, Clone)]
77
#[serde(default)]

backend/spi/spi-log/src/dto/log_item_dto.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use bios_basic::{basic_enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo};
1+
use bios_basic::{enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo};
22
use serde::{Deserialize, Serialize};
33
use tardis::{
44
basic::field::TrimString,

backend/spi/spi-log/src/serv/pg/log_pg_item_serv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use tardis::{
55
TardisFuns, TardisFunsInst,
66
};
77

8-
use bios_basic::{basic_enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo, helper::db_helper, spi::spi_funs::SpiBsInst};
8+
use bios_basic::{enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo, helper::db_helper, spi::spi_funs::SpiBsInst};
99

1010
use crate::dto::log_item_dto::{AdvBasicQueryCondInfo, LogItemAddReq, LogItemFindReq, LogItemFindResp};
1111

backend/spi/spi-search/src/dto/search_item_dto.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::collections::HashMap;
22

33
use crate::search_enumeration::{SearchDataTypeKind, SearchQueryAggFunKind, SearchQueryTimeWindowKind};
4-
use bios_basic::{basic_enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo};
4+
use bios_basic::{enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo};
55
use serde::{Deserialize, Serialize};
66
use tardis::{
77
basic::field::TrimString,

backend/spi/spi-search/src/search_enumeration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::str::FromStr;
22

3-
use bios_basic::{basic_enumeration::BasicQueryOpKind, helper::db_helper};
3+
use bios_basic::{enumeration::BasicQueryOpKind, helper::db_helper};
44
use serde::{Deserialize, Serialize};
55
use tardis::{
66
basic::{error::TardisError, result::TardisResult},

backend/spi/spi-search/src/serv/es/search_es_item_serv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use tardis::{
99
};
1010

1111
use bios_basic::{
12-
basic_enumeration::BasicQueryOpKind,
12+
enumeration::BasicQueryOpKind,
1313
spi::{spi_funs::SpiBsInst, spi_initializer::common},
1414
};
1515

backend/spi/spi-search/src/serv/pg/search_pg_item_serv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use tardis::{
1313
TardisFuns, TardisFunsInst,
1414
};
1515

16-
use bios_basic::{basic_enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo, helper::db_helper, spi::spi_funs::SpiBsInst};
16+
use bios_basic::{enumeration::BasicQueryOpKind, dto::BasicQueryCondInfo, helper::db_helper, spi::spi_funs::SpiBsInst};
1717

1818
use crate::{
1919
dto::search_item_dto::{

backend/spi/spi-stats/src/dto/stats_query_dto.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::HashMap;
22

3-
use bios_basic::basic_enumeration::BasicQueryOpKind;
3+
use bios_basic::enumeration::BasicQueryOpKind;
44
use serde::{Deserialize, Serialize};
55
use tardis::{
66
chrono::{DateTime, Utc},

backend/spi/spi-stats/src/stats_enumeration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::str::FromStr;
22

3-
use bios_basic::{basic_enumeration::BasicQueryOpKind, helper::db_helper};
3+
use bios_basic::{enumeration::BasicQueryOpKind, helper::db_helper};
44
use serde::{Deserialize, Serialize};
55
use tardis::{
66
basic::{error::TardisError, result::TardisResult},

backend/supports/iam/src/basic/serv/clients/iam_log_client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use bios_basic::{
2-
helper::request_helper::get_remote_ip,
2+
helper::request_helper::get_real_ip_from_ctx,
33
rbum::{
44
dto::rbum_filer_dto::{RbumBasicFilterReq, RbumSetCateFilterReq},
55
serv::{rbum_crud_serv::RbumCrudOperation, rbum_item_serv::RbumItemCrudOperation, rbum_set_serv::RbumSetCateServ},
@@ -77,7 +77,7 @@ impl IamLogClient {
7777
let task_handle = tokio::spawn(async move {
7878
let funs = iam_constants::get_tardis_inst();
7979
let mut ip = "".to_string();
80-
if let Ok(remote_ip) = get_remote_ip(&ctx_clone).await {
80+
if let Ok(remote_ip) = get_real_ip_from_ctx(&ctx_clone).await {
8181
ip = remote_ip.unwrap_or_default();
8282
}
8383
IamLogClient::add_item(

backend/supports/iam/src/basic/serv/iam_account_serv.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use async_trait::async_trait;
2-
use bios_basic::helper::request_helper::get_remote_ip;
2+
use bios_basic::helper::request_helper::get_real_ip_from_ctx;
33
use bios_basic::rbum::rbum_config::RbumConfigApi;
44
use bios_basic::rbum::rbum_enumeration::RbumRelFromKind;
55
use bios_sdk_invoke::clients::spi_kv_client::SpiKvClient;
@@ -146,7 +146,7 @@ impl RbumItemCrudOperation<iam_account::ActiveModel, IamAccountAddReq, IamAccoun
146146

147147
async fn after_modify_item(id: &str, modify_req: &mut IamAccountModifyReq, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<()> {
148148
if modify_req.disabled.is_some() || modify_req.scope_level.is_some() || modify_req.status.is_some() {
149-
IamIdentCacheServ::delete_tokens_and_contexts_by_account_id(id, get_remote_ip(ctx).await?, funs).await?;
149+
IamIdentCacheServ::delete_tokens_and_contexts_by_account_id(id, get_real_ip_from_ctx(ctx).await?, funs).await?;
150150
}
151151

152152
let mut tasks = vec![];
@@ -199,7 +199,7 @@ impl RbumItemCrudOperation<iam_account::ActiveModel, IamAccountAddReq, IamAccoun
199199
}
200200

201201
async fn after_delete_item(id: &str, _: &Option<IamAccountDetailResp>, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<()> {
202-
IamIdentCacheServ::delete_tokens_and_contexts_by_account_id(id, get_remote_ip(ctx).await?, funs).await?;
202+
IamIdentCacheServ::delete_tokens_and_contexts_by_account_id(id, get_real_ip_from_ctx(ctx).await?, funs).await?;
203203
IamSearchClient::async_delete_account_search(id.to_string(), funs, ctx.clone()).await?;
204204
Ok(())
205205
}
@@ -752,7 +752,7 @@ impl IamAccountServ {
752752

753753
pub async fn delete_tokens(id: &str, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<()> {
754754
RbumItemServ::check_ownership(id, funs, ctx).await?;
755-
IamIdentCacheServ::delete_tokens_and_contexts_by_account_id(id, get_remote_ip(ctx).await?, funs).await
755+
IamIdentCacheServ::delete_tokens_and_contexts_by_account_id(id, get_real_ip_from_ctx(ctx).await?, funs).await
756756
}
757757

758758
pub async fn unlock_account(id: &str, funs: &TardisFunsInst, ctx: &TardisContext) -> TardisResult<Void> {

backend/supports/iam/src/basic/serv/iam_cert_ldap_serv.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::{
2121
iam_config::IamBasicConfigApi,
2222
iam_constants,
2323
};
24-
use bios_basic::helper::request_helper::get_remote_ip;
24+
use bios_basic::helper::request_helper::get_real_ip_from_ctx;
2525
use bios_basic::rbum::dto::rbum_cert_dto::RbumCertSummaryResp;
2626
use bios_basic::rbum::dto::rbum_filer_dto::RbumBasicFilterReq;
2727
use bios_basic::rbum::rbum_enumeration::RbumCertStatusKind::Enabled;
@@ -636,7 +636,7 @@ impl IamCertLdapServ {
636636
false,
637637
Some("".to_string()),
638638
Some(vec![&IamCertKernelKind::UserPwd.to_string()]),
639-
get_remote_ip(ctx).await?,
639+
get_real_ip_from_ctx(ctx).await?,
640640
funs,
641641
)
642642
.await;
@@ -649,7 +649,7 @@ impl IamCertLdapServ {
649649
false,
650650
Some(tenant_id.to_string()),
651651
Some(vec![&IamCertKernelKind::UserPwd.to_string()]),
652-
get_remote_ip(ctx).await?,
652+
get_real_ip_from_ctx(ctx).await?,
653653
funs,
654654
)
655655
.await;
@@ -672,7 +672,7 @@ impl IamCertLdapServ {
672672
false,
673673
Some("".to_string()),
674674
Some(vec![&IamCertKernelKind::UserPwd.to_string()]),
675-
get_remote_ip(ctx).await?,
675+
get_real_ip_from_ctx(ctx).await?,
676676
funs,
677677
)
678678
.await?

0 commit comments

Comments
 (0)