xatci/src/handlers.rs

93 lines
2.7 KiB
Rust

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<Pool>) -> Result<HttpResponse, Error> {
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<Pool>) -> Result<Vec<User>, diesel::result::Error> {
let conn = pool.get().unwrap();
let items = users.load::<User>(&conn)?;
Ok(items)
}
// Handler for GET /users/{id}
pub async fn get_user_by_id(
db: web::Data<Pool>,
user_id: web::Path<i32>,
) -> Result<HttpResponse, Error> {
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<Pool>,
item: web::Json<InputUser>,
) -> Result<HttpResponse, Error> {
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<Pool>,
user_id: web::Path<i32>,
) -> Result<HttpResponse, Error> {
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<Pool>, user_id: i32) -> Result<User, diesel::result::Error> {
let conn = pool.get().unwrap();
users.find(user_id).get_result::<User>(&conn)
}
fn add_single_user(
db: web::Data<Pool>,
item: web::Json<InputUser>,
) -> Result<User, diesel::result::Error> {
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<Pool>, user_id: i32) -> Result<usize, diesel::result::Error> {
let conn = db.get().unwrap();
let count = delete(users.find(user_id)).execute(&conn)?;
Ok(count)
}