use poem::{ error::{InternalServerError, NotFound}, get, handler, http::StatusCode, web::{Data, Json, Path, Query}, IntoResponse, Result, Route, }; 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, } #[handler] async fn index( db: Data<&Database>, Query(pagination): Query, ) -> Result { let mut con = db.get_connection().unwrap(); let result = Todo::paginate(&mut con, pagination.page, pagination.page_size) .map(|items| Json(items)) .map_err(InternalServerError)?; Ok(result) } #[handler] async fn read(db: Data<&Database>, Path(item_id): Path) -> Result { let mut con = db.get_connection().unwrap(); let result = Todo::read(&mut con, item_id) .map(|item| Json(item)) .map_err(NotFound)?; Ok(result) } #[handler] async fn create( db: Data<&Database>, Json(item): Json, ) -> Result { let mut con = db.get_connection().unwrap(); let result = Todo::create(&mut con, &item) .map(|item| Json(item)) .map_err(InternalServerError)?; Ok(result) } #[handler] async fn update( db: Data<&Database>, Path(item_id): Path, Json(item): Json, ) -> Result { let mut con = db.get_connection().unwrap(); let result = Todo::update(&mut con, item_id, &item) .map(|item| Json(item)) .map_err(InternalServerError)?; Ok(result) } #[handler] async fn destroy(db: Data<&Database>, Path(item_id): Path) -> Result { let mut con = db.get_connection().unwrap(); let result = Todo::delete(&mut con, item_id) .map(|amount| { if amount > 0 { StatusCode::OK } else { StatusCode::NOT_FOUND } }) .map_err(InternalServerError)?; Ok(result) } pub fn api() -> Route { Route::new() .at("/", get(index).post(create)) .at("/:id", get(read).put(update).delete(destroy)) }