Table of contents
Let's create the final module of this series, the handler. Create a folder handler under src and it was have... you guessed it ! 3 files:
todos.rs
use actix_web::{get, web, Error as ActixError, Responder, Result as ActixResult, Scope};
use crate::AppState;
#[get("/")]
async fn get_todos(state: web::Data<AppState>) -> ActixResult<impl Responder, ActixError> {
let todos = state.todo_repository.get_todos().await;
Ok(web::Json(todos))
}
pub fn todos_handler() -> Scope {
web::scope("/todos").service(get_todos)
}
We are importing stuff from actix to annotate types in the first line. We then have our API handler which is our get_todos function. Notice that it is annotated with #[get("/")] which denotes that this is a get method at path "/". Inside we use the state that we configured in main and call the get_todos method in todo_repository. We then return the response as a web::Json format. (Refer back to the sea-orm-cli command where we added the with-serde flag which makes the serialisation of rust structs to JSON automatically ๐ช)
At last we create a public function todos_handler which creates an Actix scope which is nothing but a collection of sub handlers or sub scopes under a prefix. This means that now our API will be available under localhost:8000/todos path. Don't run it yet because we now have to link the handler to the main.
prelude.rs
Nothing special
pub use super::todos::todos_handler;
mod.rs
Easy !
pub mod prelude;
mod todos;
The wait is over ๐
In main.rs, import the todos_handler at the top and inside the init function register as shown.
use handler::prelude::todos_handler;
// ALL CODE
pub fn init(cfg: &mut web::ServiceConfig) {
cfg.service(todos_handler());
}
Finally run cargo check once to make sure everything is good and run the below command
cargo run
If everything went according to plan, we would have the server up and running on the specified host and port in .env
DATABASE_URL=mysql://<username>:<password>@localhost/rust_todo_actix_seaorm
HOST=127.0.0.1
PORT=8000
Adding some test data
Run the below SQL command to add some data to your database.
insert into todos (todo_id,todo_name,todo_description) values (1,"test","test description");
insert into todos (todo_id,todo_name,todo_description) values (2,"test2","test description 2");
Visit localhost:8000/todos in your browser and see the data returned ๐ฅบ