diff --git a/.sqlx/query-1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799.json b/.sqlx/query-1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799.json new file mode 100644 index 00000000..b5fc4f84 --- /dev/null +++ b/.sqlx/query-1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799.json @@ -0,0 +1,34 @@ +{ + "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 ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "namespace", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "doc_name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "view_id", + "type_info": "Uuid" + } + ], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [ + null, + false, + false + ] + }, + "hash": "1b3c3fee0db2369b3626b34c241c995e623bf280a1b31ea1b935c69937e7d799" +} diff --git a/.sqlx/query-4de4b2afb405bcd89ee015c79775b94fdbec9caa964819ed3de593e39c0db337.json b/.sqlx/query-4de4b2afb405bcd89ee015c79775b94fdbec9caa964819ed3de593e39c0db337.json deleted file mode 100644 index e48907bc..00000000 --- a/.sqlx/query-4de4b2afb405bcd89ee015c79775b94fdbec9caa964819ed3de593e39c0db337.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO af_published_collab (doc_name, published_by, workspace_id, metadata)\n VALUES ($1, (SELECT uid FROM af_user WHERE uuid = $2), $3, $4)\n ON CONFLICT (workspace_id, doc_name) DO UPDATE\n SET metadata = $4\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Uuid", - "Uuid", - "Jsonb" - ] - }, - "nullable": [] - }, - "hash": "4de4b2afb405bcd89ee015c79775b94fdbec9caa964819ed3de593e39c0db337" -} diff --git a/.sqlx/query-b60f92862ea3d80ae01a66c981768be142a55007438c053dd8ef2cb239c90088.json b/.sqlx/query-b60f92862ea3d80ae01a66c981768be142a55007438c053dd8ef2cb239c90088.json new file mode 100644 index 00000000..14b6c48c --- /dev/null +++ b/.sqlx/query-b60f92862ea3d80ae01a66c981768be142a55007438c053dd8ef2cb239c90088.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO af_published_collab (workspace_id, view_id, doc_name, published_by, metadata)\n VALUES ($1, $2, $3, (SELECT uid FROM af_user WHERE uuid = $4), $5)\n ON CONFLICT (workspace_id, view_id) DO UPDATE\n SET metadata = $5\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "Uuid", + "Text", + "Uuid", + "Jsonb" + ] + }, + "nullable": [] + }, + "hash": "b60f92862ea3d80ae01a66c981768be142a55007438c053dd8ef2cb239c90088" +} diff --git a/.sqlx/query-ed57079337ff4aa8ed85bdf3ff73bf7c7cc07112f59fa8aabee9c3290bcdc158.json b/.sqlx/query-c51b2030045bd58b1b3ac2ed12c24fedd32b19b456f2a865860cad597903fa5b.json similarity index 59% rename from .sqlx/query-ed57079337ff4aa8ed85bdf3ff73bf7c7cc07112f59fa8aabee9c3290bcdc158.json rename to .sqlx/query-c51b2030045bd58b1b3ac2ed12c24fedd32b19b456f2a865860cad597903fa5b.json index 355d1242..7a220ee3 100644 --- a/.sqlx/query-ed57079337ff4aa8ed85bdf3ff73bf7c7cc07112f59fa8aabee9c3290bcdc158.json +++ b/.sqlx/query-c51b2030045bd58b1b3ac2ed12c24fedd32b19b456f2a865860cad597903fa5b.json @@ -1,16 +1,16 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE af_published_collab\n SET blob = $1\n WHERE workspace_id = $2 AND doc_name = $3\n ", + "query": "\n UPDATE af_published_collab\n SET blob = $1\n WHERE workspace_id = $2\n AND view_id = $3\n ", "describe": { "columns": [], "parameters": { "Left": [ "Bytea", "Uuid", - "Text" + "Uuid" ] }, "nullable": [] }, - "hash": "ed57079337ff4aa8ed85bdf3ff73bf7c7cc07112f59fa8aabee9c3290bcdc158" + "hash": "c51b2030045bd58b1b3ac2ed12c24fedd32b19b456f2a865860cad597903fa5b" } diff --git a/.sqlx/query-4682b9460fe6087fe6c41cf55c6f4002f6a4344d5c2d4aad30c37134251e4007.json b/.sqlx/query-cb7c6555f1c837748cf0c7706000b28026c3dcdb7305f8c3a49082e1067f1fd8.json similarity index 61% rename from .sqlx/query-4682b9460fe6087fe6c41cf55c6f4002f6a4344d5c2d4aad30c37134251e4007.json rename to .sqlx/query-cb7c6555f1c837748cf0c7706000b28026c3dcdb7305f8c3a49082e1067f1fd8.json index cff0f54c..8860b44b 100644 --- a/.sqlx/query-4682b9460fe6087fe6c41cf55c6f4002f6a4344d5c2d4aad30c37134251e4007.json +++ b/.sqlx/query-cb7c6555f1c837748cf0c7706000b28026c3dcdb7305f8c3a49082e1067f1fd8.json @@ -1,15 +1,15 @@ { "db_name": "PostgreSQL", - "query": "\n DELETE FROM af_published_collab\n WHERE workspace_id = $1 AND doc_name = $2\n ", + "query": "\n DELETE FROM af_published_collab\n WHERE workspace_id = $1 AND view_id = $2\n ", "describe": { "columns": [], "parameters": { "Left": [ "Uuid", - "Text" + "Uuid" ] }, "nullable": [] }, - "hash": "4682b9460fe6087fe6c41cf55c6f4002f6a4344d5c2d4aad30c37134251e4007" + "hash": "cb7c6555f1c837748cf0c7706000b28026c3dcdb7305f8c3a49082e1067f1fd8" } diff --git a/.sqlx/query-aa6d8779c9c4a29b80fc1bd212869af207e9865852869adcdb5bef18f05d145d.json b/.sqlx/query-dd6ff315461ec898e43bc4624b51b10ef73fd1f87f94ce4f2e9f32136a1b4f67.json similarity index 66% rename from .sqlx/query-aa6d8779c9c4a29b80fc1bd212869af207e9865852869adcdb5bef18f05d145d.json rename to .sqlx/query-dd6ff315461ec898e43bc4624b51b10ef73fd1f87f94ce4f2e9f32136a1b4f67.json index 6b4e4ca9..d92690c2 100644 --- a/.sqlx/query-aa6d8779c9c4a29b80fc1bd212869af207e9865852869adcdb5bef18f05d145d.json +++ b/.sqlx/query-dd6ff315461ec898e43bc4624b51b10ef73fd1f87f94ce4f2e9f32136a1b4f67.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT EXISTS(\n SELECT 1\n FROM af_published_collab\n WHERE workspace_id = $1\n AND doc_name = $2\n AND published_by = (SELECT uid FROM af_user WHERE uuid = $3)\n );\n ", + "query": "\n SELECT EXISTS(\n SELECT 1\n FROM af_published_collab\n WHERE workspace_id = $1\n AND view_id = $2\n AND published_by = (SELECT uid FROM af_user WHERE uuid = $3)\n );\n ", "describe": { "columns": [ { @@ -12,7 +12,7 @@ "parameters": { "Left": [ "Uuid", - "Text", + "Uuid", "Uuid" ] }, @@ -20,5 +20,5 @@ null ] }, - "hash": "aa6d8779c9c4a29b80fc1bd212869af207e9865852869adcdb5bef18f05d145d" + "hash": "dd6ff315461ec898e43bc4624b51b10ef73fd1f87f94ce4f2e9f32136a1b4f67" } diff --git a/libs/client-api/src/http_publish.rs b/libs/client-api/src/http_publish.rs index db6d02cf..52ff4786 100644 --- a/libs/client-api/src/http_publish.rs +++ b/libs/client-api/src/http_publish.rs @@ -1,10 +1,7 @@ use bytes::Bytes; -use database_entity::dto::UpdatePublishNamespace; +use database_entity::dto::{PublishInfo, UpdatePublishNamespace}; use reqwest::{Body, Method}; -use shared_entity::{ - dto::workspace_dto::PublishInfo, - response::{AppResponse, AppResponseError}, -}; +use shared_entity::response::{AppResponse, AppResponseError}; use crate::Client; @@ -117,11 +114,11 @@ impl Client { // Guest API (no login required) impl Client { - pub async fn get_published_info( + pub async fn get_published_collab_info( &self, view_id: &uuid::Uuid, ) -> Result { - let url = format!("{}/api/workspace/published_info/{}", self.base_url, view_id,); + let url = format!("{}/api/workspace/published-info/{}", self.base_url, view_id,); let resp = self.cloud_client.get(&url).send().await?; AppResponse::::from_response(resp) diff --git a/libs/database-entity/src/dto.rs b/libs/database-entity/src/dto.rs index c3c20374..117091ae 100644 --- a/libs/database-entity/src/dto.rs +++ b/libs/database-entity/src/dto.rs @@ -306,6 +306,13 @@ pub struct AFCollabMember { pub permission: AFPermission, } +#[derive(Serialize, Deserialize)] +pub struct PublishInfo { + pub namespace: Option, + pub doc_name: String, + pub view_id: Uuid, +} + #[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone, Hash)] #[repr(i32)] pub enum AFRole { diff --git a/libs/database/src/pg_row.rs b/libs/database/src/pg_row.rs index 9c3d0986..0ce9b9a7 100644 --- a/libs/database/src/pg_row.rs +++ b/libs/database/src/pg_row.rs @@ -206,6 +206,7 @@ pub struct AFChatRow { pub workspace_id: Uuid, pub meta_data: serde_json::Value, } + #[derive(Debug, Clone, FromRow, Serialize, Deserialize)] pub struct AFChatMessageRow { pub message_id: i64, diff --git a/libs/database/src/workspace.rs b/libs/database/src/workspace.rs index fea37239..3a566bdc 100644 --- a/libs/database/src/workspace.rs +++ b/libs/database/src/workspace.rs @@ -1,5 +1,5 @@ use database_entity::dto::{ - AFRole, AFWorkspaceInvitation, AFWorkspaceInvitationStatus, AFWorkspaceSettings, + AFRole, AFWorkspaceInvitation, AFWorkspaceInvitationStatus, AFWorkspaceSettings, PublishInfo, }; use futures_util::stream::BoxStream; use sqlx::{types::uuid, Executor, PgPool, Postgres, Transaction}; @@ -1024,3 +1024,25 @@ pub async fn select_published_collab_blob<'a, E: Executor<'a, Database = Postgre Ok(res) } + +pub async fn select_published_collab_info<'a, E: Executor<'a, Database = Postgres>>( + executor: E, + view_id: &Uuid, +) -> Result { + let res = sqlx::query_as!( + PublishInfo, + r#" + SELECT + (SELECT publish_namespace FROM af_workspace aw WHERE aw.workspace_id = apc.workspace_id) AS namespace, + doc_name, + view_id + FROM af_published_collab apc + WHERE view_id = $1 + "#, + view_id, + ) + .fetch_one(executor) + .await?; + + Ok(res) +} diff --git a/libs/shared-entity/src/dto/workspace_dto.rs b/libs/shared-entity/src/dto/workspace_dto.rs index 1d4e97f2..6d0ce3f7 100644 --- a/libs/shared-entity/src/dto/workspace_dto.rs +++ b/libs/shared-entity/src/dto/workspace_dto.rs @@ -120,10 +120,3 @@ pub struct CollabResponse { #[serde(default)] pub object_id: String, } - -#[derive(Debug, serde::Deserialize)] -pub struct PublishInfo { - pub namespace: String, - pub doc_name: String, - pub view_id: uuid::Uuid, -} diff --git a/src/api/workspace.rs b/src/api/workspace.rs index bad586c6..db1c2847 100644 --- a/src/api/workspace.rs +++ b/src/api/workspace.rs @@ -132,6 +132,10 @@ pub fn workspace_scope() -> Scope { web::resource("/published/{publish_namespace}/{doc_name}/blob") .route(web::get().to(get_published_collab_blob_handler)) ) + .service( + web::resource("/published-info/{view_id}") + .route(web::get().to(get_published_collab_info_handler)) + ) .service( web::resource("/{workspace_id}/publish-namespace") .route(web::put().to(put_publish_namespace_handler)) @@ -988,6 +992,16 @@ async fn get_published_collab_blob_handler( Ok(collab_data) } +async fn get_published_collab_info_handler( + view_id: web::Path, + state: Data, +) -> Result>> { + let view_id = view_id.into_inner(); + let collab_data = + biz::workspace::ops::get_published_collab_info(&state.pg_pool, &view_id).await?; + Ok(Json(AppResponse::Ok().with_data(collab_data))) +} + async fn put_publish_collab_handler( path_param: web::Path<(Uuid, Uuid, String)>, user_uuid: UserUuid, diff --git a/src/biz/workspace/ops.rs b/src/biz/workspace/ops.rs index 997801e0..d3b9a19b 100644 --- a/src/biz/workspace/ops.rs +++ b/src/biz/workspace/ops.rs @@ -1,4 +1,6 @@ use std::collections::HashMap; + +use database_entity::dto::PublishInfo; use std::ops::DerefMut; use std::sync::Arc; @@ -21,9 +23,9 @@ use database::workspace::{ get_invitation_by_id, insert_or_replace_publish_collab_meta, insert_or_replace_published_collab_blob, insert_user_workspace, insert_workspace_invitation, rename_workspace, select_all_user_workspaces, select_publish_collab_meta, - select_published_collab_blob, select_user_is_collab_publisher, select_user_is_workspace_owner, - select_workspace, select_workspace_invitations_for_user, select_workspace_member, - select_workspace_member_list, select_workspace_publish_namespace, + select_published_collab_blob, select_published_collab_info, select_user_is_collab_publisher, + select_user_is_workspace_owner, select_workspace, select_workspace_invitations_for_user, + select_workspace_member, select_workspace_member_list, select_workspace_publish_namespace, select_workspace_publish_namespace_exists, select_workspace_settings, select_workspace_total_collab_bytes, update_updated_at_of_workspace, update_workspace_invitation_set_status_accepted, update_workspace_publish_namespace, @@ -201,6 +203,13 @@ pub async fn get_published_collab_blob( select_published_collab_blob(pg_pool, publish_namespace, doc_name).await } +pub async fn get_published_collab_info( + pg_pool: &PgPool, + view_id: &Uuid, +) -> Result { + select_published_collab_info(pg_pool, view_id).await +} + pub async fn delete_published_workspace_collab( pg_pool: &PgPool, workspace_id: &Uuid, diff --git a/tests/workspace/publish.rs b/tests/workspace/publish.rs index 9bdda974..dfe93edb 100644 --- a/tests/workspace/publish.rs +++ b/tests/workspace/publish.rs @@ -86,7 +86,7 @@ async fn test_publish_doc() { .unwrap(); { - // Non login user should be able to view the published collab metadata + // 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, my_doc_name) @@ -94,6 +94,14 @@ async fn test_publish_doc() { .unwrap(); assert_eq!(published_collab.title, "my_title"); + let publish_info = guest_client + .get_published_collab_info(&view_id) + .await + .unwrap(); + assert_eq!(publish_info.namespace, Some(my_namespace.clone())); + assert_eq!(publish_info.doc_name, my_doc_name); + assert_eq!(publish_info.view_id, view_id); + let collab_data = guest_client .get_published_collab_blob(&my_namespace, my_doc_name) .await