use mutables
This commit is contained in:
parent
5954c82134
commit
c49782a6ba
@ -262,7 +262,7 @@ pub async fn query_user_stats<'a>(
|
|||||||
|
|
||||||
let mut response = HashMap::new();
|
let mut response = HashMap::new();
|
||||||
|
|
||||||
let q = rpc_accounting::Entity::find()
|
let mut q = rpc_accounting::Entity::find()
|
||||||
.select_only()
|
.select_only()
|
||||||
.column_as(
|
.column_as(
|
||||||
rpc_accounting::Column::FrontendRequests.sum(),
|
rpc_accounting::Column::FrontendRequests.sum(),
|
||||||
@ -291,21 +291,20 @@ pub async fn query_user_stats<'a>(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// TODO: make this and q mutable and clean up the code below. no need for more `let q`
|
// TODO: make this and q mutable and clean up the code below. no need for more `let q`
|
||||||
let condition = Condition::all();
|
let mut condition = Condition::all();
|
||||||
|
|
||||||
let q = if let StatResponse::Detailed = stat_response_type {
|
if let StatResponse::Detailed = stat_response_type {
|
||||||
// group by the columns that we use as keys in other places of the code
|
// group by the columns that we use as keys in other places of the code
|
||||||
q.column(rpc_accounting::Column::ErrorResponse)
|
q = q
|
||||||
|
.column(rpc_accounting::Column::ErrorResponse)
|
||||||
.group_by(rpc_accounting::Column::ErrorResponse)
|
.group_by(rpc_accounting::Column::ErrorResponse)
|
||||||
.column(rpc_accounting::Column::Method)
|
.column(rpc_accounting::Column::Method)
|
||||||
.group_by(rpc_accounting::Column::Method)
|
.group_by(rpc_accounting::Column::Method)
|
||||||
.column(rpc_accounting::Column::ArchiveRequest)
|
.column(rpc_accounting::Column::ArchiveRequest)
|
||||||
.group_by(rpc_accounting::Column::ArchiveRequest)
|
.group_by(rpc_accounting::Column::ArchiveRequest);
|
||||||
} else {
|
}
|
||||||
q
|
|
||||||
};
|
|
||||||
|
|
||||||
let q = filter_query_window_seconds(params, &mut response, q)?;
|
q = filter_query_window_seconds(params, &mut response, q)?;
|
||||||
|
|
||||||
// aggregate stats after query_start
|
// aggregate stats after query_start
|
||||||
// TODO: minimum query_start of 90 days?
|
// TODO: minimum query_start of 90 days?
|
||||||
@ -315,42 +314,35 @@ pub async fn query_user_stats<'a>(
|
|||||||
"query_start",
|
"query_start",
|
||||||
serde_json::Value::Number(query_start.timestamp().into()),
|
serde_json::Value::Number(query_start.timestamp().into()),
|
||||||
);
|
);
|
||||||
let condition = condition.add(rpc_accounting::Column::PeriodDatetime.gte(query_start));
|
condition = condition.add(rpc_accounting::Column::PeriodDatetime.gte(query_start));
|
||||||
|
|
||||||
// filter on chain_id
|
// filter on chain_id
|
||||||
let chain_id = get_chain_id_from_params(app, params)?;
|
let chain_id = get_chain_id_from_params(app, params)?;
|
||||||
let (condition, q) = if chain_id == 0 {
|
if chain_id == 0 {
|
||||||
// fetch all the chains. don't filter or aggregate
|
// fetch all the chains
|
||||||
(condition, q)
|
|
||||||
} else {
|
} else {
|
||||||
let condition = condition.add(rpc_accounting::Column::ChainId.eq(chain_id));
|
condition = condition.add(rpc_accounting::Column::ChainId.eq(chain_id));
|
||||||
|
|
||||||
response.insert("chain_id", serde_json::Value::Number(chain_id.into()));
|
response.insert("chain_id", serde_json::Value::Number(chain_id.into()));
|
||||||
|
}
|
||||||
(condition, q)
|
|
||||||
};
|
|
||||||
|
|
||||||
// get_user_id_from_params checks that the bearer is connected to this user_id
|
// get_user_id_from_params checks that the bearer is connected to this user_id
|
||||||
// TODO: match on user_id and rpc_key_id?
|
// TODO: match on user_id and rpc_key_id?
|
||||||
let user_id = get_user_id_from_params(redis_conn, db_conn.clone(), bearer, params).await?;
|
let user_id = get_user_id_from_params(redis_conn, db_conn.clone(), bearer, params).await?;
|
||||||
let (condition, q) = if user_id == 0 {
|
if user_id == 0 {
|
||||||
// 0 means everyone. don't filter on user
|
// 0 means everyone. don't filter on user
|
||||||
// TODO: 0 or None?
|
|
||||||
(condition, q)
|
|
||||||
} else {
|
} else {
|
||||||
let q = q.left_join(rpc_key::Entity);
|
q = q.left_join(rpc_key::Entity);
|
||||||
|
|
||||||
let condition = condition.add(rpc_key::Column::UserId.eq(user_id));
|
condition = condition.add(rpc_key::Column::UserId.eq(user_id));
|
||||||
|
|
||||||
response.insert("user_id", serde_json::Value::Number(user_id.into()));
|
response.insert("user_id", serde_json::Value::Number(user_id.into()));
|
||||||
|
}
|
||||||
(condition, q)
|
|
||||||
};
|
|
||||||
|
|
||||||
// filter on rpc_key_id
|
// filter on rpc_key_id
|
||||||
// if rpc_key_id, all the requests without a key will be loaded
|
// if rpc_key_id, all the requests without a key will be loaded
|
||||||
// TODO: move getting the param and checking the bearer token into a helper function
|
// TODO: move getting the param and checking the bearer token into a helper function
|
||||||
let (condition, q) = if let Some(rpc_key_id) = params.get("rpc_key_id") {
|
if let Some(rpc_key_id) = params.get("rpc_key_id") {
|
||||||
let rpc_key_id = rpc_key_id.parse::<u64>().map_err(|e| {
|
let rpc_key_id = rpc_key_id.parse::<u64>().map_err(|e| {
|
||||||
FrontendErrorResponse::StatusCode(
|
FrontendErrorResponse::StatusCode(
|
||||||
StatusCode::BAD_REQUEST,
|
StatusCode::BAD_REQUEST,
|
||||||
@ -361,27 +353,21 @@ pub async fn query_user_stats<'a>(
|
|||||||
|
|
||||||
response.insert("rpc_key_id", serde_json::Value::Number(rpc_key_id.into()));
|
response.insert("rpc_key_id", serde_json::Value::Number(rpc_key_id.into()));
|
||||||
|
|
||||||
let condition = condition.add(rpc_accounting::Column::RpcKeyId.eq(rpc_key_id));
|
condition = condition.add(rpc_accounting::Column::RpcKeyId.eq(rpc_key_id));
|
||||||
|
|
||||||
let q = q.group_by(rpc_accounting::Column::RpcKeyId);
|
q = q.group_by(rpc_accounting::Column::RpcKeyId);
|
||||||
|
|
||||||
if user_id == 0 {
|
if user_id == 0 {
|
||||||
// no user id, we did not join above
|
// no user id, we did not join above
|
||||||
let q = q.left_join(rpc_key::Entity);
|
q = q.left_join(rpc_key::Entity);
|
||||||
|
|
||||||
(condition, q)
|
|
||||||
} else {
|
} else {
|
||||||
// user_id added a join on rpc_key already. only filter on user_id
|
// user_id added a join on rpc_key already. only filter on user_id
|
||||||
let condition = condition.add(rpc_key::Column::UserId.eq(user_id));
|
condition = condition.add(rpc_key::Column::UserId.eq(user_id));
|
||||||
|
|
||||||
(condition, q)
|
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
(condition, q)
|
|
||||||
};
|
|
||||||
|
|
||||||
// now that all the conditions are set up. add them to the query
|
// now that all the conditions are set up. add them to the query
|
||||||
let q = q.filter(condition);
|
q = q.filter(condition);
|
||||||
|
|
||||||
// TODO: trace log query here? i think sea orm has a useful log level for this
|
// TODO: trace log query here? i think sea orm has a useful log level for this
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user