1
1
use crate :: auth:: ApiKey ;
2
2
use crate :: db;
3
3
use crate :: models:: snack:: { NewSnack , Snack } ;
4
- use crate :: schema:: snacks;
4
+ use crate :: schema:: snacks:: dsl :: { id , snacks } ;
5
5
use diesel:: prelude:: * ;
6
6
use rocket:: http:: Status ;
7
7
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
+ }
8
18
9
19
#[ post( "/snack" , data = "<snack_data>" ) ]
10
20
pub fn create_snack ( _api_key : ApiKey , snack_data : Json < NewSnack > ) -> Result < Json < Snack > , Status > {
11
21
let snack = snack_data. into_inner ( ) ;
12
22
13
23
let mut conn = db:: establish_connection ( ) ;
14
24
15
- diesel:: insert_into ( snacks:: table )
25
+ diesel:: insert_into ( snacks)
16
26
. values ( & snack)
17
27
. get_result ( & mut conn)
18
28
. map ( Json )
19
29
. map_err ( |err| {
20
30
println ! ( "Database error: {:?}" , err) ;
21
31
Status :: InternalServerError
22
32
} )
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