use super::models::{NewUser, User}; use super::schema::users::dsl::*; use super::Pool; use crate::diesel::QueryDsl; use crate::diesel::RunQueryDsl; use actix_web::{web, Error, HttpResponse, Responder}; use diesel::dsl::{delete, insert_into}; use serde::{Deserialize, Serialize}; use std::vec::Vec; #[derive(Debug, Serialize, Deserialize)] pub struct InputUser { pub first_name: String, pub last_name: String, pub email: String, } pub async fn get_users(db: web::Data) -> Result { Ok(web::block(move || get_all_users(db)) .await .map(|user| HttpResponse::Ok().json(user)) .map_err(|_| HttpResponse::InternalServerError())?) } fn get_all_users(pool: web::Data) -> Result, diesel::result::Error> { let conn = pool.get().unwrap(); let items = users.load::(&conn)?; Ok(items) } // Handler for GET /users/{id} pub async fn get_user_by_id( db: web::Data, user_id: web::Path, ) -> Result { Ok( web::block(move || db_get_user_by_id(db, user_id.into_inner())) .await .map(|user| HttpResponse::Ok().json(user)) .map_err(|_| HttpResponse::InternalServerError())?, ) } // Handler for POST /users pub async fn add_user( db: web::Data, item: web::Json, ) -> Result { Ok(web::block(move || add_single_user(db, item)) .await .map(|user| HttpResponse::Created().json(user)) .map_err(|_| HttpResponse::InternalServerError())?) } // Handler for DELETE /users/{id} pub async fn delete_user( db: web::Data, user_id: web::Path, ) -> Result { Ok( web::block(move || delete_single_user(db, user_id.into_inner())) .await .map(|user| HttpResponse::Ok().json(user)) .map_err(|_| HttpResponse::InternalServerError())?, ) } fn db_get_user_by_id(pool: web::Data, user_id: i32) -> Result { let conn = pool.get().unwrap(); users.find(user_id).get_result::(&conn) } fn add_single_user( db: web::Data, item: web::Json, ) -> Result { let conn = db.get().unwrap(); let new_user = NewUser { first_name: &item.first_name, last_name: &item.last_name, email: &item.email, created_at: chrono::Local::now().naive_local(), }; let res = insert_into(users).values(&new_user).get_result(&conn)?; Ok(res) } fn delete_single_user(db: web::Data, user_id: i32) -> Result { let conn = db.get().unwrap(); let count = delete(users.find(user_id)).execute(&conn)?; Ok(count) }