fix: update publish namespace

This commit is contained in:
Zack Fu Zi Xiang 2024-11-04 17:22:47 +08:00
parent 8d8c895703
commit d69a2dce1b
No known key found for this signature in database
21 changed files with 217 additions and 147 deletions

View file

@ -1,22 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT publish_namespace\n FROM af_workspace\n WHERE workspace_id = $1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "publish_namespace",
"type_info": "Text"
}
],
"parameters": {
"Left": [
"Uuid"
]
},
"nullable": [
false
]
},
"hash": "0d4b11e74a5a9835c82a2ea8f87499d6cdd570979d0c3e001fa40e140a64fedf"
}

View file

@ -0,0 +1,34 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT workspace_id, namespace, is_original\n FROM af_workspace_namespace\n WHERE workspace_id = $1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "workspace_id",
"type_info": "Uuid"
},
{
"ordinal": 1,
"name": "namespace",
"type_info": "Text"
},
{
"ordinal": 2,
"name": "is_original",
"type_info": "Bool"
}
],
"parameters": {
"Left": [
"Uuid"
]
},
"nullable": [
false,
false,
false
]
},
"hash": "12c52797d87c0ec56ffe6d8baf24501a276fdac4453399190dc221de89b611f8"
}

View file

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n af.uuid\n FROM af_published_collab apc\n JOIN af_user af ON af.uid = apc.published_by\n WHERE view_id = $1\n ",
"query": "\n SELECT af.uuid\n FROM af_published_collab apc\n JOIN af_user af ON af.uid = apc.published_by\n WHERE view_id = $1\n ",
"describe": {
"columns": [
{
@ -18,5 +18,5 @@
false
]
},
"hash": "e9e22adc5a6f6daf354dc122cadab41b7cc13e0d956b3204d22f26a47ad594e3"
"hash": "1ae2809504bb6ea7dabcb5b5acfed09b0dd2e382e9fec3430680192df63876b8"
}

View file

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT default_published_view_id\n FROM af_workspace\n WHERE publish_namespace = $1\n ",
"query": "\n SELECT default_published_view_id\n FROM af_workspace\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace_namespace WHERE namespace = $1)\n ",
"describe": {
"columns": [
{
@ -18,5 +18,5 @@
true
]
},
"hash": "ff0397184dd291eed259ca8518a5c1541d0971f95e51b859dd0ce02702eacd66"
"hash": "2167ca10f5c560d8d4121d57d425c84482fa1dd52ee6f2cc7934e7d356b0dee6"
}

View file

@ -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 publish_name = $2\n ",
"query": "\n SELECT metadata\n FROM af_published_collab\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace_namespace WHERE namespace = $1)\n AND publish_name = $2\n ",
"describe": {
"columns": [
{
@ -19,5 +19,5 @@
false
]
},
"hash": "4d0c77eaabb72b06b3f0809ee3722d932b47bf18222628a22089b6fbd3891ec4"
"hash": "30091f1518275d01227ece8988ea4d99aae2891322994ab462908c520b782411"
}

View file

@ -1,46 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n aw.publish_namespace AS namespace,\n apc.publish_name,\n apc.view_id,\n au.email AS publisher_email,\n apc.created_at AS publish_timestamp\n FROM af_published_collab apc\n JOIN af_user au ON apc.published_by = au.uid\n JOIN af_workspace aw ON apc.workspace_id = aw.workspace_id\n WHERE apc.workspace_id = $1;\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "namespace",
"type_info": "Text"
},
{
"ordinal": 1,
"name": "publish_name",
"type_info": "Text"
},
{
"ordinal": 2,
"name": "view_id",
"type_info": "Uuid"
},
{
"ordinal": 3,
"name": "publisher_email",
"type_info": "Text"
},
{
"ordinal": 4,
"name": "publish_timestamp",
"type_info": "Timestamptz"
}
],
"parameters": {
"Left": [
"Uuid"
]
},
"nullable": [
false,
false,
false,
false,
false
]
},
"hash": "3ab817803745c1dc20eef819d944b8cdf56df3cd31b3ed8bc15e51eacace8e04"
}

View file

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n aw.publish_namespace AS namespace,\n apc.publish_name,\n apc.view_id,\n au.email AS publisher_email,\n apc.created_at AS publish_timestamp\n FROM af_published_collab apc\n JOIN af_user au ON apc.published_by = au.uid\n JOIN af_workspace aw ON apc.workspace_id = aw.workspace_id\n WHERE apc.view_id = ANY($1);\n ",
"query": "\n SELECT\n awn.namespace,\n apc.publish_name,\n apc.view_id,\n au.email AS publisher_email,\n apc.created_at AS publish_timestamp\n FROM af_published_collab apc\n JOIN af_user au ON apc.published_by = au.uid\n JOIN af_workspace aw ON apc.workspace_id = aw.workspace_id\n JOIN af_workspace_namespace awn ON aw.workspace_id = awn.workspace_id AND awn.is_original = TRUE\n WHERE apc.view_id = ANY($1);\n ",
"describe": {
"columns": [
{
@ -42,5 +42,5 @@
false
]
},
"hash": "e2ab2c5d0328f2a0900dfbd9080c0d867526bca0afee9aa4af294fbbebf3db0a"
"hash": "55dec46e9fb30d6236013a207d2016c3aaa966cac58e1a24148ea1a954e4a544"
}

View file

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT workspace_id, view_id\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 ",
"query": "\n SELECT workspace_id, view_id\n FROM af_published_collab\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace_namespace WHERE namespace = $1)\n AND publish_name = $2\n ",
"describe": {
"columns": [
{
@ -25,5 +25,5 @@
false
]
},
"hash": "d205df7e6a71335bc457f560fa5a941c738cd1f8e7c3369b0b24bb34fbb1c6eb"
"hash": "59b2a7854bb8f0d7ee34b9dfa4e3db5cac8e25fdebe186ba2cbd65012eb91f5f"
}

View file

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT EXISTS(\n SELECT 1\n FROM af_workspace\n WHERE publish_namespace = $1\n )\n ",
"query": "\n SELECT EXISTS(\n SELECT 1\n FROM af_workspace_namespace\n WHERE namespace = $1\n )\n ",
"describe": {
"columns": [
{
@ -18,5 +18,5 @@
null
]
},
"hash": "e4567475b82642745a7a96ec273efe7b549beedbf7e17b5b18d459334c29aa82"
"hash": "620167841bb2acdd1c9c6aadf8245e3a483d87dc006d4e361e994ce2c5d768cd"
}

View file

@ -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 publish_name = $2\n ",
"query": "\n SELECT blob\n FROM af_published_collab\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace_namespace WHERE namespace = $1)\n AND publish_name = $2\n ",
"describe": {
"columns": [
{
@ -19,5 +19,5 @@
false
]
},
"hash": "8f5b50a17db6599da536d50de5c77b22d3be3160638285563e32d4dc2b787916"
"hash": "8957cc00ca63bcc4d29c394a7a16f94965ee0d6bee3a4ef482d1f905f9e66b66"
}

View file

@ -1,23 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT EXISTS(\n SELECT 1\n FROM af_workspace\n WHERE workspace_id = $1\n AND publish_namespace = $2\n )\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "exists",
"type_info": "Bool"
}
],
"parameters": {
"Left": [
"Uuid",
"Text"
]
},
"nullable": [
null
]
},
"hash": "8d21739be9b0cb62878aaad1bc901b6a8677dbe9100918673b0482a86650dfff"
}

View file

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n aw.publish_namespace AS namespace,\n apc.publish_name,\n apc.view_id,\n au.email AS publisher_email,\n apc.created_at AS publish_timestamp\n FROM af_published_collab apc\n JOIN af_user au ON apc.published_by = au.uid\n JOIN af_workspace aw ON apc.workspace_id = aw.workspace_id\n WHERE apc.view_id = $1;\n ",
"query": "\n SELECT\n awn.namespace,\n apc.publish_name,\n apc.view_id,\n au.email AS publisher_email,\n apc.created_at AS publish_timestamp\n FROM af_published_collab apc\n JOIN af_user au ON apc.published_by = au.uid\n JOIN af_workspace aw ON apc.workspace_id = aw.workspace_id\n JOIN af_workspace_namespace awn ON aw.workspace_id = awn.workspace_id AND awn.is_original = TRUE\n WHERE apc.workspace_id = $1;\n ",
"describe": {
"columns": [
{
@ -42,5 +42,5 @@
false
]
},
"hash": "b2724ac4427c488c23e645c1aaf3c1e9b23e8042abb3ad4e255533dda39f6309"
"hash": "b450decddb39bd057d850efce1a8680e00a16c0d8887e94f008a2764a7a4a6f6"
}

View file

@ -0,0 +1,35 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT workspace_id, namespace, is_original\n FROM af_workspace_namespace\n WHERE workspace_id = $1\n AND namespace = $2\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "workspace_id",
"type_info": "Uuid"
},
{
"ordinal": 1,
"name": "namespace",
"type_info": "Text"
},
{
"ordinal": 2,
"name": "is_original",
"type_info": "Bool"
}
],
"parameters": {
"Left": [
"Uuid",
"Text"
]
},
"nullable": [
false,
false,
false
]
},
"hash": "bf9bff5c65ba051329ed2b694eff62808f971a8262b6e1649d91526ab3a3870d"
}

View file

@ -0,0 +1,16 @@
{
"db_name": "PostgreSQL",
"query": "\n UPDATE af_workspace_namespace\n SET namespace = $1\n WHERE workspace_id = $2\n AND namespace = $3\n AND is_original = FALSE\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text",
"Uuid",
"Text"
]
},
"nullable": []
},
"hash": "c43d414f6fcaed34e059f55abaaa0bd1343cacf4d04e98481a4787a4b965ce94"
}

View file

@ -1,15 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "\n UPDATE af_workspace\n SET publish_namespace = $1\n WHERE workspace_id = $2\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text",
"Uuid"
]
},
"nullable": []
},
"hash": "e6d81a899998593cec0395f9c29c3bcdbff61ff15762381d2ceed3f7375b7ea9"
}

View file

@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO af_workspace_namespace\n VALUES ($1, $2, FALSE)\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text",
"Uuid"
]
},
"nullable": []
},
"hash": "ea239353f73904400915ec89640ac71985a8d5b39037f567a3e2ac1c5eea8f64"
}

View file

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT workspace_id\n FROM af_workspace\n WHERE publish_namespace = $1\n ",
"query": "\n SELECT workspace_id\n FROM af_workspace_namespace\n WHERE namespace = $1\n ",
"describe": {
"columns": [
{
@ -18,5 +18,5 @@
false
]
},
"hash": "785c4c1e9b393a1f04a88136211df0c5daa7ad0c52f3e7e071156595262ca44f"
"hash": "eb142b33bd6d0d9f3ceb597be9251eac710a463d1052ba10c41b207dbf63efe1"
}

View file

@ -0,0 +1,22 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT namespace\n FROM af_workspace_namespace\n WHERE workspace_id = (SELECT workspace_id FROM af_workspace_namespace WHERE namespace = $1)\n AND is_original = FALSE\n ORDER BY created_at ASC\n LIMIT 1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "namespace",
"type_info": "Text"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false
]
},
"hash": "f3e9184f6ebb4df77159031701474847dcfa914ceae602c6554ed93162783ee8"
}

View file

@ -54,11 +54,35 @@ pub async fn select_workspace_publish_namespace_exists<'a, E: Executor<'a, Datab
}
#[inline]
pub async fn update_non_orginal_workspace_publish_namespace<
'a,
E: Executor<'a, Database = Postgres>,
>(
executor: E,
pub async fn insert_non_orginal_workspace_publish_namespace(
pg_pool: &PgPool,
workspace_id: &Uuid,
new_namespace: &str,
) -> Result<(), AppError> {
let res = sqlx::query!(
r#"
INSERT INTO af_workspace_namespace
VALUES ($1, $2, FALSE)
"#,
new_namespace,
workspace_id,
)
.execute(pg_pool)
.await?;
if res.rows_affected() != 1 {
tracing::error!(
"Failed to insert workspace publish namespace, workspace_id: {}, new_namespace: {}, rows_affected: {}",
workspace_id, new_namespace, res.rows_affected()
);
}
Ok(())
}
#[inline]
pub async fn update_non_orginal_workspace_publish_namespace(
pg_pool: &PgPool,
workspace_id: &Uuid,
old_namespace: &str,
new_namespace: &str,
@ -75,7 +99,7 @@ pub async fn update_non_orginal_workspace_publish_namespace<
workspace_id,
old_namespace,
)
.execute(executor)
.execute(pg_pool)
.await?;
if res.rows_affected() != 1 {
@ -147,8 +171,8 @@ pub async fn update_workspace_default_publish_view_set_null<
}
#[inline]
pub async fn select_workspace_publish_namespaces<'a, E: Executor<'a, Database = Postgres>>(
executor: E,
pub async fn select_workspace_publish_namespaces(
pg_pool: &PgPool,
workspace_id: &Uuid,
) -> Result<Vec<WorkspaceNamespace>, AppError> {
let res = sqlx::query_as!(
@ -160,7 +184,30 @@ pub async fn select_workspace_publish_namespaces<'a, E: Executor<'a, Database =
"#,
workspace_id,
)
.fetch_all(executor)
.fetch_all(pg_pool)
.await?;
Ok(res)
}
#[inline]
pub async fn select_workspace_publish_namespace(
pg_pool: &PgPool,
workspace_id: &Uuid,
namespace: &str,
) -> Result<WorkspaceNamespace, AppError> {
let res = sqlx::query_as!(
WorkspaceNamespace,
r#"
SELECT workspace_id, namespace, is_original
FROM af_workspace_namespace
WHERE workspace_id = $1
AND namespace = $2
"#,
workspace_id,
namespace,
)
.fetch_one(pg_pool)
.await?;
Ok(res)

View file

@ -7,11 +7,11 @@ ALTER TABLE af_workspace DROP CONSTRAINT af_workspace_publish_namespace_key;
-- Table to store user defined namespace for workspace
CREATE TABLE IF NOT EXISTS af_workspace_namespace (
namespace TEXT NOT NULL PRIMARY KEY,
workspace_id UUID NOT NULL,
default_view_id UUID,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
namespace TEXT NOT NULL PRIMARY KEY,
workspace_id UUID NOT NULL,
is_original BOOLEAN NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (workspace_id) REFERENCES af_workspace (workspace_id) ON DELETE CASCADE
);

View file

@ -2,8 +2,9 @@ use appflowy_collaborate::collab::storage::CollabAccessControlStorage;
use database::{
collab::GetCollabOrigin,
publish::{
select_all_published_collab_info, select_default_published_view_id,
select_default_published_view_id_for_namespace, select_workspace_publish_namespaces,
insert_non_orginal_workspace_publish_namespace, select_all_published_collab_info,
select_default_published_view_id, select_default_published_view_id_for_namespace,
select_workspace_publish_namespace, select_workspace_publish_namespaces,
update_published_collabs, update_workspace_default_publish_view,
update_workspace_default_publish_view_set_null,
},
@ -97,13 +98,19 @@ pub async fn set_workspace_namespace(
"publish namespace is already taken".to_string(),
));
};
update_non_orginal_workspace_publish_namespace(
pg_pool,
workspace_id,
old_namespace,
new_namespace,
)
.await?;
let ws_namespace =
select_workspace_publish_namespace(pg_pool, workspace_id, old_namespace).await?;
if ws_namespace.is_original {
insert_non_orginal_workspace_publish_namespace(pg_pool, workspace_id, new_namespace).await?;
} else {
update_non_orginal_workspace_publish_namespace(
pg_pool,
workspace_id,
old_namespace,
new_namespace,
)
.await?;
}
Ok(())
}