@@ -5,7 +5,8 @@ use serde::Deserialize;
5
5
use sqlx:: { types:: ipnetwork:: IpNetwork , Acquire } ;
6
6
7
7
use crate :: {
8
- extractors:: auth:: Auth , types:: {
8
+ extractors:: auth:: Auth ,
9
+ types:: {
9
10
api:: { ApiError , ApiResponse } ,
10
11
mod_json:: { split_version_and_compare, ModJson } ,
11
12
models:: {
@@ -16,7 +17,9 @@ use crate::{
16
17
mod_version:: { self , ModVersion } ,
17
18
mod_version_status:: ModVersionStatusEnum ,
18
19
} ,
19
- } , webhook:: send_webhook, AppData
20
+ } ,
21
+ webhook:: send_webhook,
22
+ AppData ,
20
23
} ;
21
24
22
25
#[ derive( Deserialize ) ]
@@ -92,9 +95,8 @@ pub async fn get_version_index(
92
95
let mut pool = data. db . acquire ( ) . await . or ( Err ( ApiError :: DbAcquireError ) ) ?;
93
96
94
97
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 ,
98
100
} ;
99
101
100
102
let mut result = ModVersion :: get_index (
@@ -130,9 +132,8 @@ pub async fn get_one(
130
132
let mut pool = data. db . acquire ( ) . await . or ( Err ( ApiError :: DbAcquireError ) ) ?;
131
133
132
134
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 ,
136
137
} ;
137
138
138
139
let mut version = {
@@ -202,16 +203,18 @@ pub async fn download_version(
202
203
} ;
203
204
let net: IpNetwork = ip. parse ( ) . or ( Err ( ApiError :: InternalError ) ) ?;
204
205
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
+ {
208
209
let name = mod_version. mod_id . clone ( ) ;
209
210
let version = mod_version. version . clone ( ) ;
210
211
211
212
// only accepted mods can have their download counts incremented
212
213
// we'll just fix this once they're updated anyways
213
214
214
- if ( downloaded_version || downloaded_mod) && mod_version. status == ModVersionStatusEnum :: Accepted {
215
+ if ( downloaded_version || downloaded_mod)
216
+ && mod_version. status == ModVersionStatusEnum :: Accepted
217
+ {
215
218
tokio:: spawn ( async move {
216
219
if downloaded_version {
217
220
// we must nest more
@@ -264,45 +267,53 @@ pub async fn create_version(
264
267
}
265
268
266
269
// 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 ( ) ;
269
275
270
276
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
+ } ) ?;
276
281
if json. id != path. id {
277
282
return Err ( ApiError :: BadRequest ( format ! (
278
283
"Request id {} does not match mod.json id {}" ,
279
284
path. id, json. id
280
285
) ) ) ;
281
286
}
282
287
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
+
283
298
if dev. verified {
284
299
send_webhook (
285
300
json. id . clone ( ) ,
286
301
json. name . clone ( ) ,
287
302
json. version . clone ( ) ,
288
303
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
+ } ,
290
310
dev. clone ( ) ,
291
311
data. webhook_url . clone ( ) ,
292
- data. app_url . clone ( )
312
+ data. app_url . clone ( ) ,
293
313
)
294
314
. await ;
295
315
}
296
316
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
- }
306
317
transaction
307
318
. commit ( )
308
319
. await
@@ -327,8 +338,9 @@ pub async fn update_version(
327
338
path. version . as_str ( ) ,
328
339
false ,
329
340
false ,
330
- & mut pool
331
- ) . await ?;
341
+ & mut pool,
342
+ )
343
+ . await ?;
332
344
let approved_count = ModVersion :: get_accepted_count ( version. mod_id . as_str ( ) , & mut pool) . await ?;
333
345
let mut transaction = pool. begin ( ) . await . or ( Err ( ApiError :: TransactionError ) ) ?;
334
346
let id = match sqlx:: query!(
@@ -368,7 +380,7 @@ pub async fn update_version(
368
380
. commit ( )
369
381
. await
370
382
. or ( Err ( ApiError :: TransactionError ) ) ?;
371
-
383
+
372
384
if payload. status == ModVersionStatusEnum :: Accepted {
373
385
let is_update = approved_count > 0 ;
374
386
@@ -385,8 +397,9 @@ pub async fn update_version(
385
397
owner. as_ref ( ) . unwrap ( ) . clone ( ) ,
386
398
dev. clone ( ) ,
387
399
data. webhook_url . clone ( ) ,
388
- data. app_url . clone ( )
389
- ) . await ;
400
+ data. app_url . clone ( ) ,
401
+ )
402
+ . await ;
390
403
}
391
404
392
405
Ok ( HttpResponse :: NoContent ( ) )
0 commit comments