3 Commits
Author | SHA1 | Message | Date | |
---|---|---|---|---|
71528294ae |
BLOG-105 Implement CRUD functionality for Labels (#107)
All checks were successful
Frontend CI / build (push) Successful in 1m8s
### Description This PR introduces full CRUD (Create, Read, Update) functionality for post labels, implemented by following the existing Clean Architecture. #### Backend * **New API Endpoints for Label Management:** * `POST /label`: Create a new label (**authentication required**). * `PUT /label/{id}`: Update a label by its ID (**authentication required**). * `GET /label`: Get all labels. * **Architectural Implementation:** * **Delivery Layer**: Added `CreateLabelRequestDto`, `UpdateLabelRequestDto`, and updated `PostController` with methods to handle label-related operations. * **Application Layer**: Created corresponding use cases (`CreateLabelUseCase`, `UpdateLabelUseCase`, `GetAllLabelsUseCase`) to handle business logic. * **Gateway/Framework Layer**: Implemented `LabelRepository` and `LabelDbService` to manage database interactions, including creating, updating, and querying labels. * **Route Adjustment:** * The route for fetching all post info has been changed from `GET /post/all` to `GET /post` to be more RESTful. #### Frontend * **API Call Update:** * To match the backend route change, the API path for fetching all posts is updated from `/post/all` to `/post`. ### Package Changes _No response_ ### Screenshots _No response_ ### Reference Resolves #105 ### Checklist - [x] A milestone is set - [x] The related issuse has been linked to this branch Reviewed-on: #107 Co-authored-by: SquidSpirit <squid@squidspirit.com> Co-committed-by: SquidSpirit <squid@squidspirit.com> |
|||
e255e076dc |
BLOG-103 Add API documentation with Utoipa (#106)
All checks were successful
Frontend CI / build (push) Successful in 1m8s
### Description This PR integrates the **`utoipa`** and **`utoipa-redoc`** crates to automatically generate OpenAPI-compliant API documentation for the backend project. #### Overview To improve development efficiency and API maintainability, this change introduces `utoipa` to automate the API documentation process. By adding specific attribute macros to the source code, we can generate detailed API specifications directly and serve them through an interactive UI provided by `utoipa-redoc`. #### Key Changes * **Dependencies Added** * Added `utoipa`, `utoipa-gen`, and `utoipa-redoc` to `Cargo.toml`. * `utoipa` is used to define OpenAPI objects. * `utoipa-redoc` is used to serve the ReDoc documentation UI. * **Code Refactoring** * **HTTP handler logic** in each feature (`auth`, `image`, `post`) has been extracted from the `..._web_routes.rs` files into their own dedicated files (e.g., `get_post_by_id_handler.rs`). This makes the code structure cleaner and simplifies adding documentation attributes to each handler. * Renamed the `PostController` method from `get_full_post` to `get_post_by_id` for a more RESTful-compliant naming convention. * **API Doc Annotation** * Added `#[derive(ToSchema)]` or `#[derive(IntoParams)]` to all DTOs (Data Transfer Objects) so they can be recognized by `utoipa` to generate the corresponding schemas. * Added the `#[utoipa::path]` macro to all HTTP handler functions, describing the API's path, HTTP method, tags, summary, expected responses, and security settings. * **Doc Aggregation & Serving** * Added an `..._api_doc.rs` file in each feature module to aggregate all API paths within that module. * Added a new `api_doc.rs` file in the `server` crate to merge the OpenAPI documents from all features, set global information (like title, version, and the OAuth2 security scheme), and serve the documentation page on the `/redoc` route using `Redoc::with_url`. ### Package Changes ```toml utoipa = { version = "5.4.0", features = ["actix_extras"] } utoipa-redoc = { version = "6.0.0", features = ["actix-web"] } ``` ### Screenshots  ### Reference Resolves #103 ### Checklist - [x] A milestone is set - [x] The related issuse has been linked to this branch Reviewed-on: #106 Co-authored-by: SquidSpirit <squid@squidspirit.com> Co-committed-by: SquidSpirit <squid@squidspirit.com> |
|||
c39a800b6b |
BLOG-43 Post related api endpoints (#55)
All checks were successful
Frontend CI / build (push) Successful in 2m18s
### Description - `GET` `/post_info` Get all the info of the posts. - `200` Without any post ```json [] ``` - `200` With posts ```json [ { "description": "This is the first post.", "id": 1, "labels": [ { "color": "#FF666666", "id": 2, "name": "Rust" } ], "preview_image_url": "https://squidspirit.com/icon/logo-light.svg", "published_time": null, "title": "The First Post" } ] ``` - `GET` `/post/{id}` Get the full post content with the given `id` - `200` With result ```json { "content": "Hello! I'm Squid!!", "id": 1, "info": { "description": "This is the first post.", "id": 1, "labels": [ { "color": "#FF666666", "id": 2, "name": "Rust" } ], "preview_image_url": "https://squidspirit.com/icon/logo-light.svg", "published_time": null, "title": "The First Post" } } ``` - `404` There is no post with the `id` ### Package Changes ```toml [workspace.package] version = "0.1.1" edition = "2024" [workspace.dependencies] actix-web = "4.10.2" async-trait = "0.1.88" chrono = "0.4.41" dotenv = "0.15.0" env_logger = "0.11.8" futures = "0.3.31" log = "0.4.27" serde = { version = "1.0.219", features = ["derive"] } sqlx = { version = "0.8.5", features = [ "chrono", "macros", "postgres", "runtime-tokio-rustls", ] } tokio = { version = "1.45.0", features = ["full"] } ``` ### Screenshots _No response_ ### Reference Resolves #43 ### Checklist - [x] A milestone is set - [x] The related issuse has been linked to this branch Reviewed-on: #55 Reviewed-by: zoe <zoe@noreply.localhost> Co-authored-by: SquidSpirit <squid@squidspirit.com> Co-committed-by: SquidSpirit <squid@squidspirit.com> |