From c08bc659b98ee42b736cb138f057ca87ef94d0d7 Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Mon, 5 May 2025 06:40:03 +0800 Subject: [PATCH] BLOG-43 feat: post info usecase --- .vscode/settings.json | 5 + backend/Cargo.lock | 368 +++++++++++++++++- backend/Cargo.toml | 7 + backend/feature/post/Cargo.toml | 3 + backend/feature/post/src/adapter.rs | 2 + .../feature/post/src/adapter/controller.rs | 3 + .../adapter/controller/label_response_dto.rs | 21 + .../src/adapter/controller/post_controller.rs | 42 ++ .../controller/post_info_response_dto.rs | 32 ++ backend/feature/post/src/adapter/gateway.rs | 2 + .../src/adapter/gateway/post_db_service.rs | 8 + .../adapter/gateway/post_repository_impl.rs | 29 ++ backend/feature/post/src/application.rs | 3 + backend/feature/post/src/application/error.rs | 1 + .../post/src/application/error/post_error.rs | 1 + .../feature/post/src/application/gateway.rs | 1 + .../application/gateway/post_repository.rs | 8 + .../feature/post/src/application/use_case.rs | 1 + .../use_case/get_all_post_info_use_case.rs | 30 ++ backend/feature/post/src/domain.rs | 1 + backend/feature/post/src/domain/entity.rs | 3 + .../feature/post/src/domain/entity/label.rs | 5 + .../feature/post/src/domain/entity/post.rs | 7 + .../post/src/domain/entity/post_info.rs | 12 + backend/feature/post/src/framework.rs | 2 + backend/feature/post/src/framework/db.rs | 1 + .../src/framework/db/post_db_service_impl.rs | 31 ++ backend/feature/post/src/framework/web.rs | 1 + .../post/src/framework/web/post_web_routes.rs | 18 + backend/feature/post/src/lib.rs | 4 + backend/server/Cargo.toml | 3 + backend/server/src/controllers.rs | 25 ++ backend/server/src/lib.rs | 1 + backend/server/src/main.rs | 29 +- 34 files changed, 705 insertions(+), 5 deletions(-) create mode 100644 backend/feature/post/src/adapter.rs create mode 100644 backend/feature/post/src/adapter/controller.rs create mode 100644 backend/feature/post/src/adapter/controller/label_response_dto.rs create mode 100644 backend/feature/post/src/adapter/controller/post_controller.rs create mode 100644 backend/feature/post/src/adapter/controller/post_info_response_dto.rs create mode 100644 backend/feature/post/src/adapter/gateway.rs create mode 100644 backend/feature/post/src/adapter/gateway/post_db_service.rs create mode 100644 backend/feature/post/src/adapter/gateway/post_repository_impl.rs create mode 100644 backend/feature/post/src/application.rs create mode 100644 backend/feature/post/src/application/error.rs create mode 100644 backend/feature/post/src/application/error/post_error.rs create mode 100644 backend/feature/post/src/application/gateway.rs create mode 100644 backend/feature/post/src/application/gateway/post_repository.rs create mode 100644 backend/feature/post/src/application/use_case.rs create mode 100644 backend/feature/post/src/application/use_case/get_all_post_info_use_case.rs create mode 100644 backend/feature/post/src/domain.rs create mode 100644 backend/feature/post/src/domain/entity.rs create mode 100644 backend/feature/post/src/domain/entity/label.rs create mode 100644 backend/feature/post/src/domain/entity/post.rs create mode 100644 backend/feature/post/src/domain/entity/post_info.rs create mode 100644 backend/feature/post/src/framework.rs create mode 100644 backend/feature/post/src/framework/db.rs create mode 100644 backend/feature/post/src/framework/db/post_db_service_impl.rs create mode 100644 backend/feature/post/src/framework/web.rs create mode 100644 backend/feature/post/src/framework/web/post_web_routes.rs create mode 100644 backend/server/src/controllers.rs create mode 100644 backend/server/src/lib.rs diff --git a/.vscode/settings.json b/.vscode/settings.json index 93b6c3c..d86acab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,11 @@ { "cSpell.words": [ "actix", + "chrono", + "serde", "squidspirit" + ], + "java.project.sourcePaths": [ + "backend/feature/post/src" ] } \ No newline at end of file diff --git a/backend/Cargo.lock b/backend/Cargo.lock index e05c8e1..70d840c 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -224,6 +224,82 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -287,6 +363,12 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + [[package]] name = "bytes" version = "1.10.1" @@ -319,6 +401,26 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + [[package]] name = "cookie" version = "0.16.2" @@ -330,6 +432,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -418,6 +526,29 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -561,6 +692,30 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "1.5.0" @@ -716,12 +871,42 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jiff" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07d8d955d798e7a4d6f9c58cd1f1916e790b42b092758a9ef6e16fef9f1b3fd" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f244cfe006d98d26f859c7abd1318d85327e1882dc9cef80f62daeeb0adcf300" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "jobserver" version = "0.1.33" @@ -732,6 +917,16 @@ dependencies = [ "libc", ] +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "language-tags" version = "0.3.2" @@ -813,7 +1008,7 @@ dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -822,6 +1017,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -884,11 +1088,29 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + [[package]] name = "post" version = "0.1.1" dependencies = [ "actix-web", + "async-trait", + "chrono", + "serde", ] [[package]] @@ -1009,6 +1231,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + [[package]] name = "ryu" version = "1.0.20" @@ -1070,6 +1298,8 @@ name = "server" version = "0.1.1" dependencies = [ "actix-web", + "env_logger", + "post", ] [[package]] @@ -1120,7 +1350,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1206,7 +1436,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "socket2", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1295,6 +1525,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "version_check" version = "0.9.5" @@ -1316,6 +1552,123 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -1325,6 +1678,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 6fca592..9109657 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -8,3 +8,10 @@ edition = "2024" [workspace.dependencies] actix-web = "4.10.2" +async-trait = "0.1.88" +chrono = "0.4.41" +env_logger = "0.11.8" +serde = { version = "1.0.219", features = ["derive"] } + +server.path = "server" +post.path = "feature/post" diff --git a/backend/feature/post/Cargo.toml b/backend/feature/post/Cargo.toml index 6f5acee..5107a14 100644 --- a/backend/feature/post/Cargo.toml +++ b/backend/feature/post/Cargo.toml @@ -5,3 +5,6 @@ edition.workspace = true [dependencies] actix-web.workspace = true +async-trait.workspace = true +chrono.workspace = true +serde.workspace = true diff --git a/backend/feature/post/src/adapter.rs b/backend/feature/post/src/adapter.rs new file mode 100644 index 0000000..3dc4028 --- /dev/null +++ b/backend/feature/post/src/adapter.rs @@ -0,0 +1,2 @@ +pub mod controller; +pub mod gateway; diff --git a/backend/feature/post/src/adapter/controller.rs b/backend/feature/post/src/adapter/controller.rs new file mode 100644 index 0000000..a8f9aca --- /dev/null +++ b/backend/feature/post/src/adapter/controller.rs @@ -0,0 +1,3 @@ +pub mod label_response_dto; +pub mod post_controller; +pub mod post_info_response_dto; diff --git a/backend/feature/post/src/adapter/controller/label_response_dto.rs b/backend/feature/post/src/adapter/controller/label_response_dto.rs new file mode 100644 index 0000000..1c552d1 --- /dev/null +++ b/backend/feature/post/src/adapter/controller/label_response_dto.rs @@ -0,0 +1,21 @@ +use serde::Serialize; + +use crate::domain::entity::label::Label; + +#[derive(Serialize)] +pub struct LabelResponseDto { + pub id: u32, + pub name: String, + pub color: String, +} + +impl From