From 30ec8651bb563f8e2c31e9df554eebede1e00cff Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Sat, 2 Aug 2025 13:41:14 +0800 Subject: [PATCH] BLOG-104 feat: add order column to post_label and update related queries in PostDbServiceImpl --- ...e5ccef3c47c014cfcb65805cbf1c625fef1e7.json | 16 +++++++++ ...c623706f920fd6b1a9a1cd143ecee6c9d5019.json | 32 +++++++++++++++++ ...4cdbd9cc9605fe0f2c4dc4506827fa0fd2ad6.json | 16 +++++++++ ...9e8ed130a496b09dccbf89e919f4c9798e91a.json | 34 +++++++++++++++++++ ...de04a71dd98eef245780a6f34f0b72564f63e.json | 14 ++++++++ ...c4f040d559118d0b9f8b6f4dcd6e6fde5d381.json | 19 +++++++++++ ...59d4e3829b9b2a6a496c9a429a05fbdb2e30a.json | 26 ++++++++++++++ ...4ffd0df1393e1805ae1c37306b25c721de7e3.json | 23 +++++++++++++ .../src/framework/db/post_db_service_impl.rs | 18 +++++----- ...20250802053708_add_order_to_post_label.sql | 1 + 10 files changed, 191 insertions(+), 8 deletions(-) create mode 100644 backend/.sqlx/query-0c9effcc24f4319c47898e0ade4e5ccef3c47c014cfcb65805cbf1c625fef1e7.json create mode 100644 backend/.sqlx/query-38181c2e36077c546944fbfe124c623706f920fd6b1a9a1cd143ecee6c9d5019.json create mode 100644 backend/.sqlx/query-5189bdfd0aa6b4ac478cc48efde4cdbd9cc9605fe0f2c4dc4506827fa0fd2ad6.json create mode 100644 backend/.sqlx/query-a0e1ed95ce9d705653281455cc59e8ed130a496b09dccbf89e919f4c9798e91a.json create mode 100644 backend/.sqlx/query-b084aa65fa3cdb1abdd02fd9e2ade04a71dd98eef245780a6f34f0b72564f63e.json create mode 100644 backend/.sqlx/query-d0867ba2857fedcdc9a754d0394c4f040d559118d0b9f8b6f4dcd6e6fde5d381.json create mode 100644 backend/.sqlx/query-f0c2c0fe0a30790e88449da79c859d4e3829b9b2a6a496c9a429a05fbdb2e30a.json create mode 100644 backend/.sqlx/query-f4ef2b4e53389d2bf6a6299fc4e4ffd0df1393e1805ae1c37306b25c721de7e3.json create mode 100644 backend/migrations/20250802053708_add_order_to_post_label.sql diff --git a/backend/.sqlx/query-0c9effcc24f4319c47898e0ade4e5ccef3c47c014cfcb65805cbf1c625fef1e7.json b/backend/.sqlx/query-0c9effcc24f4319c47898e0ade4e5ccef3c47c014cfcb65805cbf1c625fef1e7.json new file mode 100644 index 0000000..a48ace7 --- /dev/null +++ b/backend/.sqlx/query-0c9effcc24f4319c47898e0ade4e5ccef3c47c014cfcb65805cbf1c625fef1e7.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO post_label (\n post_id, label_id, \"order\"\n ) VALUES ($1, $2, $3)\n ON CONFLICT DO NOTHING\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "0c9effcc24f4319c47898e0ade4e5ccef3c47c014cfcb65805cbf1c625fef1e7" +} diff --git a/backend/.sqlx/query-38181c2e36077c546944fbfe124c623706f920fd6b1a9a1cd143ecee6c9d5019.json b/backend/.sqlx/query-38181c2e36077c546944fbfe124c623706f920fd6b1a9a1cd143ecee6c9d5019.json new file mode 100644 index 0000000..fb39599 --- /dev/null +++ b/backend/.sqlx/query-38181c2e36077c546944fbfe124c623706f920fd6b1a9a1cd143ecee6c9d5019.json @@ -0,0 +1,32 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id, name, color\n FROM label\n WHERE deleted_time IS NULL\n ORDER BY id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "color", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "38181c2e36077c546944fbfe124c623706f920fd6b1a9a1cd143ecee6c9d5019" +} diff --git a/backend/.sqlx/query-5189bdfd0aa6b4ac478cc48efde4cdbd9cc9605fe0f2c4dc4506827fa0fd2ad6.json b/backend/.sqlx/query-5189bdfd0aa6b4ac478cc48efde4cdbd9cc9605fe0f2c4dc4506827fa0fd2ad6.json new file mode 100644 index 0000000..787a9f7 --- /dev/null +++ b/backend/.sqlx/query-5189bdfd0aa6b4ac478cc48efde4cdbd9cc9605fe0f2c4dc4506827fa0fd2ad6.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE label\n SET name = $1, color = $2\n WHERE id = $3 AND deleted_time IS NULL\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Int8", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "5189bdfd0aa6b4ac478cc48efde4cdbd9cc9605fe0f2c4dc4506827fa0fd2ad6" +} diff --git a/backend/.sqlx/query-a0e1ed95ce9d705653281455cc59e8ed130a496b09dccbf89e919f4c9798e91a.json b/backend/.sqlx/query-a0e1ed95ce9d705653281455cc59e8ed130a496b09dccbf89e919f4c9798e91a.json new file mode 100644 index 0000000..46c8896 --- /dev/null +++ b/backend/.sqlx/query-a0e1ed95ce9d705653281455cc59e8ed130a496b09dccbf89e919f4c9798e91a.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id, name, color\n FROM label\n WHERE id = $1 AND deleted_time IS NULL\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "color", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "a0e1ed95ce9d705653281455cc59e8ed130a496b09dccbf89e919f4c9798e91a" +} diff --git a/backend/.sqlx/query-b084aa65fa3cdb1abdd02fd9e2ade04a71dd98eef245780a6f34f0b72564f63e.json b/backend/.sqlx/query-b084aa65fa3cdb1abdd02fd9e2ade04a71dd98eef245780a6f34f0b72564f63e.json new file mode 100644 index 0000000..fd83c51 --- /dev/null +++ b/backend/.sqlx/query-b084aa65fa3cdb1abdd02fd9e2ade04a71dd98eef245780a6f34f0b72564f63e.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "\n DELETE FROM post_label\n WHERE post_id = $1\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "b084aa65fa3cdb1abdd02fd9e2ade04a71dd98eef245780a6f34f0b72564f63e" +} diff --git a/backend/.sqlx/query-d0867ba2857fedcdc9a754d0394c4f040d559118d0b9f8b6f4dcd6e6fde5d381.json b/backend/.sqlx/query-d0867ba2857fedcdc9a754d0394c4f040d559118d0b9f8b6f4dcd6e6fde5d381.json new file mode 100644 index 0000000..f194863 --- /dev/null +++ b/backend/.sqlx/query-d0867ba2857fedcdc9a754d0394c4f040d559118d0b9f8b6f4dcd6e6fde5d381.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE post\n SET \n title = $1, \n description = $2, \n preview_image_url = $3, \n content = $4, \n published_time = $5\n WHERE id = $6\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Text", + "Timestamp", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "d0867ba2857fedcdc9a754d0394c4f040d559118d0b9f8b6f4dcd6e6fde5d381" +} diff --git a/backend/.sqlx/query-f0c2c0fe0a30790e88449da79c859d4e3829b9b2a6a496c9a429a05fbdb2e30a.json b/backend/.sqlx/query-f0c2c0fe0a30790e88449da79c859d4e3829b9b2a6a496c9a429a05fbdb2e30a.json new file mode 100644 index 0000000..7d34ac9 --- /dev/null +++ b/backend/.sqlx/query-f0c2c0fe0a30790e88449da79c859d4e3829b9b2a6a496c9a429a05fbdb2e30a.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO post (\n title, description, preview_image_url, content, published_time\n ) VALUES ($1, $2, $3, $4, $5)\n RETURNING id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Text", + "Timestamp" + ] + }, + "nullable": [ + false + ] + }, + "hash": "f0c2c0fe0a30790e88449da79c859d4e3829b9b2a6a496c9a429a05fbdb2e30a" +} diff --git a/backend/.sqlx/query-f4ef2b4e53389d2bf6a6299fc4e4ffd0df1393e1805ae1c37306b25c721de7e3.json b/backend/.sqlx/query-f4ef2b4e53389d2bf6a6299fc4e4ffd0df1393e1805ae1c37306b25c721de7e3.json new file mode 100644 index 0000000..0a36d1d --- /dev/null +++ b/backend/.sqlx/query-f4ef2b4e53389d2bf6a6299fc4e4ffd0df1393e1805ae1c37306b25c721de7e3.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO label (name, color)\n VALUES ($1, $2)\n RETURNING id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Int8" + ] + }, + "nullable": [ + false + ] + }, + "hash": "f4ef2b4e53389d2bf6a6299fc4e4ffd0df1393e1805ae1c37306b25c721de7e3" +} diff --git a/backend/feature/post/src/framework/db/post_db_service_impl.rs b/backend/feature/post/src/framework/db/post_db_service_impl.rs index 9d31551..6fdcfba 100644 --- a/backend/feature/post/src/framework/db/post_db_service_impl.rs +++ b/backend/feature/post/src/framework/db/post_db_service_impl.rs @@ -58,7 +58,7 @@ impl PostDbService for PostDbServiceImpl { query_builder.push(r#" AND p.published_time IS NOT NULL"#); } - query_builder.push(r#" ORDER BY p.id"#); + query_builder.push(r#" ORDER BY p.id, pl."order""#); let records = query_builder .build_query_as::() @@ -130,7 +130,7 @@ impl PostDbService for PostDbServiceImpl { ); query_builder.push_bind(id); - query_builder.push(r#" ORDER BY p.id"#); + query_builder.push(r#" ORDER BY p.id, pl."order""#); let records = query_builder .build_query_as::() @@ -207,16 +207,17 @@ impl PostDbService for PostDbServiceImpl { .await .map_err(|err| PostError::DatabaseError(err.to_string()))?; - for label_id in label_ids { + for (order, &label_id) in label_ids.iter().enumerate() { sqlx::query!( r#" INSERT INTO post_label ( - post_id, label_id - ) VALUES ($1, $2) + post_id, label_id, "order" + ) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING "#, post_id, label_id, + order as i32, ) .execute(&mut *tx) .await @@ -275,16 +276,17 @@ impl PostDbService for PostDbServiceImpl { .await .map_err(|err| PostError::DatabaseError(err.to_string()))?; - for label_id in label_ids { + for (order, &label_id) in label_ids.iter().enumerate() { sqlx::query!( r#" INSERT INTO post_label ( - post_id, label_id - ) VALUES ($1, $2) + post_id, label_id, "order" + ) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING "#, post.id, label_id, + order as i32, ) .execute(&mut *tx) .await diff --git a/backend/migrations/20250802053708_add_order_to_post_label.sql b/backend/migrations/20250802053708_add_order_to_post_label.sql new file mode 100644 index 0000000..e7c16c6 --- /dev/null +++ b/backend/migrations/20250802053708_add_order_to_post_label.sql @@ -0,0 +1 @@ +ALTER TABLE post_label ADD COLUMN "order" INTEGER NOT NULL DEFAULT 0;