@@ -5,7 +5,8 @@ use serde::Deserialize;
55use sqlx:: { types:: ipnetwork:: IpNetwork , Acquire } ;
66
77use crate :: {
8- extractors:: auth:: Auth , types:: {
8+ extractors:: auth:: Auth ,
9+ types:: {
910 api:: { ApiError , ApiResponse } ,
1011 mod_json:: { split_version_and_compare, ModJson } ,
1112 models:: {
@@ -16,7 +17,9 @@ use crate::{
1617 mod_version:: { self , ModVersion } ,
1718 mod_version_status:: ModVersionStatusEnum ,
1819 } ,
19- } , webhook:: send_webhook, AppData
20+ } ,
21+ webhook:: send_webhook,
22+ AppData ,
2023} ;
2124
2225#[ derive( Deserialize ) ]
@@ -92,9 +95,8 @@ pub async fn get_version_index(
9295 let mut pool = data. db . acquire ( ) . await . or ( Err ( ApiError :: DbAcquireError ) ) ?;
9396
9497 let has_extended_permissions = match auth. developer ( ) {
95- Ok ( dev) => dev. admin ||
96- Developer :: has_access_to_mod ( dev. id , & path. id , & mut pool) . await ?,
97- _ => false
98+ Ok ( dev) => dev. admin || Developer :: has_access_to_mod ( dev. id , & path. id , & mut pool) . await ?,
99+ _ => false ,
98100 } ;
99101
100102 let mut result = ModVersion :: get_index (
@@ -130,9 +132,8 @@ pub async fn get_one(
130132 let mut pool = data. db . acquire ( ) . await . or ( Err ( ApiError :: DbAcquireError ) ) ?;
131133
132134 let has_extended_permissions = match auth. developer ( ) {
133- Ok ( dev) => dev. admin ||
134- Developer :: has_access_to_mod ( dev. id , & path. id , & mut pool) . await ?,
135- _ => false
135+ Ok ( dev) => dev. admin || Developer :: has_access_to_mod ( dev. id , & path. id , & mut pool) . await ?,
136+ _ => false ,
136137 } ;
137138
138139 let mut version = {
@@ -202,16 +203,18 @@ pub async fn download_version(
202203 } ;
203204 let net: IpNetwork = ip. parse ( ) . or ( Err ( ApiError :: InternalError ) ) ?;
204205
205- if let Ok ( ( downloaded_version, downloaded_mod) ) = download :: create_download (
206- net, mod_version. id , & mod_version. mod_id , & mut pool
207- ) . await {
206+ if let Ok ( ( downloaded_version, downloaded_mod) ) =
207+ download :: create_download ( net, mod_version. id , & mod_version. mod_id , & mut pool) . await
208+ {
208209 let name = mod_version. mod_id . clone ( ) ;
209210 let version = mod_version. version . clone ( ) ;
210211
211212 // only accepted mods can have their download counts incremented
212213 // we'll just fix this once they're updated anyways
213214
214- if ( downloaded_version || downloaded_mod) && mod_version. status == ModVersionStatusEnum :: Accepted {
215+ if ( downloaded_version || downloaded_mod)
216+ && mod_version. status == ModVersionStatusEnum :: Accepted
217+ {
215218 tokio:: spawn ( async move {
216219 if downloaded_version {
217220 // we must nest more
@@ -264,45 +267,53 @@ pub async fn create_version(
264267 }
265268
266269 // remove invalid characters from link - they break the location header on download
267- let download_link: String = payload. download_link . chars ( )
268- . filter ( |c| c. is_ascii ( ) && * c != '\0' ) . collect ( ) ;
270+ let download_link: String = payload
271+ . download_link
272+ . chars ( )
273+ . filter ( |c| c. is_ascii ( ) && * c != '\0' )
274+ . collect ( ) ;
269275
270276 let mut file_path = download_geode_file ( & download_link) . await ?;
271- let json = ModJson :: from_zip ( & mut file_path, & download_link, dev. verified )
272- . map_err ( |err| {
273- log:: error!( "Failed to parse mod.json: {}" , err) ;
274- ApiError :: FilesystemError
275- } ) ?;
277+ let json = ModJson :: from_zip ( & mut file_path, & download_link, dev. verified ) . map_err ( |err| {
278+ log:: error!( "Failed to parse mod.json: {}" , err) ;
279+ ApiError :: FilesystemError
280+ } ) ?;
276281 if json. id != path. id {
277282 return Err ( ApiError :: BadRequest ( format ! (
278283 "Request id {} does not match mod.json id {}" ,
279284 path. id, json. id
280285 ) ) ) ;
281286 }
282287
288+ json. validate ( ) ?;
289+ let mut transaction = pool. begin ( ) . await . or ( Err ( ApiError :: TransactionError ) ) ?;
290+ if let Err ( e) = Mod :: new_version ( & json, & dev, & mut transaction) . await {
291+ transaction
292+ . rollback ( )
293+ . await
294+ . or ( Err ( ApiError :: TransactionError ) ) ?;
295+ return Err ( e) ;
296+ }
297+
283298 if dev. verified {
284299 send_webhook (
285300 json. id . clone ( ) ,
286301 json. name . clone ( ) ,
287302 json. version . clone ( ) ,
288303 true ,
289- Developer { id : dev. id , username : dev. username . clone ( ) , display_name : dev. display_name . clone ( ) , is_owner : true } ,
304+ Developer {
305+ id : dev. id ,
306+ username : dev. username . clone ( ) ,
307+ display_name : dev. display_name . clone ( ) ,
308+ is_owner : true ,
309+ } ,
290310 dev. clone ( ) ,
291311 data. webhook_url . clone ( ) ,
292- data. app_url . clone ( )
312+ data. app_url . clone ( ) ,
293313 )
294314 . await ;
295315 }
296316
297- json. validate ( ) ?;
298- let mut transaction = pool. begin ( ) . await . or ( Err ( ApiError :: TransactionError ) ) ?;
299- if let Err ( e) = Mod :: new_version ( & json, dev, & mut transaction) . await {
300- transaction
301- . rollback ( )
302- . await
303- . or ( Err ( ApiError :: TransactionError ) ) ?;
304- return Err ( e) ;
305- }
306317 transaction
307318 . commit ( )
308319 . await
@@ -327,8 +338,9 @@ pub async fn update_version(
327338 path. version . as_str ( ) ,
328339 false ,
329340 false ,
330- & mut pool
331- ) . await ?;
341+ & mut pool,
342+ )
343+ . await ?;
332344 let approved_count = ModVersion :: get_accepted_count ( version. mod_id . as_str ( ) , & mut pool) . await ?;
333345 let mut transaction = pool. begin ( ) . await . or ( Err ( ApiError :: TransactionError ) ) ?;
334346 let id = match sqlx:: query!(
@@ -368,7 +380,7 @@ pub async fn update_version(
368380 . commit ( )
369381 . await
370382 . or ( Err ( ApiError :: TransactionError ) ) ?;
371-
383+
372384 if payload. status == ModVersionStatusEnum :: Accepted {
373385 let is_update = approved_count > 0 ;
374386
@@ -385,8 +397,9 @@ pub async fn update_version(
385397 owner. as_ref ( ) . unwrap ( ) . clone ( ) ,
386398 dev. clone ( ) ,
387399 data. webhook_url . clone ( ) ,
388- data. app_url . clone ( )
389- ) . await ;
400+ data. app_url . clone ( ) ,
401+ )
402+ . await ;
390403 }
391404
392405 Ok ( HttpResponse :: NoContent ( ) )
0 commit comments