From 67e5016829787c2398dcb1ceea6b6dca192ac27c Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 16 Nov 2020 19:45:42 +0530 Subject: add product table --- Cargo.lock | 57 ++++++++++++++++++++++ Cargo.toml | 5 +- .../down.sql | 3 ++ .../2020-11-16-133516_create_products_table/up.sql | 8 +++ src/handlers/product.rs | 45 +++++++++++++++++ 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 migrations/2020-11-16-133516_create_products_table/down.sql create mode 100644 migrations/2020-11-16-133516_create_products_table/up.sql create mode 100644 src/handlers/product.rs diff --git a/Cargo.lock b/Cargo.lock index 3dcd7dd..2c30823 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -460,6 +460,28 @@ dependencies = [ "getrandom", ] +[[package]] +name = "bigdecimal" +version = "0.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "679e21a6734fdfc63378aea80c2bf31e6ac8ced21ed33e1ee37f8f7bf33c2056" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "bigdecimal" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1374191e2dd25f9ae02e3aa95041ed5d747fc77b3c102b49fe2dd9a8117a6244" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "bitflags" version = "1.2.1" @@ -643,9 +665,13 @@ version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2de9deab977a153492a1468d1b1c0662c1cf39e5ea87d0c060ecd59ef18d8c" dependencies = [ + "bigdecimal 0.1.2", "byteorder", "diesel_derives", "mysqlclient-sys", + "num-bigint", + "num-integer", + "num-traits", "r2d2", "url 1.7.2", ] @@ -764,6 +790,7 @@ dependencies = [ "actix-identity", "actix-web", "bcrypt", + "bigdecimal 0.0.14", "diesel", "log", "pretty_env_logger", @@ -1227,6 +1254,36 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.13.0" diff --git a/Cargo.toml b/Cargo.toml index b7f1012..81cb4de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,9 +16,10 @@ log = "0.4" pretty_env_logger = "0.4" actix-identity = "0.3.1" actix-cors = "0.4.0" +bigdecimal = "0.0.14" rand = "0.7" [dependencies.diesel] -version = "1.4" -features = ["mysql", "r2d2"] +version = "1.4.2" +features = ["mysql", "r2d2", "numeric"] default-features = false diff --git a/migrations/2020-11-16-133516_create_products_table/down.sql b/migrations/2020-11-16-133516_create_products_table/down.sql new file mode 100644 index 0000000..7d99a98 --- /dev/null +++ b/migrations/2020-11-16-133516_create_products_table/down.sql @@ -0,0 +1,3 @@ +-- This file should undo anything in `up.sql` + +DROP TABLE product; diff --git a/migrations/2020-11-16-133516_create_products_table/up.sql b/migrations/2020-11-16-133516_create_products_table/up.sql new file mode 100644 index 0000000..829c5be --- /dev/null +++ b/migrations/2020-11-16-133516_create_products_table/up.sql @@ -0,0 +1,8 @@ +-- Your SQL goes here +CREATE TABLE product ( + id INTEGER PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + kind VARCHAR(255), + price FLOAT NOT NULL, + description VARCHAR(255) +) diff --git a/src/handlers/product.rs b/src/handlers/product.rs new file mode 100644 index 0000000..e655e9d --- /dev/null +++ b/src/handlers/product.rs @@ -0,0 +1,45 @@ +use crate::models::{NewProduct, Product}; +use crate::schema::product::dsl::*; +use crate::TPool; + +use actix_identity::Identity; +use actix_web::{web, HttpResponse, Responder}; +use bcrypt::{hash, verify, DEFAULT_COST}; +use diesel::prelude::*; +use log::{error, info}; +use serde::Deserialize; + +pub async fn new_product( + pool: web::Data, + item: web::Json, +) -> impl Responder { + 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() + } + } +} -- cgit v1.2.3