Skip to content

Commit 25c873a

Browse files
authored
Merge pull request #7 from headlines-toolkit/feature_data_sorting_in_route_handler
Feature data sorting in route handler
2 parents 8423719 + bf35926 commit 25c873a

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ht_api
22

3-
![coverage: percentage](https://img.shields.io/badge/coverage-XX-green)
3+
![coverage: percentage](https://img.shields.io/badge/coverage-xx-green)
44
[![style: very good analysis](https://img.shields.io/badge/style-very_good_analysis-B22C89.svg)](https://pub.dev/packages/very_good_analysis)
55
[![License: PolyForm Free Trial](https://img.shields.io/badge/License-PolyForm%20Free%20Trial-blue)](https://polyformproject.org/licenses/free-trial/1.0.0)
66

@@ -32,6 +32,10 @@ management dashboard](https://github.com/headlines-toolkit/ht-dashboard).
3232
including headlines, categories, and sources, through a well-structured
3333
and protected API.
3434

35+
* 🔀 **Flexible Data Sorting:** Order lists of headlines, sources, and other
36+
data by various fields in ascending or descending order, allowing for
37+
dynamic and user-driven content presentation.
38+
3539
* 📊 **Dynamic Dashboard Summary:** Access real-time, aggregated metrics on
3640
key data points like total headlines, categories, and sources, providing
3741
an at-a-glance overview for administrative dashboards.

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)