Skip to content

Commit 7ba4611

Browse files
committed
feat(api): make country and language models read-only
- Updates the model registry to configure `Country` and `Language` as read-only by marking POST, PUT, and DELETE operations as unsupported. This reflects that they are static, real-world data managed by seeding. - Adds the `Language` model to the item-specific route handler (`/data/[id]`) to complete its integration, allowing individual languages to be fetched by ID.
1 parent affa16d commit 7ba4611

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

lib/src/registry/model_registry.dart

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,9 @@ final modelRegistry = <String, ModelConfig<dynamic>>{
188188
'country': ModelConfig<Country>(
189189
fromJson: Country.fromJson,
190190
getId: (c) => c.id,
191-
// Countries: Admin-owned, read allowed by standard/guest users
191+
// Countries: Static data, read-only for all authenticated users.
192+
// Modification is not allowed via the API as this is real-world data
193+
// managed by database seeding.
192194
getCollectionPermission: const ModelActionPermission(
193195
type: RequiredPermissionType.specificPermission,
194196
permission: Permissions.countryRead,
@@ -197,14 +199,32 @@ final modelRegistry = <String, ModelConfig<dynamic>>{
197199
type: RequiredPermissionType.specificPermission,
198200
permission: Permissions.countryRead,
199201
),
202+
postPermission: const ModelActionPermission(type: RequiredPermissionType.unsupported),
203+
putPermission: const ModelActionPermission(type: RequiredPermissionType.unsupported),
204+
deletePermission: const ModelActionPermission(type: RequiredPermissionType.unsupported),
205+
),
206+
'language': ModelConfig<Language>(
207+
fromJson: Language.fromJson,
208+
getId: (l) => l.id,
209+
// Languages: Static data, read-only for all authenticated users.
210+
// Modification is not allowed via the API as this is real-world data
211+
// managed by database seeding.
212+
getCollectionPermission: const ModelActionPermission(
213+
type: RequiredPermissionType.specificPermission,
214+
permission: Permissions.languageRead,
215+
),
216+
getItemPermission: const ModelActionPermission(
217+
type: RequiredPermissionType.specificPermission,
218+
permission: Permissions.languageRead,
219+
),
200220
postPermission: const ModelActionPermission(
201-
type: RequiredPermissionType.adminOnly,
221+
type: RequiredPermissionType.unsupported,
202222
),
203223
putPermission: const ModelActionPermission(
204-
type: RequiredPermissionType.adminOnly,
224+
type: RequiredPermissionType.unsupported,
205225
),
206226
deletePermission: const ModelActionPermission(
207-
type: RequiredPermissionType.adminOnly,
227+
type: RequiredPermissionType.unsupported,
208228
),
209229
),
210230
'user': ModelConfig<User>(

routes/api/v1/data/[id]/index.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ Future<Response> _handleGet(
107107
case 'country':
108108
final repo = context.read<DataRepository<Country>>();
109109
item = await repo.read(id: id, userId: userIdForRepoCall);
110+
case 'language':
111+
final repo = context.read<DataRepository<Language>>();
112+
item = await repo.read(id: id, userId: userIdForRepoCall);
110113
case 'user': // Handle User model specifically if needed, or rely on generic
111114
final repo = context.read<DataRepository<User>>();
112115
item = await repo.read(id: id, userId: userIdForRepoCall);
@@ -309,6 +312,15 @@ Future<Response> _handlePut(
309312
userId: userIdForRepoCall,
310313
);
311314
}
315+
case 'language':
316+
{
317+
final repo = context.read<DataRepository<Language>>();
318+
updatedItem = await repo.update(
319+
id: id,
320+
item: itemToUpdate as Language,
321+
userId: userIdForRepoCall,
322+
);
323+
}
312324
case 'user':
313325
{
314326
final repo = context.read<DataRepository<User>>();
@@ -454,6 +466,9 @@ Future<Response> _handleDelete(
454466
case 'country':
455467
final repo = context.read<DataRepository<Country>>();
456468
itemToDelete = await repo.read(id: id, userId: userIdForRepoCall);
469+
case 'language':
470+
final repo = context.read<DataRepository<Language>>();
471+
itemToDelete = await repo.read(id: id, userId: userIdForRepoCall);
457472
case 'user':
458473
final repo = context.read<DataRepository<User>>();
459474
itemToDelete = await repo.read(id: id, userId: userIdForRepoCall);
@@ -517,6 +532,11 @@ Future<Response> _handleDelete(
517532
id: id,
518533
userId: userIdForRepoCall,
519534
);
535+
case 'language':
536+
await context.read<DataRepository<Language>>().delete(
537+
id: id,
538+
userId: userIdForRepoCall,
539+
);
520540
case 'user':
521541
await context.read<DataRepository<User>>().delete(
522542
id: id,

0 commit comments

Comments
 (0)