@@ -2,6 +2,7 @@ use crate::auth::user::AuthenticatedUser;
22use crate :: db;
33use crate :: models:: snack:: { CreateSnackRequest , Snack } ;
44use crate :: schema:: snacks:: dsl:: snacks;
5+ use crate :: schema:: snacks:: user_id;
56use diesel:: prelude:: * ;
67use rocket:: http:: Status ;
78use 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>" ) ]
5161pub 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