feat: allow create page API to accept a view name (#1005)
This commit is contained in:
parent
51bd650644
commit
2647d41f3a
|
|
@ -132,6 +132,7 @@ pub struct Page {
|
||||||
pub struct CreatePageParams {
|
pub struct CreatePageParams {
|
||||||
pub parent_view_id: String,
|
pub parent_view_id: String,
|
||||||
pub layout: ViewLayout,
|
pub layout: ViewLayout,
|
||||||
|
pub name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
|
|
||||||
|
|
@ -916,6 +916,7 @@ async fn post_page_view_handler(
|
||||||
workspace_uuid,
|
workspace_uuid,
|
||||||
&payload.parent_view_id,
|
&payload.parent_view_id,
|
||||||
&payload.layout,
|
&payload.layout,
|
||||||
|
payload.name.as_deref(),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
Ok(Json(AppResponse::Ok().with_data(page)))
|
Ok(Json(AppResponse::Ok().with_data(page)))
|
||||||
|
|
|
||||||
|
|
@ -49,13 +49,22 @@ pub async fn create_page(
|
||||||
workspace_id: Uuid,
|
workspace_id: Uuid,
|
||||||
parent_view_id: &str,
|
parent_view_id: &str,
|
||||||
view_layout: &ViewLayout,
|
view_layout: &ViewLayout,
|
||||||
|
name: Option<&str>,
|
||||||
) -> Result<Page, AppError> {
|
) -> Result<Page, AppError> {
|
||||||
if *view_layout != ViewLayout::Document {
|
if *view_layout != ViewLayout::Document {
|
||||||
return Err(AppError::InvalidRequest(
|
return Err(AppError::InvalidRequest(
|
||||||
"Only document layout is supported for page creation".to_string(),
|
"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> {
|
fn prepare_default_document_collab_param() -> Result<CollabParams, AppError> {
|
||||||
|
|
@ -80,10 +89,12 @@ async fn add_new_view_to_folder(
|
||||||
parent_view_id: &str,
|
parent_view_id: &str,
|
||||||
view_id: &str,
|
view_id: &str,
|
||||||
folder: &mut Folder,
|
folder: &mut Folder,
|
||||||
|
name: Option<&str>,
|
||||||
) -> Result<FolderUpdate, AppError> {
|
) -> Result<FolderUpdate, AppError> {
|
||||||
let encoded_update = {
|
let encoded_update = {
|
||||||
let view = NestedChildViewBuilder::new(uid, parent_view_id.to_string())
|
let view = NestedChildViewBuilder::new(uid, parent_view_id.to_string())
|
||||||
.with_view_id(view_id)
|
.with_view_id(view_id)
|
||||||
|
.with_name(name.unwrap_or_default())
|
||||||
.build()
|
.build()
|
||||||
.view;
|
.view;
|
||||||
let mut txn = folder.collab.transact_mut();
|
let mut txn = folder.collab.transact_mut();
|
||||||
|
|
@ -234,13 +245,15 @@ async fn create_document_page(
|
||||||
uid: i64,
|
uid: i64,
|
||||||
workspace_id: Uuid,
|
workspace_id: Uuid,
|
||||||
parent_view_id: &str,
|
parent_view_id: &str,
|
||||||
|
name: Option<&str>,
|
||||||
) -> Result<Page, AppError> {
|
) -> Result<Page, AppError> {
|
||||||
let default_document_collab_params = prepare_default_document_collab_param()?;
|
let default_document_collab_params = prepare_default_document_collab_param()?;
|
||||||
let view_id = default_document_collab_params.object_id.clone();
|
let view_id = default_document_collab_params.object_id.clone();
|
||||||
let collab_origin = GetCollabOrigin::User { uid };
|
let collab_origin = GetCollabOrigin::User { uid };
|
||||||
let mut folder =
|
let mut folder =
|
||||||
get_latest_collab_folder(collab_storage, collab_origin, &workspace_id.to_string()).await?;
|
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 mut transaction = pg_pool.begin().await?;
|
||||||
let action = format!("Create new collab: {}", view_id);
|
let action = format!("Create new collab: {}", view_id);
|
||||||
collab_storage
|
collab_storage
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@ async fn create_new_document_page() {
|
||||||
&CreatePageParams {
|
&CreatePageParams {
|
||||||
parent_view_id: general_space.view_id.clone(),
|
parent_view_id: general_space.view_id.clone(),
|
||||||
layout: ViewLayout::Document,
|
layout: ViewLayout::Document,
|
||||||
|
name: Some("New document".to_string()),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
@ -114,11 +115,12 @@ async fn create_new_document_page() {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.find(|v| v.name == "General")
|
.find(|v| v.name == "General")
|
||||||
.unwrap();
|
.unwrap();
|
||||||
general_space
|
let view = general_space
|
||||||
.children
|
.children
|
||||||
.iter()
|
.iter()
|
||||||
.find(|v| v.view_id == page.view_id)
|
.find(|v| v.view_id == page.view_id)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
assert_eq!(view.name, "New document");
|
||||||
c.get_collab(QueryCollabParams {
|
c.get_collab(QueryCollabParams {
|
||||||
workspace_id: workspace_id.to_string(),
|
workspace_id: workspace_id.to_string(),
|
||||||
inner: QueryCollab {
|
inner: QueryCollab {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use client_api::entity::{CreateCollabParams, QueryCollabParams};
|
|
||||||
use client_api_test::generate_unique_registered_user_client;
|
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]
|
#[tokio::test]
|
||||||
async fn get_workpace_folder() {
|
async fn get_workpace_folder() {
|
||||||
|
|
@ -37,70 +31,3 @@ async fn get_workpace_folder() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(folder_view.children.len(), 2);
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue