From cc913680d40e54e03991f705579d46791e56738c Mon Sep 17 00:00:00 2001 From: Bryan Oltman Date: Wed, 10 Dec 2025 17:05:40 -0500 Subject: [PATCH] feat(shorebird_code_push_protocol): map roles to permissions (#3425) --- .../lib/src/models/plan.dart | 5 ++-- .../lib/src/models/plan.g.dart | 15 +++++++----- .../test/src/models/plan_test.dart | 24 ++++++++++++++++++- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/packages/shorebird_code_push_protocol/lib/src/models/plan.dart b/packages/shorebird_code_push_protocol/lib/src/models/plan.dart index 3df36a68..454a01a1 100644 --- a/packages/shorebird_code_push_protocol/lib/src/models/plan.dart +++ b/packages/shorebird_code_push_protocol/lib/src/models/plan.dart @@ -76,6 +76,7 @@ class Plan { /// for accounts with unlimited collaborators. final int? maxTeamSize; - /// Roles assignable to users associated with this plan. - final List availableRoles; + /// Roles assignable to users associated with this plan, mapped to the + /// permissions they have. + final Map> availableRoles; } diff --git a/packages/shorebird_code_push_protocol/lib/src/models/plan.g.dart b/packages/shorebird_code_push_protocol/lib/src/models/plan.g.dart index 315e3dd0..4261dcea 100644 --- a/packages/shorebird_code_push_protocol/lib/src/models/plan.g.dart +++ b/packages/shorebird_code_push_protocol/lib/src/models/plan.g.dart @@ -36,9 +36,12 @@ Plan _$PlanFromJson(Map json) => $checkedCreate( isTrial: $checkedConvert('is_trial', (v) => v as bool), availableRoles: $checkedConvert( 'available_roles', - (v) => (v as List) - .map((e) => $enumDecode(_$RoleEnumMap, e)) - .toList(), + (v) => (v as Map).map( + (k, e) => MapEntry( + $enumDecode(_$RoleEnumMap, k), + (e as List).map((e) => e as String).toList(), + ), + ), ), pricePerOverageInstall: $checkedConvert( 'price_per_overage_install', @@ -77,9 +80,9 @@ Map _$PlanToJson(Plan instance) => { 'is_tiered': instance.isTiered, 'is_trial': instance.isTrial, 'max_team_size': instance.maxTeamSize, - 'available_roles': instance.availableRoles - .map((e) => _$RoleEnumMap[e]!) - .toList(), + 'available_roles': instance.availableRoles.map( + (k, e) => MapEntry(_$RoleEnumMap[k]!, e), + ), }; const _$RoleEnumMap = { diff --git a/packages/shorebird_code_push_protocol/test/src/models/plan_test.dart b/packages/shorebird_code_push_protocol/test/src/models/plan_test.dart index b41cd8a8..a56a5b0a 100644 --- a/packages/shorebird_code_push_protocol/test/src/models/plan_test.dart +++ b/packages/shorebird_code_push_protocol/test/src/models/plan_test.dart @@ -17,7 +17,29 @@ void main() { maxTeamSize: 42, pricePerOverageInstall: Decimal.fromInt(10), isTrial: true, - availableRoles: [Role.admin, Role.developer], + availableRoles: { + Role.admin: [ + 'apps.view', + 'releases.view', + 'patches.view', + 'channels.view', + 'organizations.view', + 'organizationApps.view', + 'organizationMembers.view', + 'appRoleGrants.view', + 'insights.view', + 'plans.view', + ], + Role.developer: [ + 'apps.view', + 'releases.view', + 'patches.view', + 'channels.view', + 'organizations.view', + 'organizationApps.view', + 'organizationMembers.view', + ], + }, ); expect(Plan.fromJson(plan.toJson()).toJson(), equals(plan.toJson()));