You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: add cumulative rulesLevel filter to allChassis query
Add rulesLevel parameter to the allChassis GraphQL query, filtering to
chassis with at least one variant at or below the given rules level.
Also change all existing rulesLevel filters (units, equipment,
construction reference) from exact match to cumulative — e.g. ADVANCED
now includes introductory, standard, and advanced, matching BattleTech's
hierarchical rules level system.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: crates/api/src/graphql/query.rs
+12-10Lines changed: 12 additions & 10 deletions
Original file line number
Diff line number
Diff line change
@@ -142,7 +142,7 @@ impl QueryRoot {
142
142
#[graphql(desc = "Opaque cursor from a previous pageInfo.endCursor. Omit for the first page.")]after:Option<String>,
143
143
#[graphql(desc = "Case-insensitive substring match against the unit's full name.")]name_search:Option<String>,
144
144
#[graphql(desc = "Filter by technology base.")]tech_base:Option<TechBaseFilter>,
145
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
145
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
146
146
#[graphql(desc = "Minimum tonnage filter (inclusive). Weight in metric tons.")]tonnage_min:Option<f64>,
147
147
#[graphql(desc = "Maximum tonnage filter (inclusive). Weight in metric tons.")]tonnage_max:Option<f64>,
148
148
#[graphql(desc = "Minimum Battle Value filter (inclusive).")]bv_min:Option<i32>,
@@ -233,18 +233,20 @@ impl QueryRoot {
233
233
Ok(row.map(UnitChassisGql))
234
234
}
235
235
236
-
/// List all chassis, optionally filtered by unit typeand/or technology base.
236
+
/// List all chassis, optionally filtered by unit type, technology base, and/or rules level.
237
237
asyncfnall_chassis(
238
238
&self,
239
239
ctx:&Context<'_>,
240
240
#[graphql(desc = "Filter by unit type.")]unit_type:Option<UnitTypeFilter>,
241
241
#[graphql(desc = "Filter by technology base.")]tech_base:Option<TechBaseFilter>,
242
+
#[graphql(desc = "Filter to chassis with at least one variant at or below this rules level (cumulative).")]rules_level:Option<RulesLevelFilter>,
#[graphql(desc = "Case-insensitive substring match against the equipment name.")]name_search:Option<String>,
273
275
#[graphql(desc = "Filter by equipment category.")]category:Option<EquipmentCategoryFilter>,
274
276
#[graphql(desc = "Filter by technology base.")]tech_base:Option<TechBaseFilter>,
275
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
277
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
276
278
#[graphql(desc = "Filter to equipment weighing at most this many tons. Only matches items with known tonnage.")]max_tonnage:Option<f64>,
277
279
#[graphql(desc = "Filter to equipment consuming at most this many critical slots. Only matches items with known crits.")]max_crits:Option<i32>,
278
280
#[graphql(desc = "Filter to equipment observed in this location across existing units (e.g. \"right_arm\").")]observed_location:Option<String>,
@@ -397,7 +399,7 @@ impl QueryRoot {
397
399
&self,
398
400
ctx:&Context<'_>,
399
401
#[graphql(desc = "Filter by technology base.")]tech_base:Option<TechBaseFilter>,
400
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
402
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
401
403
) -> Result<Vec<EngineTypeGql>,AppError>{
402
404
let state = ctx.data::<AppState>().unwrap();
403
405
let rows = construction::list_engine_types(
@@ -414,7 +416,7 @@ impl QueryRoot {
414
416
&self,
415
417
ctx:&Context<'_>,
416
418
#[graphql(desc = "Filter by technology base.")]tech_base:Option<TechBaseFilter>,
417
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
419
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
418
420
) -> Result<Vec<ArmorTypeGql>,AppError>{
419
421
let state = ctx.data::<AppState>().unwrap();
420
422
let rows = construction::list_armor_types(
@@ -431,7 +433,7 @@ impl QueryRoot {
431
433
&self,
432
434
ctx:&Context<'_>,
433
435
#[graphql(desc = "Filter by technology base.")]tech_base:Option<TechBaseFilter>,
434
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
436
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
435
437
) -> Result<Vec<StructureTypeGql>,AppError>{
436
438
let state = ctx.data::<AppState>().unwrap();
437
439
let rows = construction::list_structure_types(
@@ -448,7 +450,7 @@ impl QueryRoot {
448
450
&self,
449
451
ctx:&Context<'_>,
450
452
#[graphql(desc = "Filter by technology base.")]tech_base:Option<TechBaseFilter>,
451
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
453
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
452
454
) -> Result<Vec<HeatsinkTypeGql>,AppError>{
453
455
let state = ctx.data::<AppState>().unwrap();
454
456
let rows = construction::list_heatsink_types(
@@ -464,7 +466,7 @@ impl QueryRoot {
464
466
asyncfngyro_types(
465
467
&self,
466
468
ctx:&Context<'_>,
467
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
469
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
468
470
) -> Result<Vec<GyroTypeGql>,AppError>{
469
471
let state = ctx.data::<AppState>().unwrap();
470
472
let rows = construction::list_gyro_types(
@@ -479,7 +481,7 @@ impl QueryRoot {
479
481
asyncfncockpit_types(
480
482
&self,
481
483
ctx:&Context<'_>,
482
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
484
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
483
485
) -> Result<Vec<CockpitTypeGql>,AppError>{
484
486
let state = ctx.data::<AppState>().unwrap();
485
487
let rows = construction::list_cockpit_types(
@@ -494,7 +496,7 @@ impl QueryRoot {
494
496
asyncfnmyomer_types(
495
497
&self,
496
498
ctx:&Context<'_>,
497
-
#[graphql(desc = "Filter by rules level.")]rules_level:Option<RulesLevelFilter>,
499
+
#[graphql(desc = "Filter by maximum rules level (cumulative). E.g. ADVANCED includes introductory, standard, and advanced.")]rules_level:Option<RulesLevelFilter>,
0 commit comments