Skip to content

Commit 805df37

Browse files
committed
feat: implement sortBy and sortOrder in data endpoint
- Updates the GET /api/v1/data route to parse and validate `sortBy` and `sortOrder` query parameters. - Passes the sorting parameters to the underlying data repository's `readAllByQuery` method. - Throws a `BadRequestException` if `sortOrder` is provided with a value other than "asc" or "desc".
1 parent 8423719 commit 805df37

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

routes/api/v1/data/index.dart

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,34 @@ Future<Response> _handleGet(
109109
final queryParams = context.request.uri.queryParameters;
110110
final startAfterId = queryParams['startAfterId'];
111111
final limitParam = queryParams['limit'];
112+
final sortBy = queryParams['sortBy'];
113+
final sortOrderRaw = queryParams['sortOrder']?.toLowerCase();
112114
final limit = limitParam != null ? int.tryParse(limitParam) : null;
113115

116+
SortOrder? sortOrder;
117+
if (sortOrderRaw != null) {
118+
if (sortOrderRaw == 'asc') {
119+
sortOrder = SortOrder.asc;
120+
} else if (sortOrderRaw == 'desc') {
121+
sortOrder = SortOrder.desc;
122+
} else {
123+
throw const BadRequestException(
124+
'Invalid "sortOrder" parameter. Must be "asc" or "desc".',
125+
);
126+
}
127+
}
128+
114129
final specificQueryForClient = <String, String>{};
115130
final Set<String> allowedKeys;
116131
final receivedKeys = queryParams.keys
117-
.where((k) => k != 'model' && k != 'startAfterId' && k != 'limit')
132+
.where(
133+
(k) =>
134+
k != 'model' &&
135+
k != 'startAfterId' &&
136+
k != 'limit' &&
137+
k != 'sortBy' &&
138+
k != 'sortOrder',
139+
)
118140
.toSet();
119141

120142
switch (modelName) {
@@ -207,6 +229,8 @@ Future<Response> _handleGet(
207229
userId: userIdForRepoCall,
208230
startAfterId: startAfterId,
209231
limit: limit,
232+
sortBy: sortBy,
233+
sortOrder: sortOrder,
210234
);
211235
case 'category':
212236
final repo = context.read<HtDataRepository<Category>>();
@@ -215,6 +239,8 @@ Future<Response> _handleGet(
215239
userId: userIdForRepoCall,
216240
startAfterId: startAfterId,
217241
limit: limit,
242+
sortBy: sortBy,
243+
sortOrder: sortOrder,
218244
);
219245
case 'source':
220246
final repo = context.read<HtDataRepository<Source>>();
@@ -223,6 +249,8 @@ Future<Response> _handleGet(
223249
userId: userIdForRepoCall,
224250
startAfterId: startAfterId,
225251
limit: limit,
252+
sortBy: sortBy,
253+
sortOrder: sortOrder,
226254
);
227255
case 'country':
228256
final repo = context.read<HtDataRepository<Country>>();
@@ -231,6 +259,8 @@ Future<Response> _handleGet(
231259
userId: userIdForRepoCall,
232260
startAfterId: startAfterId,
233261
limit: limit,
262+
sortBy: sortBy,
263+
sortOrder: sortOrder,
234264
);
235265
case 'user':
236266
final repo = context.read<HtDataRepository<User>>();
@@ -239,6 +269,8 @@ Future<Response> _handleGet(
239269
userId: userIdForRepoCall,
240270
startAfterId: startAfterId,
241271
limit: limit,
272+
sortBy: sortBy,
273+
sortOrder: sortOrder,
242274
);
243275
case 'user_app_settings':
244276
final repo = context.read<HtDataRepository<UserAppSettings>>();
@@ -247,6 +279,8 @@ Future<Response> _handleGet(
247279
userId: userIdForRepoCall,
248280
startAfterId: startAfterId,
249281
limit: limit,
282+
sortBy: sortBy,
283+
sortOrder: sortOrder,
250284
);
251285
case 'user_content_preferences':
252286
final repo = context.read<HtDataRepository<UserContentPreferences>>();
@@ -255,6 +289,8 @@ Future<Response> _handleGet(
255289
userId: userIdForRepoCall,
256290
startAfterId: startAfterId,
257291
limit: limit,
292+
sortBy: sortBy,
293+
sortOrder: sortOrder,
258294
);
259295
case 'app_config':
260296
final repo = context.read<HtDataRepository<AppConfig>>();
@@ -263,6 +299,8 @@ Future<Response> _handleGet(
263299
userId: userIdForRepoCall,
264300
startAfterId: startAfterId,
265301
limit: limit,
302+
sortBy: sortBy,
303+
sortOrder: sortOrder,
266304
);
267305
default:
268306
throw OperationFailedException(

0 commit comments

Comments
 (0)