feat: delete publish collab
This commit is contained in:
parent
3d1a1e7c3e
commit
94bd62869c
|
|
@ -145,6 +145,32 @@ pub async fn select_user_is_workspace_owner(
|
||||||
Ok(exists.unwrap_or(false))
|
Ok(exists.unwrap_or(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn select_user_is_collab_publisher(
|
||||||
|
pg_pool: &PgPool,
|
||||||
|
user_uuid: &Uuid,
|
||||||
|
workspace_uuid: &Uuid,
|
||||||
|
doc_name: &str,
|
||||||
|
) -> Result<bool, AppError> {
|
||||||
|
let exists = sqlx::query_scalar!(
|
||||||
|
r#"
|
||||||
|
SELECT EXISTS(
|
||||||
|
SELECT 1
|
||||||
|
FROM af_published_collab
|
||||||
|
WHERE workspace_id = $1
|
||||||
|
AND doc_name = $2
|
||||||
|
AND published_by = (SELECT uid FROM af_user WHERE uuid = $3)
|
||||||
|
);
|
||||||
|
"#,
|
||||||
|
workspace_uuid,
|
||||||
|
doc_name,
|
||||||
|
user_uuid,
|
||||||
|
)
|
||||||
|
.fetch_one(pg_pool)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(exists.unwrap_or(false))
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub async fn select_user_role<'a, E: Executor<'a, Database = Postgres>>(
|
pub async fn select_user_role<'a, E: Executor<'a, Database = Postgres>>(
|
||||||
exectuor: E,
|
exectuor: E,
|
||||||
|
|
@ -851,3 +877,32 @@ pub async fn insert_or_replace_publish_collab_meta<'a, E: Executor<'a, Database
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub async fn delete_published_collab<'a, E: Executor<'a, Database = Postgres>>(
|
||||||
|
executor: E,
|
||||||
|
workspace_id: &Uuid,
|
||||||
|
doc_name: &str,
|
||||||
|
) -> Result<(), AppError> {
|
||||||
|
let res = sqlx::query!(
|
||||||
|
r#"
|
||||||
|
DELETE FROM af_published_collab
|
||||||
|
WHERE workspace_id = $1 AND doc_name = $2
|
||||||
|
"#,
|
||||||
|
workspace_id,
|
||||||
|
doc_name,
|
||||||
|
)
|
||||||
|
.execute(executor)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
if res.rows_affected() != 1 {
|
||||||
|
tracing::error!(
|
||||||
|
"Failed to delete published collab, workspace_id: {}, doc_name: {}, rows_affected: {}",
|
||||||
|
workspace_id,
|
||||||
|
doc_name,
|
||||||
|
res.rows_affected()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -132,10 +132,11 @@ pub fn workspace_scope() -> Scope {
|
||||||
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))
|
||||||
)
|
)
|
||||||
.service(
|
.service(
|
||||||
web::resource("/{workspace_id}/collab/{object_id}/publish")
|
web::resource("/{workspace_id}/collab/{object_id}/publish")
|
||||||
.route(web::post().to(post_publish_collab_handler))
|
.route(web::put().to(put_publish_collab_handler))
|
||||||
)
|
.route(web::delete().to(delete_publish_collab_handler))
|
||||||
|
)
|
||||||
.service(
|
.service(
|
||||||
web::resource("/{workspace_id}/collab/{object_id}/member/list")
|
web::resource("/{workspace_id}/collab/{object_id}/member/list")
|
||||||
.route(web::get().to(get_collab_member_list_handler)),
|
.route(web::get().to(get_collab_member_list_handler)),
|
||||||
|
|
@ -963,7 +964,7 @@ async fn put_publish_namespace_handler(
|
||||||
Ok(Json(AppResponse::Ok()))
|
Ok(Json(AppResponse::Ok()))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn post_publish_collab_handler(
|
async fn put_publish_collab_handler(
|
||||||
path_param: web::Path<(Uuid, String)>,
|
path_param: web::Path<(Uuid, String)>,
|
||||||
user_uuid: UserUuid,
|
user_uuid: UserUuid,
|
||||||
payload: String,
|
payload: String,
|
||||||
|
|
@ -982,6 +983,22 @@ async fn post_publish_collab_handler(
|
||||||
Ok(Json(AppResponse::Ok()))
|
Ok(Json(AppResponse::Ok()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn delete_publish_collab_handler(
|
||||||
|
path_param: web::Path<(Uuid, String)>,
|
||||||
|
user_uuid: UserUuid,
|
||||||
|
state: Data<AppState>,
|
||||||
|
) -> Result<Json<AppResponse<()>>> {
|
||||||
|
let (workspace_id, doc_name) = path_param.into_inner();
|
||||||
|
biz::workspace::ops::delete_published_workspace_collab(
|
||||||
|
&state.pg_pool,
|
||||||
|
&workspace_id,
|
||||||
|
&doc_name,
|
||||||
|
&user_uuid,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
Ok(Json(AppResponse::Ok()))
|
||||||
|
}
|
||||||
|
|
||||||
#[instrument(level = "debug", skip(state, payload), err)]
|
#[instrument(level = "debug", skip(state, payload), err)]
|
||||||
async fn get_collab_member_list_handler(
|
async fn get_collab_member_list_handler(
|
||||||
payload: Json<QueryCollabMembers>,
|
payload: Json<QueryCollabMembers>,
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,10 @@ use database::pg_row::{AFWorkspaceMemberRow, AFWorkspaceRow};
|
||||||
use database::resource_usage::get_all_workspace_blob_metadata;
|
use database::resource_usage::get_all_workspace_blob_metadata;
|
||||||
use database::user::select_uid_from_email;
|
use database::user::select_uid_from_email;
|
||||||
use database::workspace::{
|
use database::workspace::{
|
||||||
change_workspace_icon, delete_from_workspace, delete_workspace_members, get_invitation_by_id,
|
change_workspace_icon, delete_from_workspace, delete_published_collab, delete_workspace_members,
|
||||||
insert_or_replace_publish_collab_meta, insert_user_workspace, insert_workspace_invitation,
|
get_invitation_by_id, insert_or_replace_publish_collab_meta, insert_user_workspace,
|
||||||
rename_workspace, select_all_user_workspaces, select_user_is_workspace_owner, select_workspace,
|
insert_workspace_invitation, rename_workspace, select_all_user_workspaces,
|
||||||
|
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_invitations_for_user, select_workspace_member, select_workspace_member_list,
|
||||||
select_workspace_settings, select_workspace_total_collab_bytes, update_updated_at_of_workspace,
|
select_workspace_settings, 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,
|
||||||
|
|
@ -138,6 +139,27 @@ pub async fn publish_workspace_collab(
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn delete_published_workspace_collab(
|
||||||
|
pg_pool: &PgPool,
|
||||||
|
workspace_id: &Uuid,
|
||||||
|
doc_name: &str,
|
||||||
|
user_uuid: &Uuid,
|
||||||
|
) -> Result<(), AppError> {
|
||||||
|
let is_owner = select_user_is_workspace_owner(pg_pool, user_uuid, workspace_id).await?;
|
||||||
|
if !is_owner {
|
||||||
|
let is_publisher =
|
||||||
|
select_user_is_collab_publisher(pg_pool, user_uuid, workspace_id, doc_name).await?;
|
||||||
|
if !is_publisher {
|
||||||
|
return Err(AppError::UserUnAuthorized(
|
||||||
|
"User is not the owner of the workspace or the publisher of the document".to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_published_collab(pg_pool, workspace_id, doc_name).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn publish_workspace_collab_data(
|
pub async fn publish_workspace_collab_data(
|
||||||
_pg_pool: &PgPool,
|
_pg_pool: &PgPool,
|
||||||
_workspace_id: &Uuid,
|
_workspace_id: &Uuid,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue