@@ -22,7 +22,7 @@ use semver::Version;
22
22
use serde:: Serialize ;
23
23
use sqlx:: {
24
24
types:: chrono:: { DateTime , Utc } ,
25
- PgConnection , Postgres , QueryBuilder ,
25
+ PgConnection
26
26
} ;
27
27
use std:: { collections:: HashMap , str:: FromStr } ;
28
28
@@ -228,16 +228,14 @@ impl Mod {
228
228
229
229
let gd = query. gd . map ( |x| vec ! [ x, GDVersionEnum :: All ] ) ;
230
230
231
- /*
232
- * VERY IMPORTANT MESSAGE BELOW.
233
- * This beautiful chunk of code below uses format!() to reuse the same joins / where clauses
234
- * in 2 queries. This uses prepared statements, the parameters are bound in the queries at the end.
235
- *
236
- * DO NOT, I repeat, DO NOT enter any user input inside the format!().
237
- * I will find you personally if you do so.
238
- *
239
- * - Flame
240
- */
231
+ // VERY IMPORTANT MESSAGE BELOW.
232
+ // This beautiful chunk of code below uses format!() to reuse the same joins / where clauses
233
+ // in 2 queries. This uses prepared statements, the parameters are bound in the queries at the end.
234
+ //
235
+ // DO NOT, I repeat, DO NOT enter any user input inside the format!().
236
+ // I will find you personally if you do so.
237
+ //
238
+ // - Flame
241
239
242
240
let joins_filters = r#"
243
241
INNER JOIN mod_versions mv ON m.id = mv.mod_id
@@ -440,9 +438,9 @@ impl Mod {
440
438
pub async fn get_all_for_dev (
441
439
id : i32 ,
442
440
status : ModVersionStatusEnum ,
441
+ only_owner : bool ,
443
442
pool : & mut PgConnection ,
444
443
) -> Result < Vec < SimpleDevMod > , ApiError > {
445
- #[ derive( sqlx:: FromRow ) ]
446
444
struct Record {
447
445
id : String ,
448
446
featured : bool ,
@@ -455,36 +453,33 @@ impl Mod {
455
453
info : Option < String > ,
456
454
}
457
455
458
- let mut query_builder: QueryBuilder < Postgres > = QueryBuilder :: new (
459
- "SELECT
460
- m.id, m.featured, m.download_count as mod_download_count,
461
- mv.name, mv.version, mv.download_count as mod_version_download_count,
462
- mvs.info, mvs.status,
463
- exists(
464
- select 1 from mod_version_statuses mvs_inner
465
- where mvs_inner.mod_version_id = mv.id and mvs_inner.status = 'accepted'
466
- ) as validated
456
+ let records = sqlx:: query_as!(
457
+ Record ,
458
+ r#"SELECT
459
+ m.id, m.featured, m.download_count as mod_download_count,
460
+ mv.name, mv.version, mv.download_count as mod_version_download_count,
461
+ mvs.info, mvs.status as "status: _",
462
+ exists(
463
+ select 1 from mod_version_statuses mvs_inner
464
+ where mvs_inner.mod_version_id = mv.id and mvs_inner.status = 'accepted'
465
+ ) as "validated!: _"
467
466
FROM mods m
468
467
INNER JOIN mod_versions mv ON m.id = mv.mod_id
469
468
INNER JOIN mods_developers md ON md.mod_id = m.id
470
469
INNER JOIN mod_version_statuses mvs ON mvs.mod_version_id = mv.id
471
- WHERE md.developer_id = " ,
472
- ) ;
473
- query_builder. push_bind ( id) ;
474
- query_builder. push ( " AND mvs.status = " ) ;
475
- query_builder. push_bind ( status) ;
476
-
477
- let records = match query_builder
478
- . build_query_as :: < Record > ( )
479
- . fetch_all ( & mut * pool)
480
- . await
481
- {
482
- Ok ( e) => e,
483
- Err ( e) => {
484
- log:: error!( "{}" , e) ;
485
- return Err ( ApiError :: DbError ) ;
486
- }
487
- } ;
470
+ WHERE md.developer_id = $1
471
+ AND mvs.status = $2
472
+ AND ($3 = false OR md.is_owner = true)
473
+ ORDER BY m.created_at DESC, mv.id DESC
474
+ "# ,
475
+ id,
476
+ status as ModVersionStatusEnum ,
477
+ only_owner
478
+ )
479
+ . fetch_all ( & mut * pool)
480
+ . await
481
+ . inspect_err ( |x| log:: error!( "Failed to fetch developer mods: {}" , x) )
482
+ . or ( Err ( ApiError :: DbError ) ) ?;
488
483
489
484
if records. is_empty ( ) {
490
485
return Ok ( vec ! [ ] ) ;
0 commit comments