Skip to content

Commit d7031bb

Browse files
committed
feat: add authentication to snack routes
1 parent 3e195e4 commit d7031bb

File tree

1 file changed

+53
-15
lines changed

1 file changed

+53
-15
lines changed

src/routes/snack.rs

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::auth::user::AuthenticatedUser;
22
use crate::db;
33
use crate::models::snack::{CreateSnackRequest, Snack};
44
use crate::schema::snacks::dsl::snacks;
5+
use crate::schema::snacks::user_id;
56
use diesel::prelude::*;
67
use rocket::http::Status;
78
use rocket::serde::json::Json;
@@ -33,27 +34,52 @@ pub fn create_snack(snack_data: Json<CreateSnackRequest>, user: AuthenticatedUse
3334
}
3435

3536
#[get("/snacks")]
36-
pub fn list_snacks() -> Result<Json<Vec<Snack>>, Status> {
37+
pub fn list_snacks(user: AuthenticatedUser) -> Result<Json<Vec<Snack>>, Status> {
3738
let mut conn = db::establish_connection();
3839

39-
snacks
40-
.limit(10)
41-
.select(Snack::as_select())
42-
.load(&mut conn)
40+
let results = if user.0.role == "admin" {
41+
snacks
42+
.limit(100)
43+
.select(Snack::as_select())
44+
.load(&mut conn)
45+
} else {
46+
snacks
47+
.filter(user_id.eq(user.0.id))
48+
.limit(100)
49+
.select(Snack::as_select())
50+
.load(&mut conn)
51+
};
52+
53+
results
4354
.map(Json)
4455
.map_err(|err| {
4556
println!("Database error: {:?}", err);
4657
Status::InternalServerError
4758
})
4859
}
49-
5060
#[patch("/snack/<snack_id>", data = "<snack_data>")]
5161
pub fn update_snack(
5262
snack_id: i32,
5363
snack_data: Json<UpdateSnack>,
64+
user: AuthenticatedUser,
5465
) -> Result<Json<Snack>, Status> {
5566
let mut conn = db::establish_connection();
5667

68+
let snack = snacks
69+
.find(snack_id)
70+
.first::<Snack>(&mut conn)
71+
.map_err(|err| {
72+
println!("Database error: {:?}", err);
73+
match err {
74+
diesel::result::Error::NotFound => Status::NotFound,
75+
_ => Status::InternalServerError
76+
}
77+
})?;
78+
79+
if snack.user_id != user.0.id && user.0.role != "admin" {
80+
return Err(Status::Forbidden);
81+
}
82+
5783
diesel::update(snacks.find(snack_id))
5884
.set(&snack_data.into_inner())
5985
.get_result(&mut conn)
@@ -66,21 +92,33 @@ pub fn update_snack(
6692
}
6793
})
6894
}
95+
6996
#[delete("/snack/<snack_id>")]
70-
pub fn delete_snack(snack_id: i32) -> Status {
97+
pub fn delete_snack(snack_id: i32, user: AuthenticatedUser) -> Status {
7198
let mut conn = db::establish_connection();
7299

73-
match diesel::delete(snacks.find(snack_id)).execute(&mut conn) {
74-
Ok(count) => {
75-
if count > 0 {
76-
Status::NoContent
77-
} else {
78-
Status::NotFound
100+
match snacks
101+
.find(snack_id)
102+
.first::<Snack>(&mut conn) {
103+
Ok(snack) => {
104+
if snack.user_id != user.0.id && user.0.role != "admin" {
105+
return Status::Forbidden;
106+
}
107+
108+
match diesel::delete(snacks.find(snack_id)).execute(&mut conn) {
109+
Ok(_) => Status::NoContent,
110+
Err(err) => {
111+
println!("Database error: {:?}", err);
112+
Status::InternalServerError
113+
}
79114
}
80115
}
81116
Err(err) => {
82117
println!("Database error: {:?}", err);
83-
Status::InternalServerError
118+
match err {
119+
diesel::result::Error::NotFound => Status::NotFound,
120+
_ => Status::InternalServerError
121+
}
84122
}
85123
}
86-
}
124+
}

0 commit comments

Comments
 (0)