@@ -20,12 +20,11 @@ use diesel::QueryDsl;
2020use rocket:: data:: Limits ;
2121use rocket:: form:: Form ;
2222use rocket:: fs:: NamedFile ;
23+ use rocket:: fs:: TempFile ;
2324use rocket:: futures:: TryFutureExt ;
2425
2526use rocket:: serde:: json:: Json ;
26- use rocket:: Data ;
2727use rocket:: { http:: ContentType , State } ;
28- use rocket_multipart_form_data:: * ;
2928use serde:: Deserialize ;
3029use serde:: Serialize ;
3130
@@ -89,52 +88,32 @@ async fn save_image(
8988 Ok ( ( ) )
9089}
9190
91+
92+ #[ derive( FromForm ) ]
93+ pub struct AddImageForm < ' a > {
94+ refers_to_id : i64 ,
95+ image : TempFile < ' a > ,
96+ }
97+
9298#[ post( "/image/add" , data = "<data>" ) ]
9399pub ( crate ) async fn add_image (
94- content_type : & ContentType ,
95- data : Data < ' _ > ,
100+ data : Form < AddImageForm < ' _ > > ,
96101 user : Result < User < Authenticated > , InsignoError > ,
97102 connection : Db ,
98103 config : & State < InsignoConfig > ,
99- limits : & Limits ,
100104) -> Result < ( ) , InsignoError > {
101105 let user = user?;
102- // parse multipart data
103- let mut options = MultipartFormDataOptions :: with_multipart_form_data_fields ( vec ! [
104- MultipartFormDataField :: file( "image" )
105- . size_limit( limits. get( "data-form" ) . unwrap( ) . as_u64( ) )
106- . content_type_by_string( Some ( mime:: IMAGE_STAR ) )
107- . map_err( |e| InsignoError :: new( 500 ) . debug( e) ) ?,
108- MultipartFormDataField :: text( "refers_to_id" ) ,
109- ] ) ;
110- options. max_data_bytes = limits. get ( "data-form" ) . unwrap ( ) . as_u64 ( ) ;
111- let multipart_form_data = MultipartFormData :: parse ( content_type, data, options)
112- . await
113- . map_err ( |e| InsignoError :: new ( 500 ) . debug ( e) ) ?;
114106
115107 // cast data to normal values
116- let photo_path = multipart_form_data
117- . files
118- . get ( "image" )
119- . ok_or ( InsignoError :: new ( 500 ) . debug ( "image field not found" ) ) ? //str_to_debug("image field not found"))?
120- . first ( )
121- . ok_or ( InsignoError :: new ( 500 ) . debug ( "err" ) ) ?; //str_to_debug("err"))?; //at drop it cleans the file
122-
123- let id = multipart_form_data
124- . texts
125- . get ( "refers_to_id" )
126- . ok_or ( InsignoError :: new ( 500 ) . debug ( "image field not found" ) ) ?[ 0 ]
127- . text
128- . parse :: < i64 > ( )
129- . map_err ( |e| InsignoError :: new ( 500 ) . debug ( e) ) ?;
130-
108+ let photo_path = data. image . path ( ) . ok_or_else ( || InsignoError :: new ( 500 ) . debug ( "Image did not have a path" ) ) ?;
109+ let marker_id = data. refers_to_id ;
131110 let user_id = user. get_id ( ) ;
132111
133112 // check if user own the marker
134113 connection
135114 . run ( move |conn| {
136115 markers:: table
137- . filter ( markers:: id. eq ( id ) )
116+ . filter ( markers:: id. eq ( marker_id ) )
138117 . filter ( markers:: created_by. eq ( user_id) )
139118 . or_filter ( markers:: solved_by. eq ( user_id) )
140119 . get_result :: < Marker > ( conn)
@@ -144,7 +123,7 @@ pub(crate) async fn add_image(
144123
145124 //generate unique name and convert
146125 let new_pos = unique_path ( Path :: new ( & config. media_folder ) , Path :: new ( "jpg" ) ) ;
147- convert_image ( & photo_path. path , & new_pos) ?;
126+ convert_image ( photo_path, & new_pos) ?;
148127
149128 let name = new_pos
150129 . strip_prefix ( & config. media_folder )
@@ -154,7 +133,7 @@ pub(crate) async fn add_image(
154133 . to_string ( ) ;
155134
156135 // try to save it in database
157- save_image ( connection, name. clone ( ) , id , & user)
136+ save_image ( connection, name. clone ( ) , marker_id , & user)
158137 . map_err ( |x| {
159138 let _ = fs:: remove_file ( new_pos) ; //sync version
160139 x
0 commit comments