Skip to content

Commit 86072df

Browse files
committed
fix(data): improve error handling for filter, sort, and create operations
- Add error handling for invalid JSON format in 'filter' parameter - Implement error handling for incorrect 'sort' parameter format - Catch TypeError when creating an item from request body - Provide more descriptive error messages for BadRequestException
1 parent a3bf8c6 commit 86072df

File tree

1 file changed

+35
-14
lines changed

1 file changed

+35
-14
lines changed

routes/api/v1/data/index.dart

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,34 @@ Future<Response> _handleGet(RequestContext context) async {
2828
final authenticatedUser = context.read<User>();
2929
final params = context.request.uri.queryParameters;
3030

31-
final filter = params.containsKey('filter')
32-
? jsonDecode(params['filter']!) as Map<String, dynamic>
33-
: null;
31+
Map<String, dynamic>? filter;
32+
if (params.containsKey('filter')) {
33+
try {
34+
filter = jsonDecode(params['filter']!) as Map<String, dynamic>;
35+
} on FormatException catch (e) {
36+
throw BadRequestException(
37+
'Invalid "filter" parameter: Not valid JSON. $e',
38+
);
39+
}
40+
}
3441

35-
final sort = params.containsKey('sort')
36-
? (params['sort']!.split(',').map((s) {
37-
final parts = s.split(':');
38-
final field = parts[0];
39-
final order = (parts.length > 1 && parts[1] == 'desc')
40-
? SortOrder.desc
41-
: SortOrder.asc;
42-
return SortOption(field, order);
43-
}).toList())
44-
: null;
42+
List<SortOption>? sort;
43+
if (params.containsKey('sort')) {
44+
try {
45+
sort = params['sort']!.split(',').map((s) {
46+
final parts = s.split(':');
47+
final field = parts[0];
48+
final order = (parts.length > 1 && parts[1] == 'desc')
49+
? SortOrder.desc
50+
: SortOrder.asc;
51+
return SortOption(field, order);
52+
}).toList();
53+
} catch (e) {
54+
throw const BadRequestException(
55+
'Invalid "sort" parameter format. Use "field:order,field2:order".',
56+
);
57+
}
58+
}
4559

4660
final pagination =
4761
(params.containsKey('limit') || params.containsKey('cursor'))
@@ -91,7 +105,14 @@ Future<Response> _handlePost(RequestContext context) async {
91105
requestBody['createdAt'] = now;
92106
requestBody['updatedAt'] = now;
93107

94-
final itemToCreate = modelConfig.fromJson(requestBody);
108+
dynamic itemToCreate;
109+
try {
110+
itemToCreate = modelConfig.fromJson(requestBody);
111+
} on TypeError catch (e) {
112+
throw BadRequestException(
113+
'Invalid request body: Missing or invalid required field(s). $e',
114+
);
115+
}
95116

96117
final userIdForRepoCall =
97118
(modelConfig.getOwnerId != null &&

0 commit comments

Comments
 (0)