Skip to content

Commit df663a9

Browse files
committed
fix(rbac): add app config permissions
- Added create, read, update, delete - Defined permissions for each role
1 parent bc11531 commit df663a9

File tree

3 files changed

+67
-64
lines changed

3 files changed

+67
-64
lines changed

lib/src/rbac/permissions.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,11 @@ abstract class Permissions {
4747
static const String userPreferencesUpdateOwned =
4848
'user_preferences.update_owned';
4949

50-
// Remote Config Permissions (Admin-owned/managed)
51-
static const String remoteConfigReadAdmin = 'remote_config.read_admin';
52-
static const String remoteConfigUpdateAdmin = 'remote_config.update_admin';
50+
// App Config Permissions (Global/Managed)
51+
static const String appConfigCreate = 'app_config.create';
52+
static const String appConfigRead = 'app_config.read';
53+
static const String appConfigUpdate = 'app_config.update';
54+
static const String appConfigDelete = 'app_config.delete';
5355

5456
// Add other permissions as needed for future models/features
5557
}

lib/src/rbac/role_permissions.dart

Lines changed: 43 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,45 @@
11
import 'package:ht_api/src/rbac/permission_service.dart' show PermissionService;
22
import 'package:ht_api/src/rbac/permissions.dart';
3-
import 'package:ht_shared/ht_shared.dart'; // Assuming UserRole is defined here
3+
import 'package:ht_shared/ht_shared.dart';
4+
5+
final Set<String> _guestUserPermissions = {
6+
Permissions.headlineRead,
7+
Permissions.categoryRead,
8+
Permissions.sourceRead,
9+
Permissions.countryRead,
10+
Permissions.appSettingsReadOwned,
11+
Permissions.appSettingsUpdateOwned,
12+
Permissions.userPreferencesReadOwned,
13+
Permissions.userPreferencesUpdateOwned,
14+
Permissions.appConfigRead,
15+
};
16+
17+
final Set<String> _standardUserPermissions = {
18+
..._guestUserPermissions,
19+
Permissions.userReadOwned,
20+
Permissions.userUpdateOwned,
21+
Permissions.userDeleteOwned,
22+
};
23+
24+
final Set<String> _adminPermissions = {
25+
..._standardUserPermissions,
26+
Permissions.headlineCreate,
27+
Permissions.headlineUpdate,
28+
Permissions.headlineDelete,
29+
Permissions.categoryCreate,
30+
Permissions.categoryUpdate,
31+
Permissions.categoryDelete,
32+
Permissions.sourceCreate,
33+
Permissions.sourceUpdate,
34+
Permissions.sourceDelete,
35+
Permissions.countryCreate,
36+
Permissions.countryUpdate,
37+
Permissions.countryDelete,
38+
Permissions.userRead,
39+
Permissions.appConfigCreate,
40+
Permissions.appConfigUpdate,
41+
Permissions.appConfigDelete,
42+
};
443

544
/// Defines the mapping between user roles and the permissions they possess.
645
///
@@ -13,64 +52,7 @@ import 'package:ht_shared/ht_shared.dart'; // Assuming UserRole is defined here
1352
/// documentation and clarity. The [PermissionService] should handle the
1453
/// explicit admin bypass if desired.
1554
final Map<UserRole, Set<String>> rolePermissions = {
16-
UserRole.admin: {
17-
// Admins typically have all permissions. Listing them explicitly
18-
// or handling the admin bypass in PermissionService are options.
19-
// For clarity, listing some key admin permissions here:
20-
Permissions.headlineCreate,
21-
Permissions.headlineRead,
22-
Permissions.headlineUpdate,
23-
Permissions.headlineDelete,
24-
Permissions.categoryCreate,
25-
Permissions.categoryRead,
26-
Permissions.categoryUpdate,
27-
Permissions.categoryDelete,
28-
Permissions.sourceCreate,
29-
Permissions.sourceRead,
30-
Permissions.sourceUpdate,
31-
Permissions.sourceDelete,
32-
Permissions.countryCreate,
33-
Permissions.countryRead,
34-
Permissions.countryUpdate,
35-
Permissions.countryDelete,
36-
Permissions.userRead, // Admins can read any user profile
37-
Permissions.userReadOwned,
38-
Permissions.userUpdateOwned,
39-
Permissions.userDeleteOwned,
40-
Permissions.appSettingsReadOwned,
41-
Permissions.appSettingsUpdateOwned,
42-
Permissions.userPreferencesReadOwned,
43-
Permissions.userPreferencesUpdateOwned,
44-
Permissions.remoteConfigReadAdmin,
45-
Permissions.remoteConfigUpdateAdmin,
46-
// Add all other permissions here for completeness if not using admin bypass
47-
},
48-
UserRole.standardUser: {
49-
// Standard users can read public/shared data
50-
Permissions.headlineRead,
51-
Permissions.categoryRead,
52-
Permissions.sourceRead,
53-
Permissions.countryRead,
54-
// Standard users can manage their own user-owned data
55-
Permissions.userReadOwned,
56-
Permissions.userUpdateOwned,
57-
Permissions.userDeleteOwned,
58-
Permissions.appSettingsReadOwned,
59-
Permissions.appSettingsUpdateOwned,
60-
Permissions.userPreferencesReadOwned,
61-
Permissions.userPreferencesUpdateOwned,
62-
// Add other permissions for standard users as needed
63-
},
64-
UserRole.guestUser: {
65-
// Guest users have very limited permissions, primarily reading public data
66-
Permissions.headlineRead,
67-
Permissions.categoryRead,
68-
Permissions.sourceRead,
69-
Permissions.countryRead,
70-
// Standard users can manage their own anonymous-owned data
71-
Permissions.appSettingsReadOwned,
72-
Permissions.appSettingsUpdateOwned,
73-
Permissions.userPreferencesReadOwned,
74-
Permissions.userPreferencesUpdateOwned,
75-
},
55+
UserRole.guestUser: _guestUserPermissions,
56+
UserRole.standardUser: _standardUserPermissions,
57+
UserRole.admin: _adminPermissions,
7658
};

lib/src/registry/model_registry.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,25 @@ final modelRegistry = <String, ModelConfig<dynamic>>{
269269
// service during account deletion, not via a direct DELETE to /api/v1/data.
270270
),
271271
),
272+
// Configuration for AppConfig (global, managed by admins, readable by all authenticated)
273+
'app_config': ModelConfig<AppConfig>(
274+
fromJson: AppConfig.fromJson,
275+
getId: (config) => config.id,
276+
getOwnerId: null, // AppConfig is a global resource, not user-owned
277+
getPermission: const ModelActionPermission(
278+
type: RequiredPermissionType
279+
.none, // Readable by any authenticated user via /api/v1/data
280+
),
281+
postPermission: const ModelActionPermission(
282+
type: RequiredPermissionType.adminOnly, // Only administrators can create
283+
),
284+
putPermission: const ModelActionPermission(
285+
type: RequiredPermissionType.adminOnly, // Only administrators can update
286+
),
287+
deletePermission: const ModelActionPermission(
288+
type: RequiredPermissionType.adminOnly, // Only administrators can delete
289+
),
290+
),
272291
};
273292

274293
/// Type alias for the ModelRegistry map for easier provider usage.

0 commit comments

Comments
 (0)