feat: add impl for get collab info

This commit is contained in:
Zack Fu Zi Xiang 2024-06-18 19:07:48 +08:00
parent 18e9d0abae
commit 09828c5eea
No known key found for this signature in database
14 changed files with 131 additions and 45 deletions

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -1,16 +1,16 @@
{ {
"db_name": "PostgreSQL", "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": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
"Left": [ "Left": [
"Bytea", "Bytea",
"Uuid", "Uuid",
"Text" "Uuid"
] ]
}, },
"nullable": [] "nullable": []
}, },
"hash": "ed57079337ff4aa8ed85bdf3ff73bf7c7cc07112f59fa8aabee9c3290bcdc158" "hash": "c51b2030045bd58b1b3ac2ed12c24fedd32b19b456f2a865860cad597903fa5b"
} }

View File

@ -1,15 +1,15 @@
{ {
"db_name": "PostgreSQL", "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": { "describe": {
"columns": [], "columns": [],
"parameters": { "parameters": {
"Left": [ "Left": [
"Uuid", "Uuid",
"Text" "Uuid"
] ]
}, },
"nullable": [] "nullable": []
}, },
"hash": "4682b9460fe6087fe6c41cf55c6f4002f6a4344d5c2d4aad30c37134251e4007" "hash": "cb7c6555f1c837748cf0c7706000b28026c3dcdb7305f8c3a49082e1067f1fd8"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "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": { "describe": {
"columns": [ "columns": [
{ {
@ -12,7 +12,7 @@
"parameters": { "parameters": {
"Left": [ "Left": [
"Uuid", "Uuid",
"Text", "Uuid",
"Uuid" "Uuid"
] ]
}, },
@ -20,5 +20,5 @@
null null
] ]
}, },
"hash": "aa6d8779c9c4a29b80fc1bd212869af207e9865852869adcdb5bef18f05d145d" "hash": "dd6ff315461ec898e43bc4624b51b10ef73fd1f87f94ce4f2e9f32136a1b4f67"
} }

View File

@ -1,10 +1,7 @@
use bytes::Bytes; use bytes::Bytes;
use database_entity::dto::UpdatePublishNamespace; use database_entity::dto::{PublishInfo, UpdatePublishNamespace};
use reqwest::{Body, Method}; use reqwest::{Body, Method};
use shared_entity::{ use shared_entity::response::{AppResponse, AppResponseError};
dto::workspace_dto::PublishInfo,
response::{AppResponse, AppResponseError},
};
use crate::Client; use crate::Client;
@ -117,11 +114,11 @@ impl Client {
// Guest API (no login required) // Guest API (no login required)
impl Client { impl Client {
pub async fn get_published_info( pub async fn get_published_collab_info(
&self, &self,
view_id: &uuid::Uuid, view_id: &uuid::Uuid,
) -> Result<PublishInfo, AppResponseError> { ) -> Result<PublishInfo, AppResponseError> {
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?; let resp = self.cloud_client.get(&url).send().await?;
AppResponse::<PublishInfo>::from_response(resp) AppResponse::<PublishInfo>::from_response(resp)

View File

@ -306,6 +306,13 @@ pub struct AFCollabMember {
pub permission: AFPermission, pub permission: AFPermission,
} }
#[derive(Serialize, Deserialize)]
pub struct PublishInfo {
pub namespace: Option<String>,
pub doc_name: String,
pub view_id: Uuid,
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone, Hash)] #[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone, Hash)]
#[repr(i32)] #[repr(i32)]
pub enum AFRole { pub enum AFRole {

View File

@ -206,6 +206,7 @@ pub struct AFChatRow {
pub workspace_id: Uuid, pub workspace_id: Uuid,
pub meta_data: serde_json::Value, pub meta_data: serde_json::Value,
} }
#[derive(Debug, Clone, FromRow, Serialize, Deserialize)] #[derive(Debug, Clone, FromRow, Serialize, Deserialize)]
pub struct AFChatMessageRow { pub struct AFChatMessageRow {
pub message_id: i64, pub message_id: i64,

View File

@ -1,5 +1,5 @@
use database_entity::dto::{ use database_entity::dto::{
AFRole, AFWorkspaceInvitation, AFWorkspaceInvitationStatus, AFWorkspaceSettings, AFRole, AFWorkspaceInvitation, AFWorkspaceInvitationStatus, AFWorkspaceSettings, PublishInfo,
}; };
use futures_util::stream::BoxStream; use futures_util::stream::BoxStream;
use sqlx::{types::uuid, Executor, PgPool, Postgres, Transaction}; 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) Ok(res)
} }
pub async fn select_published_collab_info<'a, E: Executor<'a, Database = Postgres>>(
executor: E,
view_id: &Uuid,
) -> Result<PublishInfo, AppError> {
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)
}

View File

@ -120,10 +120,3 @@ pub struct CollabResponse {
#[serde(default)] #[serde(default)]
pub object_id: String, pub object_id: String,
} }
#[derive(Debug, serde::Deserialize)]
pub struct PublishInfo {
pub namespace: String,
pub doc_name: String,
pub view_id: uuid::Uuid,
}

View File

@ -132,6 +132,10 @@ pub fn workspace_scope() -> Scope {
web::resource("/published/{publish_namespace}/{doc_name}/blob") web::resource("/published/{publish_namespace}/{doc_name}/blob")
.route(web::get().to(get_published_collab_blob_handler)) .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( .service(
web::resource("/{workspace_id}/publish-namespace") web::resource("/{workspace_id}/publish-namespace")
.route(web::put().to(put_publish_namespace_handler)) .route(web::put().to(put_publish_namespace_handler))
@ -988,6 +992,16 @@ async fn get_published_collab_blob_handler(
Ok(collab_data) Ok(collab_data)
} }
async fn get_published_collab_info_handler(
view_id: web::Path<Uuid>,
state: Data<AppState>,
) -> Result<Json<AppResponse<PublishInfo>>> {
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( async fn put_publish_collab_handler(
path_param: web::Path<(Uuid, Uuid, String)>, path_param: web::Path<(Uuid, Uuid, String)>,
user_uuid: UserUuid, user_uuid: UserUuid,

View File

@ -1,4 +1,6 @@
use std::collections::HashMap; use std::collections::HashMap;
use database_entity::dto::PublishInfo;
use std::ops::DerefMut; use std::ops::DerefMut;
use std::sync::Arc; use std::sync::Arc;
@ -21,9 +23,9 @@ use database::workspace::{
get_invitation_by_id, insert_or_replace_publish_collab_meta, get_invitation_by_id, insert_or_replace_publish_collab_meta,
insert_or_replace_published_collab_blob, insert_user_workspace, insert_workspace_invitation, insert_or_replace_published_collab_blob, insert_user_workspace, insert_workspace_invitation,
rename_workspace, select_all_user_workspaces, select_publish_collab_meta, 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_published_collab_blob, select_published_collab_info, select_user_is_collab_publisher,
select_workspace, select_workspace_invitations_for_user, select_workspace_member, select_user_is_workspace_owner, select_workspace, select_workspace_invitations_for_user,
select_workspace_member_list, select_workspace_publish_namespace, select_workspace_member, select_workspace_member_list, select_workspace_publish_namespace,
select_workspace_publish_namespace_exists, select_workspace_settings, select_workspace_publish_namespace_exists, select_workspace_settings,
select_workspace_total_collab_bytes, update_updated_at_of_workspace, select_workspace_total_collab_bytes, update_updated_at_of_workspace,
update_workspace_invitation_set_status_accepted, update_workspace_publish_namespace, 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 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<PublishInfo, AppError> {
select_published_collab_info(pg_pool, view_id).await
}
pub async fn delete_published_workspace_collab( pub async fn delete_published_workspace_collab(
pg_pool: &PgPool, pg_pool: &PgPool,
workspace_id: &Uuid, workspace_id: &Uuid,

View File

@ -86,7 +86,7 @@ async fn test_publish_doc() {
.unwrap(); .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 guest_client = localhost_client();
let published_collab = guest_client let published_collab = guest_client
.get_published_collab::<Metadata>(&my_namespace, my_doc_name) .get_published_collab::<Metadata>(&my_namespace, my_doc_name)
@ -94,6 +94,14 @@ async fn test_publish_doc() {
.unwrap(); .unwrap();
assert_eq!(published_collab.title, "my_title"); 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 let collab_data = guest_client
.get_published_collab_blob(&my_namespace, my_doc_name) .get_published_collab_blob(&my_namespace, my_doc_name)
.await .await