From 7fd68df18418ab342a98abfd4197b15cccc2f923 Mon Sep 17 00:00:00 2001 From: AidCheng Date: Fri, 29 Aug 2025 13:04:26 +0100 Subject: [PATCH 1/2] [mono]FIX: upload full mui tree node Signed-off-by: AidCheng --- ceres/src/api_service/mono_api_service.rs | 8 ++++++-- mono/src/api/mr/mr_router.rs | 5 ++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ceres/src/api_service/mono_api_service.rs b/ceres/src/api_service/mono_api_service.rs index 32e0cdb2e..5a6d30383 100644 --- a/ceres/src/api_service/mono_api_service.rs +++ b/ceres/src/api_service/mono_api_service.rs @@ -410,7 +410,7 @@ impl MonoApiService { &self, mr_link: &str, page: Pagination, - ) -> Result<(Vec, u64), GitError> { + ) -> Result<(Vec, Vec, u64), GitError> { let per_page = page.per_page as usize; let page_id = page.page as usize; @@ -433,6 +433,10 @@ impl MonoApiService { let sorted_changed_files = self .mr_files_list(old_blobs.clone(), new_blobs.clone()) .await?; + let file_paths: Vec = sorted_changed_files + .iter() + .map(|f| f.path().to_string_lossy().to_string()) + .collect(); // ensure page_id is within bounds let start = (page_id.saturating_sub(1)) * per_page; @@ -460,7 +464,7 @@ impl MonoApiService { // calculate total pages let total = sorted_changed_files.len().div_ceil(per_page); - Ok((diff_output, total as u64)) + Ok((diff_output, file_paths, total as u64)) } async fn get_diff_by_blobs( diff --git a/mono/src/api/mr/mr_router.rs b/mono/src/api/mr/mr_router.rs index bcc3ce9dc..8ffd139e1 100644 --- a/mono/src/api/mr/mr_router.rs +++ b/mono/src/api/mr/mr_router.rs @@ -307,13 +307,12 @@ async fn mr_files_changed_by_page( state: State, Json(json): Json>, ) -> Result>, ApiError> { - let (items, total) = state + let (items, changed_files_path, total) = state .monorepo() .paged_content_diff(&link, json.pagination) .await?; - let paths = items.iter().map(|i| i.path.clone()).collect(); - let mui_trees = build_forest(paths); + let mui_trees = build_forest(changed_files_path); let res = CommonResult::success(Some(FilesChangedPage { mui_trees, page: CommonPage { total, items }, From 0506c23a6d83e26da7a7c5389436c24098103301 Mon Sep 17 00:00:00 2001 From: AidCheng Date: Sat, 30 Aug 2025 00:43:08 +0100 Subject: [PATCH 2/2] [mono]UPDATE: More Detailed Backend Log and Fixed API route Signed-off-by: AidCheng --- jupiter/callisto/src/mod.rs | 2 +- jupiter/src/storage/gpg_storage.rs | 30 ++++++++++++++++++++---------- mono/src/api/gpg/gpg_router.rs | 29 +++++++++++++++-------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/jupiter/callisto/src/mod.rs b/jupiter/callisto/src/mod.rs index 13380b35b..e70edbe81 100644 --- a/jupiter/callisto/src/mod.rs +++ b/jupiter/callisto/src/mod.rs @@ -5,6 +5,7 @@ pub mod prelude; pub mod access_token; pub mod builds; pub mod check_result; +pub mod entity_ext; pub mod git_blob; pub mod git_commit; pub mod git_issue; @@ -43,4 +44,3 @@ pub mod sea_orm_active_enums; pub mod ssh_keys; pub mod user; pub mod vault; -pub mod entity_ext; diff --git a/jupiter/src/storage/gpg_storage.rs b/jupiter/src/storage/gpg_storage.rs index 541e4aa60..0f9ecb8db 100644 --- a/jupiter/src/storage/gpg_storage.rs +++ b/jupiter/src/storage/gpg_storage.rs @@ -1,5 +1,6 @@ use crate::storage::base_storage::BaseStorage; use crate::storage::base_storage::StorageConnector; +use anyhow::anyhow; use callisto::entity_ext::generate_id; use callisto::gpg_key; use common::errors::MegaError; @@ -32,7 +33,11 @@ impl GpgStorage { gpg_content: String, expires_days: Option, ) -> Result { - let (pk, _headers) = SignedPublicKey::from_string(&gpg_content)?; + let (pk, _headers) = SignedPublicKey::from_string(&gpg_content).map_err(|e| { + tracing::error!("{:?}", e); + MegaError::new(anyhow!("Failed to parse GPG key, please check format"), 1) + })?; + let key_id = format!("{:016X}", pk.key_id()); let fingerprint = format!("{:?}", pk.fingerprint()); let created_at = chrono::Utc::now().naive_utc(); @@ -60,13 +65,10 @@ impl GpgStorage { ) -> Result<(), MegaError> { let key = self.create_key(user_id, gpg_content, expired_at)?; let a_model = key.into_active_model(); - a_model.insert(self.get_connection()).await?; - Ok(()) - } - - pub async fn save_gpg_key(&self, key: gpg_key::Model) -> Result<(), MegaError> { - let a_model = key.into_active_model(); - a_model.insert(self.get_connection()).await?; + a_model.insert(self.get_connection()).await.map_err(|e| { + tracing::error!("{:?}", e); + MegaError::new(anyhow!("Failed to save GPG key"), 1) + })?; Ok(()) } @@ -75,7 +77,11 @@ impl GpgStorage { .filter(gpg_key::Column::UserId.eq(user_id)) .filter(gpg_key::Column::KeyId.eq(key_id)) .exec(self.get_connection()) - .await?; + .await + .map_err(|e| { + tracing::error!("{:?}", e); + MegaError::new(anyhow!("Failed to delete GPG key"), 1) + })?; Ok(()) } @@ -83,7 +89,11 @@ impl GpgStorage { let res: Vec = gpg_key::Entity::find() .filter(gpg_key::Column::UserId.eq(user_id)) .all(self.get_connection()) - .await?; + .await + .map_err(|e| { + tracing::error!("{:?}", e); + MegaError::new(anyhow!("Failed to get GPG keys"), 1) + })?; Ok(res) } } diff --git a/mono/src/api/gpg/gpg_router.rs b/mono/src/api/gpg/gpg_router.rs index 466387f41..86ba4cb1d 100644 --- a/mono/src/api/gpg/gpg_router.rs +++ b/mono/src/api/gpg/gpg_router.rs @@ -33,10 +33,9 @@ async fn remove_gpg( state: State, Json(req): Json, ) -> Result>, ApiError> { - let _ = state - .gpg_stg() - .remove_gpg_key(user.campsite_user_id, req.key_id) - .await; + // let uid = "exampleid".to_string(); + let uid = user.campsite_user_id.clone(); + state.gpg_stg().remove_gpg_key(uid, req.key_id).await?; Ok(Json(CommonResult::success(None))) } @@ -54,18 +53,19 @@ async fn add_gpg( state: State, Json(req): Json, ) -> Result>, ApiError> { - let _ = state + // let uid = "exampleid".to_string(); + let uid = user.campsite_user_id.clone(); + println!("Adding GPG key for user: {}", req.gpg_content.clone()); + state .gpg_stg() - .add_gpg_key(user.campsite_user_id, req.gpg_content, req.expires_days) - .await; + .add_gpg_key(uid, req.gpg_content, req.expires_days) + .await?; + Ok(Json(CommonResult::success(None))) } #[utoipa::path( get, - params( - ("id" = i64, description = "The user ID"), - ), - path = "/list/{id}", + path = "/list", responses( (status = 200, body = CommonResult>, content_type="application/json") ), @@ -75,14 +75,15 @@ async fn list_gpg( user: LoginUser, state: State, ) -> Result>>, ApiError> { - let user_id = user.campsite_user_id; - let raw_keys = state.gpg_stg().list_user_gpg(user_id.clone()).await; + // let uid = "exampleid".to_string(); + let uid = user.campsite_user_id; + let raw_keys = state.gpg_stg().list_user_gpg(uid.clone()).await; let res: Vec = raw_keys .into_iter() .flatten() .map(|k: Model| GpgKey { - user_id: user_id.clone(), + user_id: uid.clone(), key_id: k.key_id, fingerprint: k.fingerprint, created_at: k.created_at.and_utc(),