use crate::todo::{Todo, TodoRequest}; use actix_web::{delete, get, post, put, web, HttpResponse, Responder}; use sqlx::PgPool; #[get("/todos")] async fn find_all(db_pool: web::Data) -> impl Responder { let result = Todo::find_all(db_pool.get_ref()).await; match result { Ok(todos) => HttpResponse::Ok().json(todos), _ => HttpResponse::BadRequest().body("Error trying to read all todos from database") } } #[get("/todo/{id}")] async fn find(id: web::Path, db_pool: web::Data) -> impl Responder { let result = Todo::find_by_id(id.into_inner(), db_pool.get_ref()).await; match result { Ok(todo) => HttpResponse::Ok().json(todo), _ => HttpResponse::BadRequest().body("Todo not found") } } #[post("/todo")] async fn create(todo: web::Json, db_pool: web::Data) -> impl Responder { let result = Todo::create(todo.into_inner(), db_pool.get_ref()).await; match result { Ok(todo) => HttpResponse::Ok().json(todo), _ => HttpResponse::BadRequest().body("Error trying to create new todo") } } #[put("/todo/{id}")] async fn update(id: web::Path, todo: web::Json, db_pool: web::Data) -> impl Responder { let result = Todo::update(id.into_inner(), todo.into_inner(),db_pool.get_ref()).await; match result { Ok(todo) => HttpResponse::Ok().json(todo), _ => HttpResponse::BadRequest().body("Todo not found") } } #[delete("/todo/{id}")] async fn delete(id: web::Path, db_pool: web::Data) -> impl Responder { let result = Todo::delete(id.into_inner(), db_pool.get_ref()).await; match result { Ok(rows) => { if rows > 0 { HttpResponse::Ok().body(format!("Successfully deleted {} record(s)", rows)) } else { HttpResponse::BadRequest().body("Todo not found") } }, _ => HttpResponse::BadRequest().body("Todo not found") } } // function that will be called on new Application to configure routes for this module pub fn init(cfg: &mut web::ServiceConfig) { cfg.service(find_all); cfg.service(find); cfg.service(create); cfg.service(update); cfg.service(delete); }