feat: allow create page API to accept a view name (#1005)

This commit is contained in:
Khor Shu Heng 2024-11-19 11:46:23 +08:00 committed by GitHub
parent 51bd650644
commit 2647d41f3a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 20 additions and 76 deletions

View File

@ -132,6 +132,7 @@ pub struct Page {
pub struct CreatePageParams {
pub parent_view_id: String,
pub layout: ViewLayout,
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]

View File

@ -916,6 +916,7 @@ async fn post_page_view_handler(
workspace_uuid,
&payload.parent_view_id,
&payload.layout,
payload.name.as_deref(),
)
.await?;
Ok(Json(AppResponse::Ok().with_data(page)))

View File

@ -49,13 +49,22 @@ pub async fn create_page(
workspace_id: Uuid,
parent_view_id: &str,
view_layout: &ViewLayout,
name: Option<&str>,
) -> Result<Page, AppError> {
if *view_layout != ViewLayout::Document {
return Err(AppError::InvalidRequest(
"Only document layout is supported for page creation".to_string(),
));
}
create_document_page(pg_pool, collab_storage, uid, workspace_id, parent_view_id).await
create_document_page(
pg_pool,
collab_storage,
uid,
workspace_id,
parent_view_id,
name,
)
.await
}
fn prepare_default_document_collab_param() -> Result<CollabParams, AppError> {
@ -80,10 +89,12 @@ async fn add_new_view_to_folder(
parent_view_id: &str,
view_id: &str,
folder: &mut Folder,
name: Option<&str>,
) -> Result<FolderUpdate, AppError> {
let encoded_update = {
let view = NestedChildViewBuilder::new(uid, parent_view_id.to_string())
.with_view_id(view_id)
.with_name(name.unwrap_or_default())
.build()
.view;
let mut txn = folder.collab.transact_mut();
@ -234,13 +245,15 @@ async fn create_document_page(
uid: i64,
workspace_id: Uuid,
parent_view_id: &str,
name: Option<&str>,
) -> Result<Page, AppError> {
let default_document_collab_params = prepare_default_document_collab_param()?;
let view_id = default_document_collab_params.object_id.clone();
let collab_origin = GetCollabOrigin::User { uid };
let mut folder =
get_latest_collab_folder(collab_storage, collab_origin, &workspace_id.to_string()).await?;
let folder_update = add_new_view_to_folder(uid, parent_view_id, &view_id, &mut folder).await?;
let folder_update =
add_new_view_to_folder(uid, parent_view_id, &view_id, &mut folder, name).await?;
let mut transaction = pg_pool.begin().await?;
let action = format!("Create new collab: {}", view_id);
collab_storage

View File

@ -100,6 +100,7 @@ async fn create_new_document_page() {
&CreatePageParams {
parent_view_id: general_space.view_id.clone(),
layout: ViewLayout::Document,
name: Some("New document".to_string()),
},
)
.await
@ -114,11 +115,12 @@ async fn create_new_document_page() {
.into_iter()
.find(|v| v.name == "General")
.unwrap();
general_space
let view = general_space
.children
.iter()
.find(|v| v.view_id == page.view_id)
.unwrap();
assert_eq!(view.name, "New document");
c.get_collab(QueryCollabParams {
workspace_id: workspace_id.to_string(),
inner: QueryCollab {

View File

@ -1,10 +1,4 @@
use std::time::Duration;
use client_api::entity::{CreateCollabParams, QueryCollabParams};
use client_api_test::generate_unique_registered_user_client;
use collab::core::origin::CollabClient;
use collab_folder::{CollabOrigin, Folder};
use tokio::time::sleep;
#[tokio::test]
async fn get_workpace_folder() {
@ -37,70 +31,3 @@ async fn get_workpace_folder() {
.unwrap();
assert_eq!(folder_view.children.len(), 2);
}
#[tokio::test]
async fn get_section_items() {
let (c, _user) = generate_unique_registered_user_client().await;
let user_workspace_info = c.get_user_workspace_info().await.unwrap();
let workspaces = c.get_workspaces().await.unwrap();
assert_eq!(workspaces.len(), 1);
let workspace_id = workspaces[0].workspace_id.to_string();
let folder_collab = c
.get_collab(QueryCollabParams::new(
workspace_id.clone(),
collab_entity::CollabType::Folder,
workspace_id.clone(),
))
.await
.unwrap()
.encode_collab;
let uid = user_workspace_info.user_profile.uid;
let mut folder = Folder::from_collab_doc_state(
uid,
CollabOrigin::Client(CollabClient::new(uid, c.device_id.clone())),
folder_collab.into(),
&workspace_id,
vec![],
)
.unwrap();
let views = folder.get_views_belong_to(&workspace_id);
let new_favorite_id = views[0].children[0].id.clone();
let to_be_deleted_favorite_id = views[0].children[1].id.clone();
folder.add_favorite_view_ids(vec![
new_favorite_id.clone(),
to_be_deleted_favorite_id.clone(),
]);
folder.add_trash_view_ids(vec![to_be_deleted_favorite_id.clone()]);
let recent_id = folder.get_views_belong_to(&new_favorite_id)[0].id.clone();
folder.add_recent_view_ids(vec![recent_id.clone()]);
let collab_type = collab_entity::CollabType::Folder;
c.update_collab(CreateCollabParams {
workspace_id: workspace_id.clone(),
collab_type: collab_type.clone(),
object_id: workspace_id.clone(),
encoded_collab_v1: folder
.encode_collab_v1(|collab| collab_type.validate_require_data(collab))
.unwrap()
.encode_to_bytes()
.unwrap(),
})
.await
.unwrap();
// Collab update is performed asynchronously via a queue
sleep(Duration::from_secs(1)).await;
let favorite_section_items = c.get_workspace_favorite(&workspace_id).await.unwrap();
assert_eq!(favorite_section_items.views.len(), 1);
assert_eq!(
favorite_section_items.views[0].view.view_id,
new_favorite_id
);
let trash_section_items = c.get_workspace_trash(&workspace_id).await.unwrap();
assert_eq!(trash_section_items.views.len(), 1);
assert_eq!(
trash_section_items.views[0].view.view_id,
to_be_deleted_favorite_id
);
let recent_section_items = c.get_workspace_recent(&workspace_id).await.unwrap();
assert_eq!(recent_section_items.views.len(), 1);
assert_eq!(recent_section_items.views[0].view.view_id, recent_id);
}