@@ -2,6 +2,7 @@ use crate::auth::user::AuthenticatedUser;
2
2
use crate :: db;
3
3
use crate :: models:: snack:: { CreateSnackRequest , Snack } ;
4
4
use crate :: schema:: snacks:: dsl:: snacks;
5
+ use crate :: schema:: snacks:: user_id;
5
6
use diesel:: prelude:: * ;
6
7
use rocket:: http:: Status ;
7
8
use rocket:: serde:: json:: Json ;
@@ -33,27 +34,52 @@ pub fn create_snack(snack_data: Json<CreateSnackRequest>, user: AuthenticatedUse
33
34
}
34
35
35
36
#[ get( "/snacks" ) ]
36
- pub fn list_snacks ( ) -> Result < Json < Vec < Snack > > , Status > {
37
+ pub fn list_snacks ( user : AuthenticatedUser ) -> Result < Json < Vec < Snack > > , Status > {
37
38
let mut conn = db:: establish_connection ( ) ;
38
39
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
43
54
. map ( Json )
44
55
. map_err ( |err| {
45
56
println ! ( "Database error: {:?}" , err) ;
46
57
Status :: InternalServerError
47
58
} )
48
59
}
49
-
50
60
#[ patch( "/snack/<snack_id>" , data = "<snack_data>" ) ]
51
61
pub fn update_snack (
52
62
snack_id : i32 ,
53
63
snack_data : Json < UpdateSnack > ,
64
+ user : AuthenticatedUser ,
54
65
) -> Result < Json < Snack > , Status > {
55
66
let mut conn = db:: establish_connection ( ) ;
56
67
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
+
57
83
diesel:: update ( snacks. find ( snack_id) )
58
84
. set ( & snack_data. into_inner ( ) )
59
85
. get_result ( & mut conn)
@@ -66,21 +92,33 @@ pub fn update_snack(
66
92
}
67
93
} )
68
94
}
95
+
69
96
#[ delete( "/snack/<snack_id>" ) ]
70
- pub fn delete_snack ( snack_id : i32 ) -> Status {
97
+ pub fn delete_snack ( snack_id : i32 , user : AuthenticatedUser ) -> Status {
71
98
let mut conn = db:: establish_connection ( ) ;
72
99
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
+ }
79
114
}
80
115
}
81
116
Err ( err) => {
82
117
println ! ( "Database error: {:?}" , err) ;
83
- Status :: InternalServerError
118
+ match err {
119
+ diesel:: result:: Error :: NotFound => Status :: NotFound ,
120
+ _ => Status :: InternalServerError
121
+ }
84
122
}
85
123
}
86
- }
124
+ }
0 commit comments