Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /