feat: add members count

This commit is contained in:
Zack Fu Zi Xiang 2024-03-14 13:33:57 +08:00
parent b68b897165
commit 3041812d23
No known key found for this signature in database
4 changed files with 115 additions and 64 deletions

View File

@ -1,58 +1,120 @@
use database_entity::dto::AFWorkspace; use database_entity::dto::AFWorkspace;
use super::entities::{JsonResponse, UserUsageLimit}; use super::entities::{JsonResponse, UserUsageLimit, WorkspaceMember, WorkspaceUsage};
pub async fn get_user_workspace_count( pub async fn get_user_workspace_count(auth_header: &str, appflowy_cloud_base_url: &str) -> u32 {
auth_header: &str, let workspaces = get_user_workspaces(auth_header, appflowy_cloud_base_url).await;
appflowy_cloud_base_url: &str, workspaces.len() as u32
) -> Result<u32, reqwest::Error> { }
async fn get_user_workspaces(auth_header: &str, appflowy_cloud_base_url: &str) -> Vec<AFWorkspace> {
let http_client = reqwest::Client::new(); let http_client = reqwest::Client::new();
let resp = http_client let resp = match http_client
.get(format!("{}/api/workspace", appflowy_cloud_base_url)) .get(format!("{}/api/workspace", appflowy_cloud_base_url))
.header("Authorization", format!("Bearer {}", auth_header)) .header("Authorization", format!("Bearer {}", auth_header))
.send() .send()
.await?; .await
{
Ok(resp) => resp,
Err(err) => {
tracing::error!("Error getting user workspaces: {:?}", err);
return vec![];
},
};
let res = resp.json::<JsonResponse<Vec<AFWorkspace>>>().await?; let res = match resp.json::<JsonResponse<Vec<AFWorkspace>>>().await {
Ok(res.data.len() as u32) Ok(res) => res,
Err(err) => {
tracing::error!("Error parsing user workspaces: {:?}", err);
return vec![];
},
};
res.data
} }
pub async fn get_user_workspace_limit( pub async fn get_user_workspace_limit(
auth_header: &str, auth_header: &str,
appflowy_cloud_base_url: &str, appflowy_cloud_base_url: &str,
) -> Result<u32, reqwest::Error> { ) -> Option<i64> {
let http_client = reqwest::Client::new(); let http_client = reqwest::Client::new();
let resp = http_client let resp = match http_client
.get(format!("{}/api/user/limit", appflowy_cloud_base_url)) .get(format!("{}/api/user/limit", appflowy_cloud_base_url))
.header("Authorization", format!("Bearer {}", auth_header)) .header("Authorization", format!("Bearer {}", auth_header))
.send() .send()
.await?; .await
{
Ok(resp) => resp,
Err(err) => {
tracing::warn!("unable to get user workspace limit: {:?}", err);
return None;
},
};
let res = resp.json::<JsonResponse<UserUsageLimit>>().await?; let res = match resp.json::<JsonResponse<UserUsageLimit>>().await {
let b = res.data; Ok(res) => res,
let c = b.workspace_count.unwrap_or({ Err(err) => {
tracing::warn!("workspace_count is None, returning 0"); tracing::error!("Error parsing user workspace limit: {:?}", err);
0 return None;
}); },
Ok(c as u32) };
Some(res.data.workspace_count)
} }
pub async fn get_workspace_limit( pub async fn get_user_workspace_usages(
auth_header: &str, auth_header: &str,
appflowy_cloud_base_url: &str, appflowy_cloud_base_url: &str,
) -> Result<u32, reqwest::Error> { appflowy_cloud_gateway_base_url: &str,
) -> Vec<WorkspaceUsage> {
let user_workspaces = get_user_workspaces(auth_header, appflowy_cloud_base_url).await;
let mut workspace_usages: Vec<WorkspaceUsage> = Vec::with_capacity(user_workspaces.len());
for user_workspace in user_workspaces {
let workspace_id = user_workspace.workspace_id.to_string();
let members =
get_user_workspace_members(&workspace_id, auth_header, appflowy_cloud_gateway_base_url).await;
workspace_usages.push(WorkspaceUsage {
name: user_workspace.workspace_name,
member_count: members.len(),
member_limit: 98798, // todo
total_doc_size: human_bytes::human_bytes(987654), // todo
total_blob_size: human_bytes::human_bytes(9876543), // todo
total_blob_limit: human_bytes::human_bytes(98765432), // todo
});
}
workspace_usages
}
async fn get_user_workspace_members(
workspace_id: &str,
auth_header: &str,
appflowy_cloud_base_url: &str,
) -> Vec<WorkspaceMember> {
let http_client = reqwest::Client::new(); let http_client = reqwest::Client::new();
let resp = http_client let resp = match http_client
.get(format!("{}/api/user/limit", appflowy_cloud_base_url)) .get(format!(
"{}/api/workspace/{}/member",
appflowy_cloud_base_url, workspace_id
))
.header("Authorization", format!("Bearer {}", auth_header)) .header("Authorization", format!("Bearer {}", auth_header))
.send() .send()
.await?; .await
{
Ok(resp) => resp,
Err(err) => {
tracing::error!("Error getting user workspace members: {:?}", err);
return vec![];
},
};
let res = resp.json::<JsonResponse<UserUsageLimit>>().await?; let res = match resp.json::<JsonResponse<Vec<WorkspaceMember>>>().await {
let b = res.data; Ok(res) => res,
let c = b.workspace_count.unwrap_or({ Err(err) => {
tracing::warn!("workspace_count is None, returning 0"); tracing::error!("Error parsing user workspace limit: {:?}", err);
0 return vec![];
}); },
Ok(c as u32) };
res.data
} }

View File

@ -8,15 +8,22 @@ pub struct JsonResponse<T> {
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct UserUsageLimit { pub struct UserUsageLimit {
pub workspace_count: Option<i64>, pub workspace_count: i64,
} }
#[derive(Serialize)] #[derive(Serialize)]
pub struct WorkspaceUsage { pub struct WorkspaceUsage {
pub name: String, pub name: String,
pub member_count: i64, pub member_count: usize,
pub member_limit: i64, pub member_limit: i64,
pub total_doc_size: String, pub total_doc_size: String,
pub total_blob_size: String, pub total_blob_size: String,
pub total_blob_limit: String, pub total_blob_limit: String,
} }
#[derive(Deserialize)]
pub struct WorkspaceMember {
pub name: String,
pub email: String,
pub role: String,
}

View File

@ -7,7 +7,7 @@ use crate::ext::entities::WorkspaceUsage;
#[template(path = "components/user_usage.html")] #[template(path = "components/user_usage.html")]
pub struct UserUsage { pub struct UserUsage {
pub workspace_count: u32, pub workspace_count: u32,
pub workspace_limit: u32, pub workspace_limit: String,
} }
// ./../templates/components/workspace_usage.html // ./../templates/components/workspace_usage.html

View File

@ -1,5 +1,7 @@
use crate::error::WebAppError; use crate::error::WebAppError;
use crate::ext::api::{get_user_workspace_count, get_user_workspace_limit}; use crate::ext::api::{
get_user_workspace_count, get_user_workspace_limit, get_user_workspace_usages,
};
use crate::ext::entities::WorkspaceUsage; use crate::ext::entities::WorkspaceUsage;
use crate::session::UserSession; use crate::session::UserSession;
use askama::Template; use askama::Template;
@ -100,22 +102,15 @@ pub async fn user_usage_handler(
session: UserSession, session: UserSession,
) -> Result<Html<String>, WebAppError> { ) -> Result<Html<String>, WebAppError> {
let workspace_count = let workspace_count =
get_user_workspace_count(&session.token.access_token, &state.appflowy_cloud_url) get_user_workspace_count(&session.token.access_token, &state.appflowy_cloud_url).await;
.await
.unwrap_or_else(|err| {
tracing::error!("Error getting user workspace count: {:?}", err);
0
});
let workspace_limit = get_user_workspace_limit( let workspace_limit = get_user_workspace_limit(
&session.token.access_token, &session.token.access_token,
&state.appflowy_cloud_gateway_url, &state.appflowy_cloud_gateway_url,
) )
.await .await
.unwrap_or_else(|err| { .map(|limit| limit.to_string())
tracing::error!("Error getting user workspace limit: {:?}", err); .unwrap_or("".to_owned());
0
});
render_template(templates::UserUsage { render_template(templates::UserUsage {
workspace_count, workspace_count,
@ -127,25 +122,12 @@ pub async fn workspace_usage_handler(
State(app_state): State<AppState>, State(app_state): State<AppState>,
session: UserSession, session: UserSession,
) -> Result<Html<String>, WebAppError> { ) -> Result<Html<String>, WebAppError> {
let workspace_usages = vec![ let workspace_usages = get_user_workspace_usages(
WorkspaceUsage { &session.token.access_token,
name: "test".to_owned(), &app_state.appflowy_cloud_url,
member_count: 6, &app_state.appflowy_cloud_gateway_url,
member_limit: 7, )
total_doc_size: human_bytes(987654), .await;
total_blob_size: human_bytes(9876543),
total_blob_limit: human_bytes(98765432),
},
WorkspaceUsage {
name: "test".to_owned(),
member_count: 6,
member_limit: 7,
total_doc_size: human_bytes(987654),
total_blob_size: human_bytes(9876543),
total_blob_limit: human_bytes(98765432),
},
];
render_template(templates::WorkspaceUsageList { workspace_usages }) render_template(templates::WorkspaceUsageList { workspace_usages })
} }