1
0
mirror of https://github.com/actix/examples synced 2025-03-28 22:08:38 +01:00
Rob Ede bfede4c1bb
improve sqlx example
inspired by #455
2021-10-07 03:00:13 +01:00

95 lines
2.9 KiB
Rust

use actix_web::{delete, get, post, put, web, HttpResponse, Responder};
use sqlx::SqlitePool;
use crate::todo::{Todo, TodoRequest};
// 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)
.service(find)
.service(create)
.service(update)
.service(delete);
}
#[get("/todos")]
async fn find_all(db_pool: web::Data<SqlitePool>) -> impl Responder {
let result = Todo::find_all(db_pool.get_ref()).await;
match result {
Ok(todos) => HttpResponse::Ok().json(todos),
Err(err) => {
error!("error fetching todos: {}", err);
HttpResponse::InternalServerError()
.body("Error trying to read all todos from database")
}
}
}
#[get("/todo/{id}")]
async fn find(id: web::Path<i32>, db_pool: web::Data<SqlitePool>) -> impl Responder {
let result = Todo::find_by_id(id.into_inner(), db_pool.get_ref()).await;
match result {
Ok(Some(todo)) => HttpResponse::Ok().json(todo),
Ok(None) => HttpResponse::NotFound().body("Todo not found"),
Err(err) => {
error!("error fetching todo: {}", err);
HttpResponse::InternalServerError()
.body("Error trying to read todo from database")
}
}
}
#[post("/todo")]
async fn create(
todo: web::Json<TodoRequest>,
db_pool: web::Data<SqlitePool>,
) -> impl Responder {
let result = Todo::create(todo.into_inner(), db_pool.get_ref()).await;
match result {
Ok(todo) => HttpResponse::Ok().json(todo),
Err(err) => {
error!("error creating todo: {}", err);
HttpResponse::InternalServerError().body("Error trying to create new todo")
}
}
}
#[put("/todo/{id}")]
async fn update(
id: web::Path<i32>,
todo: web::Json<TodoRequest>,
db_pool: web::Data<SqlitePool>,
) -> impl Responder {
let result = Todo::update(*id, todo.into_inner(), &db_pool).await;
match result {
Ok(Some(todo)) => HttpResponse::Ok().json(todo),
Ok(None) => HttpResponse::NotFound().body("Todo not found"),
Err(err) => {
error!("error updating todo: {}", err);
HttpResponse::InternalServerError().body("Error trying to update todo")
}
}
}
#[delete("/todo/{id}")]
async fn delete(id: web::Path<i32>, db_pool: web::Data<SqlitePool>) -> impl Responder {
let result = Todo::delete(*id, db_pool.get_ref()).await;
match result {
Ok(rows_deleted) => {
if rows_deleted > 0 {
let msg = format!("Successfully deleted {} record(s)", rows_deleted);
HttpResponse::Ok().body(msg)
} else {
HttpResponse::NotFound().body("Todo not found")
}
}
Err(err) => {
error!("error deleting todo: {}", err);
HttpResponse::InternalServerError().body("Todo not found")
}
}
}