From dbe84bc9f4304d4c0325aa9ac7882b06318308cc Mon Sep 17 00:00:00 2001 From: Lumither Tao Date: Thu, 25 Jul 2024 00:37:10 +0800 Subject: [PATCH] feat(blog) add `adj` (adjacent posts) to get_post --- backend/src/api/get/get_post.rs | 46 +++++++++++++++++++++++++++++++-- backend/src/model/blog/meta.sql | 40 ++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/backend/src/api/get/get_post.rs b/backend/src/api/get/get_post.rs index a9c9fec..a38eb89 100644 --- a/backend/src/api/get/get_post.rs +++ b/backend/src/api/get/get_post.rs @@ -102,11 +102,53 @@ WHERE post_id = $1; } }; - // todo: next, prev post + let adjacent = match query(r" +WITH target_post AS (SELECT t.date FROM meta t WHERE post_id = $1), + prev AS (SELECT post_id, t.title, t.sub_title, t.header_img + FROM meta t + WHERE t.date < (SELECT date FROM target_post) + ORDER BY t.date DESC + LIMIT 1), + next AS (SELECT post_id, t.title, t.sub_title, t.header_img + FROM meta t + WHERE t.date > (SELECT date FROM target_post) + ORDER BY t.date + LIMIT 1) +SELECT json_strip_nulls(json_build_object( + 'prev', + (SELECT json_build_object('id', post_id, 'title', title, 'sub_title', sub_title, 'header_img', header_img) + FROM prev), + 'next', + (SELECT json_build_object('id', post_id, 'title', title, 'sub_title', sub_title, 'header_img', header_img) + FROM next) + )) AS result; +" + ) + .bind(post_id) + .fetch_one(&db_connection) + .await + { + Ok(res) => {res.get::("result")} + Err(e) => { + error!( + "Database error on Reading `{}` from table `{}`: <{}>: {}", + "adjoint posts data", + "meta", + post_id.to_string(), + e.to_string() + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + Json::from(json!({"error": e.to_string()})), + )); + } + + }; let mut res = post.as_object().unwrap().to_owned(); res.insert("tags".to_string(), tags.into()); - res.insert("meta".to_string(), meta.into()); + res.insert("meta".to_string(), meta); + res.insert("adj".to_string(), adjacent); Ok(Json::from(json!(res))) } diff --git a/backend/src/model/blog/meta.sql b/backend/src/model/blog/meta.sql index ce8a376..6cf903a 100644 --- a/backend/src/model/blog/meta.sql +++ b/backend/src/model/blog/meta.sql @@ -8,20 +8,25 @@ DROP table meta; DO $$ DECLARE - _post_id UUID := 'd5a209d4-93b1-474e-8e4e-9c78d6e6e763'; -- test data - _meta_cols JSONB := '{"title": " title", "tags": "example tags", "new_col1": "new_value1", "new_col3": "new_value2"}'; -- test data + _post_id UUID := '{}'; + _meta_cols JSONB := '{}'; _exists BOOLEAN; _col_name TEXT; _col_value TEXT; _sql TEXT; - _insert_columns TEXT := 'post_id'; - _insert_values TEXT := quote_literal(_post_id); - _update_set TEXT := ''; + _insert_columns TEXT := 'post_id'; + _insert_values TEXT := quote_literal(_post_id); + _update_set TEXT := ''; + _blacklist TEXT[] := ARRAY ['id', 'tags']; BEGIN SELECT EXISTS(SELECT 1 FROM meta WHERE post_id = _post_id) INTO _exists; FOR _col_name, _col_value IN SELECT key, value FROM jsonb_each_text(_meta_cols) LOOP + IF _col_name = ANY (_blacklist) THEN + CONTINUE; + END IF; + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'meta' @@ -47,3 +52,28 @@ $$ END IF; END; $$ LANGUAGE plpgsql; + +SELECT jsonb_strip_nulls(to_jsonb(t)) AS meta +FROM meta t +WHERE post_id = '8ca3fa2b-f040-448c-8885-81aab56db9bb'; + +WITH target_post AS (SELECT t.date FROM meta t WHERE post_id = '8ca3fa2b-f040-448c-8885-81aab56db9bb'), + prev AS (SELECT post_id, t.title, t.sub_title, t.header_img + FROM meta t + WHERE t.date < (SELECT date FROM target_post) + ORDER BY t.date DESC + LIMIT 1), + next AS (SELECT post_id, t.title, t.sub_title, t.header_img + FROM meta t + WHERE t.date > (SELECT date FROM target_post) + ORDER BY t.date + LIMIT 1) +SELECT json_strip_nulls(json_build_object( + 'prev', + (SELECT json_build_object('id', post_id, 'title', title, 'sub_title', sub_title, 'header_img', header_img) + FROM prev), + 'next', + (SELECT json_build_object('id', post_id, 'title', title, 'sub_title', sub_title, 'header_img', header_img) + FROM next) + )) AS result; +