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

View File

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

View File

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

View File

@ -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<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?;
AppResponse::<PublishInfo>::from_response(resp)

View File

@ -306,6 +306,13 @@ pub struct AFCollabMember {
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)]
#[repr(i32)]
pub enum AFRole {

View File

@ -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,

View File

@ -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<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)]
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")
.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<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(
path_param: web::Path<(Uuid, Uuid, String)>,
user_uuid: UserUuid,

View File

@ -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<PublishInfo, AppError> {
select_published_collab_info(pg_pool, view_id).await
}
pub async fn delete_published_workspace_collab(
pg_pool: &PgPool,
workspace_id: &Uuid,

View File

@ -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::<Metadata>(&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