Skip to content

Commit a7aeb90

Browse files
authored
Merge pull request #10 from QuantGeekDev/feature/update-snack
feat: add update snack
2 parents af3c085 + b745968 commit a7aeb90

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ mod catchers;
88
mod db;
99
mod schema;
1010

11+
use crate::routes::snack::{create_snack, list_snacks, update_snack};
1112
use dotenv::dotenv;
1213
use rocket::*;
13-
use routes::snack::create_snack;
1414

1515
#[get("/")]
1616
fn index() -> &'static str {
@@ -28,6 +28,6 @@ fn index() -> &'static str {
2828
fn rocket() -> _ {
2929
dotenv().ok();
3030

31-
rocket::build().mount("/", routes![index, create_snack]).register("/", catchers![catchers::unauthorized])
31+
rocket::build().mount("/", routes![index, create_snack, list_snacks, update_snack]).register("/", catchers![catchers::unauthorized, catchers::not_found])
3232
}
3333

src/routes/snack.rs

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,70 @@
11
use crate::auth::ApiKey;
22
use crate::db;
33
use crate::models::snack::{NewSnack, Snack};
4-
use crate::schema::snacks;
4+
use crate::schema::snacks::dsl::{id, snacks};
55
use diesel::prelude::*;
66
use rocket::http::Status;
77
use rocket::serde::json::Json;
8+
use serde::Deserialize;
9+
10+
#[derive(Deserialize, AsChangeset)]
11+
#[diesel(table_name = crate::schema::snacks)]
12+
pub struct UpdateSnack {
13+
pub name: Option<String>,
14+
pub category: Option<String>,
15+
pub price: Option<rust_decimal::Decimal>,
16+
pub image_url: Option<String>,
17+
}
818

919
#[post("/snack", data = "<snack_data>")]
1020
pub fn create_snack(_api_key: ApiKey, snack_data: Json<NewSnack>) -> Result<Json<Snack>, Status> {
1121
let snack = snack_data.into_inner();
1222

1323
let mut conn = db::establish_connection();
1424

15-
diesel::insert_into(snacks::table)
25+
diesel::insert_into(snacks)
1626
.values(&snack)
1727
.get_result(&mut conn)
1828
.map(Json)
1929
.map_err(|err| {
2030
println!("Database error: {:?}", err);
2131
Status::InternalServerError
2232
})
23-
}
33+
}
34+
35+
#[get("/snacks")]
36+
pub fn list_snacks(_api_key: ApiKey) -> Result<Json<Vec<Snack>>, Status> {
37+
let mut conn = db::establish_connection();
38+
39+
snacks
40+
.limit(10)
41+
.select(Snack::as_select())
42+
.load(&mut conn)
43+
.map(Json)
44+
.map_err(|err| {
45+
println!("Database error: {:?}", err);
46+
Status::InternalServerError
47+
})
48+
}
49+
50+
#[patch("/snack/<snack_id>", data = "<snack_data>")]
51+
pub fn update_snack(
52+
_api_key: ApiKey,
53+
snack_id: i32,
54+
snack_data: Json<UpdateSnack>,
55+
) -> Result<Json<Snack>, Status> {
56+
let mut conn = db::establish_connection();
57+
58+
diesel::update(snacks.find(snack_id))
59+
.set(&snack_data.into_inner())
60+
.get_result(&mut conn)
61+
.map(Json)
62+
.map_err(|err| {
63+
println!("Database error: {:?}", err);
64+
match err {
65+
diesel::result::Error::NotFound => Status::NotFound,
66+
_ => Status::InternalServerError
67+
}
68+
})
69+
}
70+

0 commit comments

Comments
 (0)