use actix_web::{delete, Error, get, HttpResponse, post, put, Result, web::{Data, Json, Path, Query}}; use create_rust_app::Database; use crate::models::todos::{CreateTodo, Todo, UpdateTodo}; #[tsync::tsync] #[derive(serde::Deserialize)] pub struct PaginationParams { pub page: i64, pub page_size: i64, } #[get("")] async fn index( db: Data, Query(info): Query, ) -> HttpResponse { let mut con = db.get_connection().unwrap(); let result = Todo::paginate(&mut con, info.page, info.page_size); if result.is_ok() { HttpResponse::Ok().json(result.unwrap()) } else { HttpResponse::InternalServerError().finish() } } #[get("/{id}")] async fn read( db: Data, item_id: Path, ) -> HttpResponse { let mut con = db.get_connection().unwrap(); let result = Todo::read(&mut con, item_id.into_inner()); if result.is_ok() { let todo = result.unwrap(); HttpResponse::Ok().json(todo) } else { HttpResponse::NotFound().finish() } } #[post("")] async fn create( db: Data, Json(item): Json, ) -> Result { let mut con = db.get_connection().unwrap(); let result = Todo::create(&mut con, &item).expect("Creation error"); Ok(HttpResponse::Created().json(result)) } #[put("/{id}")] async fn update( db: Data, item_id: Path, Json(item): Json, ) -> HttpResponse { let mut con = db.get_connection().unwrap(); let result = Todo::update(&mut con, item_id.into_inner(), &item); if result.is_ok() { HttpResponse::Ok().finish() } else { HttpResponse::InternalServerError().finish() } } #[delete("/{id}")] async fn destroy( db: Data, item_id: Path, ) -> HttpResponse { let mut con = db.get_connection().unwrap(); let result = Todo::delete(&mut con, item_id.into_inner()); if result.is_ok() { HttpResponse::Ok().finish() } else { HttpResponse::InternalServerError().finish() } } pub fn endpoints(scope: actix_web::Scope) -> actix_web::Scope { return scope .service(index) .service(read) .service(create) .service(update) .service(destroy); }