use crate::models::{NewProduct, Product}; use crate::schema::product::dsl::*; use crate::TPool; use actix_web::{web, HttpResponse, Responder}; use diesel::prelude::*; use log::{error, info}; use serde::Deserialize; pub async fn new_product( pool: web::Data, item: web::Json, ) -> impl Responder { info!("New product hit: {:?}", item.name); let conn = pool.get().unwrap(); diesel::insert_into(product) .values(item.into_inner()) .execute(&conn) .expect("Coundn't connect to DB"); HttpResponse::Ok().body("Inserted successfully!") } pub async fn product_details( pool: web::Data, product_id: web::Path, ) -> impl Responder { let conn = pool.get().unwrap(); let product_id = product_id.into_inner(); info!("Fetching product details for {}", product_id); let selected_product = product .filter(id.eq(&product_id)) .limit(1) .first::(&conn); match selected_product { Ok(m) => { info!("Found product: {}", product_id); HttpResponse::Ok().json(m) } Err(_) => { error!("Product not found: {}", product_id); HttpResponse::NotFound().finish() } } } #[derive(Deserialize)] pub struct UpdateProduct { name: String, kind: Option, price: f32, description: Option, } pub async fn update_product( pool: web::Data, product_id: web::Path, product_details: web::Json, ) -> impl Responder { let conn = pool.get().unwrap(); let product_id = product_id.into_inner(); let product_details = product_details.into_inner(); info!("Updating product: {:?}", product_id); match diesel::update(product.filter(id.eq(product_id))) .set(( name.eq(product_details.name), kind.eq(product_details.kind), price.eq(product_details.price), description.eq(product_details.description), )) .execute(&conn) { Ok(_) => { return HttpResponse::Ok().body("Changed product successfully") } _ => { return HttpResponse::InternalServerError() .body("Unable to update record") } } }