From 0bf6d3bd60a52311ec320175a7f28291cb4104d9 Mon Sep 17 00:00:00 2001 From: Zack Fu Zi Xiang Date: Fri, 21 Jun 2024 11:18:44 +0800 Subject: [PATCH 1/3] feat: change doc name to publish name --- libs/client-api/src/http_publish.rs | 8 +++---- libs/database-entity/src/dto.rs | 4 ++-- libs/database/src/workspace.rs | 22 +++++++++---------- .../20240621105148_publish_collab_3.sql | 1 + src/api/workspace.rs | 19 +++++++++------- src/biz/workspace/ops.rs | 16 +++++++------- tests/workspace/publish.rs | 22 +++++++++---------- 7 files changed, 48 insertions(+), 44 deletions(-) create mode 100644 migrations/20240621105148_publish_collab_3.sql diff --git a/libs/client-api/src/http_publish.rs b/libs/client-api/src/http_publish.rs index a9bf0235..18165aa7 100644 --- a/libs/client-api/src/http_publish.rs +++ b/libs/client-api/src/http_publish.rs @@ -80,14 +80,14 @@ impl Client { pub async fn get_published_collab( &self, publish_namespace: &str, - doc_name: &str, + publish_name: &str, ) -> Result where T: serde::de::DeserializeOwned, { let url = format!( "{}/api/workspace/published/{}/{}", - self.base_url, publish_namespace, doc_name + self.base_url, publish_namespace, publish_name ); let resp = self @@ -110,11 +110,11 @@ impl Client { pub async fn get_published_collab_blob( &self, publish_namespace: &str, - doc_name: &str, + publish_name: &str, ) -> Result { let url = format!( "{}/api/workspace/published/{}/{}/blob", - self.base_url, publish_namespace, doc_name + self.base_url, publish_namespace, publish_name ); let bytes = self .cloud_client diff --git a/libs/database-entity/src/dto.rs b/libs/database-entity/src/dto.rs index 8d7b5a78..da151add 100644 --- a/libs/database-entity/src/dto.rs +++ b/libs/database-entity/src/dto.rs @@ -309,7 +309,7 @@ pub struct AFCollabMember { #[derive(Serialize, Deserialize)] pub struct PublishInfo { pub namespace: Option, - pub doc_name: String, + pub publish_name: String, pub view_id: Uuid, } @@ -766,7 +766,7 @@ pub struct CreateAnswerMessageParams { #[derive(Serialize, Deserialize, Debug)] pub struct PublishCollabMetadata { pub view_id: uuid::Uuid, - pub doc_name: String, + pub publish_name: String, pub metadata: Metadata, } diff --git a/libs/database/src/workspace.rs b/libs/database/src/workspace.rs index 084fb5ba..1fecebcd 100644 --- a/libs/database/src/workspace.rs +++ b/libs/database/src/workspace.rs @@ -896,9 +896,9 @@ pub async fn insert_or_replace_publish_collab_metas<'a, E: Executor<'a, Database publish_item: &[PublishCollabItem>], ) -> Result<(), AppError> { let view_ids: Vec = publish_item.iter().map(|item| item.meta.view_id).collect(); - let doc_names: Vec = publish_item + let publish_names: Vec = publish_item .iter() - .map(|item| item.meta.doc_name.clone()) + .map(|item| item.meta.publish_name.clone()) .collect(); let metadatas: Vec = publish_item .iter() @@ -908,7 +908,7 @@ pub async fn insert_or_replace_publish_collab_metas<'a, E: Executor<'a, Database let blobs: Vec> = publish_item.iter().map(|item| item.data.clone()).collect(); let res = sqlx::query!( r#" - INSERT INTO af_published_collab (workspace_id, view_id, doc_name, published_by, metadata, blob) + INSERT INTO af_published_collab (workspace_id, view_id, publish_name, published_by, metadata, blob) SELECT * FROM UNNEST( (SELECT array_agg((SELECT $1::uuid)) FROM generate_series(1, $7))::uuid[], $2::uuid[], @@ -922,7 +922,7 @@ pub async fn insert_or_replace_publish_collab_metas<'a, E: Executor<'a, Database "#, workspace_id, &view_ids, - &doc_names, + &publish_names, publisher_uuid, &metadatas, &blobs, @@ -945,17 +945,17 @@ pub async fn insert_or_replace_publish_collab_metas<'a, E: Executor<'a, Database pub async fn select_publish_collab_meta<'a, E: Executor<'a, Database = Postgres>>( executor: E, publish_namespace: &str, - doc_name: &str, + publish_name: &str, ) -> Result { let res = sqlx::query!( r#" SELECT metadata FROM af_published_collab WHERE workspace_id = (SELECT workspace_id FROM af_workspace WHERE publish_namespace = $1) - AND doc_name = $2 + AND publish_name = $2 "#, publish_namespace, - doc_name, + publish_name, ) .fetch_one(executor) .await?; @@ -997,17 +997,17 @@ pub async fn delete_published_collabs<'a, E: Executor<'a, Database = Postgres>>( pub async fn select_published_collab_blob<'a, E: Executor<'a, Database = Postgres>>( executor: E, publish_namespace: &str, - doc_name: &str, + publish_name: &str, ) -> Result, AppError> { let res = sqlx::query_scalar!( r#" SELECT blob FROM af_published_collab WHERE workspace_id = (SELECT workspace_id FROM af_workspace WHERE publish_namespace = $1) - AND doc_name = $2 + AND publish_name = $2 "#, publish_namespace, - doc_name, + publish_name, ) .fetch_one(executor) .await?; @@ -1024,7 +1024,7 @@ pub async fn select_published_collab_info<'a, E: Executor<'a, Database = Postgre r#" SELECT (SELECT publish_namespace FROM af_workspace aw WHERE aw.workspace_id = apc.workspace_id) AS namespace, - doc_name, + publish_name, view_id FROM af_published_collab apc WHERE view_id = $1 diff --git a/migrations/20240621105148_publish_collab_3.sql b/migrations/20240621105148_publish_collab_3.sql new file mode 100644 index 00000000..68fe2d86 --- /dev/null +++ b/migrations/20240621105148_publish_collab_3.sql @@ -0,0 +1 @@ +ALTER TABLE af_published_collab RENAME COLUMN doc_name TO publish_name; diff --git a/src/api/workspace.rs b/src/api/workspace.rs index a552afe6..18d42ca3 100644 --- a/src/api/workspace.rs +++ b/src/api/workspace.rs @@ -128,11 +128,11 @@ pub fn workspace_scope() -> Scope { .route(web::delete().to(remove_collab_member_handler)), ) .service( - web::resource("/published/{publish_namespace}/{doc_name}") + web::resource("/published/{publish_namespace}/{publish_name}") .route(web::get().to(get_published_collab_handler)) ) .service( - web::resource("/published/{publish_namespace}/{doc_name}/blob") + web::resource("/published/{publish_namespace}/{publish_name}/blob") .route(web::get().to(get_published_collab_blob_handler)) ) .service( @@ -970,9 +970,9 @@ async fn get_published_collab_handler( path_param: web::Path<(String, String)>, state: Data, ) -> Result> { - let (workspace_namespace, doc_name) = path_param.into_inner(); + let (workspace_namespace, publish_name) = path_param.into_inner(); let metadata = - biz::workspace::ops::get_published_collab(&state.pg_pool, &workspace_namespace, &doc_name) + biz::workspace::ops::get_published_collab(&state.pg_pool, &workspace_namespace, &publish_name) .await?; Ok(Json(metadata)) } @@ -981,10 +981,13 @@ async fn get_published_collab_blob_handler( path_param: web::Path<(String, String)>, state: Data, ) -> Result> { - let (publish_namespace, doc_name) = path_param.into_inner(); - let collab_data = - biz::workspace::ops::get_published_collab_blob(&state.pg_pool, &publish_namespace, &doc_name) - .await?; + let (publish_namespace, publish_name) = path_param.into_inner(); + let collab_data = biz::workspace::ops::get_published_collab_blob( + &state.pg_pool, + &publish_namespace, + &publish_name, + ) + .await?; Ok(collab_data) } diff --git a/src/biz/workspace/ops.rs b/src/biz/workspace/ops.rs index 5caa060c..c10115be 100644 --- a/src/biz/workspace/ops.rs +++ b/src/biz/workspace/ops.rs @@ -150,7 +150,7 @@ pub async fn publish_collabs( publish_items: &[PublishCollabItem>], ) -> Result<(), AppError> { for publish_item in publish_items { - check_collab_doc_name(publish_item.meta.doc_name.as_str())?; + check_collab_publish_name(publish_item.meta.publish_name.as_str())?; } insert_or_replace_publish_collab_metas(pg_pool, workspace_id, publisher_uuid, publish_items) .await?; @@ -160,18 +160,18 @@ pub async fn publish_collabs( pub async fn get_published_collab( pg_pool: &PgPool, publish_namespace: &str, - doc_name: &str, + publish_name: &str, ) -> Result { - let metadata = select_publish_collab_meta(pg_pool, publish_namespace, doc_name).await?; + let metadata = select_publish_collab_meta(pg_pool, publish_namespace, publish_name).await?; Ok(metadata) } pub async fn get_published_collab_blob( pg_pool: &PgPool, publish_namespace: &str, - doc_name: &str, + publish_name: &str, ) -> Result, AppError> { - select_published_collab_blob(pg_pool, publish_namespace, doc_name).await + select_published_collab_blob(pg_pool, publish_namespace, publish_name).await } pub async fn get_published_collab_info( @@ -589,16 +589,16 @@ async fn check_workspace_owner_or_publisher( Ok(()) } -fn check_collab_doc_name(doc_name: &str) -> Result<(), AppError> { +fn check_collab_publish_name(publish_name: &str) -> Result<(), AppError> { // Check len - if doc_name.len() > 20 { + if publish_name.len() > 20 { return Err(AppError::InvalidRequest( "Document name must be at most 20 characters long".to_string(), )); } // Only contain alphanumeric characters and hyphens - for c in doc_name.chars() { + for c in publish_name.chars() { if !c.is_alphanumeric() && c != '-' { return Err(AppError::InvalidRequest( "Document name must only contain alphanumeric characters and hyphens".to_string(), diff --git a/tests/workspace/publish.rs b/tests/workspace/publish.rs index bfda28ef..4b5eed5b 100644 --- a/tests/workspace/publish.rs +++ b/tests/workspace/publish.rs @@ -73,9 +73,9 @@ async fn test_publish_doc() { .await .unwrap(); - let doc_name_1 = "doc1"; + let publish_name_1 = "publish_name_1"; let view_id_1 = uuid::Uuid::new_v4(); - let doc_name_2 = "doc2"; + let publish_name_2 = "publish_name_2"; let view_id_2 = uuid::Uuid::new_v4(); c.publish_collabs::( &workspace_id, @@ -83,7 +83,7 @@ async fn test_publish_doc() { PublishCollabItem { meta: PublishCollabMetadata { view_id: view_id_1, - doc_name: doc_name_1.to_string(), + publish_name: publish_name_1.to_string(), metadata: MyCustomMetadata { title: "my_title_1".to_string(), }, @@ -93,7 +93,7 @@ async fn test_publish_doc() { PublishCollabItem { meta: PublishCollabMetadata { view_id: view_id_2, - doc_name: doc_name_2.to_string(), + publish_name: publish_name_2.to_string(), metadata: MyCustomMetadata { title: "my_title_2".to_string(), }, @@ -109,7 +109,7 @@ async fn test_publish_doc() { // Non login user should be able to view the published collab let guest_client = localhost_client(); let published_collab = guest_client - .get_published_collab::(&my_namespace, doc_name_1) + .get_published_collab::(&my_namespace, publish_name_1) .await .unwrap(); assert_eq!(published_collab.title, "my_title_1"); @@ -119,11 +119,11 @@ async fn test_publish_doc() { .await .unwrap(); assert_eq!(publish_info.namespace, Some(my_namespace.clone())); - assert_eq!(publish_info.doc_name, doc_name_1); + assert_eq!(publish_info.publish_name, publish_name_1); assert_eq!(publish_info.view_id, view_id_1); let blob = guest_client - .get_published_collab_blob(&my_namespace, doc_name_1) + .get_published_collab_blob(&my_namespace, publish_name_1) .await .unwrap(); assert_eq!(blob, "yrs_encoded_data_1"); @@ -137,7 +137,7 @@ async fn test_publish_doc() { // Deleted collab should not be accessible let guest_client = localhost_client(); let err = guest_client - .get_published_collab::(&my_namespace, doc_name_1) + .get_published_collab::(&my_namespace, publish_name_1) .await .err() .unwrap(); @@ -145,7 +145,7 @@ async fn test_publish_doc() { let guest_client = localhost_client(); let err = guest_client - .get_published_collab_blob(&my_namespace, doc_name_1) + .get_published_collab_blob(&my_namespace, publish_name_1) .await .err() .unwrap(); @@ -177,9 +177,9 @@ async fn test_publish_load_test() { .map(|i| PublishCollabItem { meta: PublishCollabMetadata { view_id: uuid::Uuid::new_v4(), - doc_name: format!("doc{}", i), + publish_name: format!("publish_name_{}", i), metadata: MyCustomMetadata { - title: format!("title{}", i), + title: format!("title_{}", i), }, }, data: vec![0; 100_000], // 100 KB From 9a90f77b6e2f1f3ccf31873fffd622efa8606455 Mon Sep 17 00:00:00 2001 From: Zack Fu Zi Xiang Date: Fri, 21 Jun 2024 11:31:42 +0800 Subject: [PATCH 2/3] chore: sqlx --- ...cbe957267575acd14ec01af2425617eea5628.json | 20 +++++++++++++++++++ ...2d932b47bf18222628a22089b6fbd3891ec4.json} | 4 ++-- ...7b22d3be3160638285563e32d4dc2b787916.json} | 4 ++-- ...92f7812dfa039276534664f60b37e3898c75.json} | 6 +++--- ...d65fcd003c6a645876f7aa8e677eaad59517c.json | 20 ------------------- 5 files changed, 27 insertions(+), 27 deletions(-) create mode 100644 .sqlx/query-3ad29cddcb72f375c98db91f697cbe957267575acd14ec01af2425617eea5628.json rename .sqlx/{query-9bae6b89710e36c6cf98f6dface9cf0b152b8d72feaea6749cf69450c57f6e1c.json => query-4d0c77eaabb72b06b3f0809ee3722d932b47bf18222628a22089b6fbd3891ec4.json} (74%) rename .sqlx/{query-cbe1ccd5c0136eb11f02a5287ec8c48d90077937581a75302876adecb31cad42.json => query-8f5b50a17db6599da536d50de5c77b22d3be3160638285563e32d4dc2b787916.json} (73%) rename .sqlx/{query-1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799.json => query-f8e631002ccbe616ab558a2025d892f7812dfa039276534664f60b37e3898c75.json} (71%) delete mode 100644 .sqlx/query-fa640accaba3655cd842ebc4838d65fcd003c6a645876f7aa8e677eaad59517c.json diff --git a/.sqlx/query-3ad29cddcb72f375c98db91f697cbe957267575acd14ec01af2425617eea5628.json b/.sqlx/query-3ad29cddcb72f375c98db91f697cbe957267575acd14ec01af2425617eea5628.json new file mode 100644 index 00000000..b7c5e885 --- /dev/null +++ b/.sqlx/query-3ad29cddcb72f375c98db91f697cbe957267575acd14ec01af2425617eea5628.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO af_published_collab (workspace_id, view_id, publish_name, published_by, metadata, blob)\n SELECT * FROM UNNEST(\n (SELECT array_agg((SELECT $1::uuid)) FROM generate_series(1, $7))::uuid[],\n $2::uuid[],\n $3::text[],\n (SELECT array_agg((SELECT uid FROM af_user WHERE uuid = $4)) FROM generate_series(1, $7))::bigint[],\n $5::jsonb[],\n $6::bytea[]\n )\n ON CONFLICT (workspace_id, view_id) DO UPDATE\n SET metadata = EXCLUDED.metadata\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "UuidArray", + "TextArray", + "Uuid", + "JsonbArray", + "ByteaArray", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "3ad29cddcb72f375c98db91f697cbe957267575acd14ec01af2425617eea5628" +} diff --git a/.sqlx/query-9bae6b89710e36c6cf98f6dface9cf0b152b8d72feaea6749cf69450c57f6e1c.json b/.sqlx/query-4d0c77eaabb72b06b3f0809ee3722d932b47bf18222628a22089b6fbd3891ec4.json similarity index 74% rename from .sqlx/query-9bae6b89710e36c6cf98f6dface9cf0b152b8d72feaea6749cf69450c57f6e1c.json rename to .sqlx/query-4d0c77eaabb72b06b3f0809ee3722d932b47bf18222628a22089b6fbd3891ec4.json index 0563c2f0..07e706d0 100644 --- a/.sqlx/query-9bae6b89710e36c6cf98f6dface9cf0b152b8d72feaea6749cf69450c57f6e1c.json +++ b/.sqlx/query-4d0c77eaabb72b06b3f0809ee3722d932b47bf18222628a22089b6fbd3891ec4.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT metadata\n FROM af_published_collab\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace WHERE publish_namespace = $1)\n AND doc_name = $2\n ", + "query": "\n SELECT metadata\n FROM af_published_collab\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace WHERE publish_namespace = $1)\n AND publish_name = $2\n ", "describe": { "columns": [ { @@ -19,5 +19,5 @@ false ] }, - "hash": "9bae6b89710e36c6cf98f6dface9cf0b152b8d72feaea6749cf69450c57f6e1c" + "hash": "4d0c77eaabb72b06b3f0809ee3722d932b47bf18222628a22089b6fbd3891ec4" } diff --git a/.sqlx/query-cbe1ccd5c0136eb11f02a5287ec8c48d90077937581a75302876adecb31cad42.json b/.sqlx/query-8f5b50a17db6599da536d50de5c77b22d3be3160638285563e32d4dc2b787916.json similarity index 73% rename from .sqlx/query-cbe1ccd5c0136eb11f02a5287ec8c48d90077937581a75302876adecb31cad42.json rename to .sqlx/query-8f5b50a17db6599da536d50de5c77b22d3be3160638285563e32d4dc2b787916.json index 5ec5c545..830875a2 100644 --- a/.sqlx/query-cbe1ccd5c0136eb11f02a5287ec8c48d90077937581a75302876adecb31cad42.json +++ b/.sqlx/query-8f5b50a17db6599da536d50de5c77b22d3be3160638285563e32d4dc2b787916.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT blob\n FROM af_published_collab\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace WHERE publish_namespace = $1)\n AND doc_name = $2\n ", + "query": "\n SELECT blob\n FROM af_published_collab\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace WHERE publish_namespace = $1)\n AND publish_name = $2\n ", "describe": { "columns": [ { @@ -19,5 +19,5 @@ false ] }, - "hash": "cbe1ccd5c0136eb11f02a5287ec8c48d90077937581a75302876adecb31cad42" + "hash": "8f5b50a17db6599da536d50de5c77b22d3be3160638285563e32d4dc2b787916" } diff --git a/.sqlx/query-1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799.json b/.sqlx/query-f8e631002ccbe616ab558a2025d892f7812dfa039276534664f60b37e3898c75.json similarity index 71% rename from .sqlx/query-1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799.json rename to .sqlx/query-f8e631002ccbe616ab558a2025d892f7812dfa039276534664f60b37e3898c75.json index b5fc4f84..84ceec3c 100644 --- a/.sqlx/query-1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799.json +++ b/.sqlx/query-f8e631002ccbe616ab558a2025d892f7812dfa039276534664f60b37e3898c75.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n (SELECT publish_namespace FROM af_workspace aw WHERE aw.workspace_id = apc.workspace_id) AS namespace,\n doc_name,\n view_id\n FROM af_published_collab apc\n WHERE view_id = $1\n ", + "query": "\n SELECT\n (SELECT publish_namespace FROM af_workspace aw WHERE aw.workspace_id = apc.workspace_id) AS namespace,\n publish_name,\n view_id\n FROM af_published_collab apc\n WHERE view_id = $1\n ", "describe": { "columns": [ { @@ -10,7 +10,7 @@ }, { "ordinal": 1, - "name": "doc_name", + "name": "publish_name", "type_info": "Text" }, { @@ -30,5 +30,5 @@ false ] }, - "hash": "1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799" + "hash": "f8e631002ccbe616ab558a2025d892f7812dfa039276534664f60b37e3898c75" } diff --git a/.sqlx/query-fa640accaba3655cd842ebc4838d65fcd003c6a645876f7aa8e677eaad59517c.json b/.sqlx/query-fa640accaba3655cd842ebc4838d65fcd003c6a645876f7aa8e677eaad59517c.json deleted file mode 100644 index 62b8326b..00000000 --- a/.sqlx/query-fa640accaba3655cd842ebc4838d65fcd003c6a645876f7aa8e677eaad59517c.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO af_published_collab (workspace_id, view_id, doc_name, published_by, metadata, blob)\n SELECT * FROM UNNEST(\n (SELECT array_agg((SELECT $1::uuid)) FROM generate_series(1, $7))::uuid[],\n $2::uuid[],\n $3::text[],\n (SELECT array_agg((SELECT uid FROM af_user WHERE uuid = $4)) FROM generate_series(1, $7))::bigint[],\n $5::jsonb[],\n $6::bytea[]\n )\n ON CONFLICT (workspace_id, view_id) DO UPDATE\n SET metadata = EXCLUDED.metadata\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid", - "UuidArray", - "TextArray", - "Uuid", - "JsonbArray", - "ByteaArray", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "fa640accaba3655cd842ebc4838d65fcd003c6a645876f7aa8e677eaad59517c" -} From e1402a97914020802888348b81bb67946c9e0d8f Mon Sep 17 00:00:00 2001 From: Zack Fu Zi Xiang Date: Fri, 21 Jun 2024 12:05:41 +0800 Subject: [PATCH 3/3] fix: publish name --- tests/workspace/publish.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/workspace/publish.rs b/tests/workspace/publish.rs index 4b5eed5b..c0ca9986 100644 --- a/tests/workspace/publish.rs +++ b/tests/workspace/publish.rs @@ -73,9 +73,9 @@ async fn test_publish_doc() { .await .unwrap(); - let publish_name_1 = "publish_name_1"; + let publish_name_1 = "publish-name-1"; let view_id_1 = uuid::Uuid::new_v4(); - let publish_name_2 = "publish_name_2"; + let publish_name_2 = "publish-name-2"; let view_id_2 = uuid::Uuid::new_v4(); c.publish_collabs::( &workspace_id, @@ -177,7 +177,7 @@ async fn test_publish_load_test() { .map(|i| PublishCollabItem { meta: PublishCollabMetadata { view_id: uuid::Uuid::new_v4(), - publish_name: format!("publish_name_{}", i), + publish_name: format!("publish-name-{}", i), metadata: MyCustomMetadata { title: format!("title_{}", i), },