Skip to content

Commit 5931afd

Browse files
committed
refactor(api): wrap data responses in SuccessApiResponse
- Modify GET handler to return PaginatedResponse wrapped in SuccessApiResponse - Update POST handler to return created item wrapped in SuccessApiResponse - Add import for SuccessApiResponse and PaginatedResponse
1 parent 0023066 commit 5931afd

File tree

1 file changed

+42
-23
lines changed

1 file changed

+42
-23
lines changed

routes/api/v1/data/index.dart

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33

44
import 'dart:io';
55

6+
import 'package:dart_frog/dart_frog.dart';
7+
import 'package:ht_api/src/registry/model_registry.dart';
68
import 'package:dart_frog/dart_frog.dart';
79
import 'package:ht_api/src/registry/model_registry.dart';
810
import 'package:ht_data_repository/ht_data_repository.dart';
911
import 'package:ht_http_client/ht_http_client.dart'; // Import exceptions
10-
import 'package:ht_shared/ht_shared.dart'; // Import models
12+
import 'package:ht_shared/ht_shared.dart'; // Import models, SuccessApiResponse, PaginatedResponse
1113

1214
/// Handles requests for the /api/v1/data collection endpoint.
1315
/// Dispatches requests to specific handlers based on the HTTP method.
@@ -61,49 +63,45 @@ Future<Response> _handleGet(RequestContext context, String modelName) async {
6163
..remove('limit');
6264

6365
// Process based on model type
64-
List<Map<String, dynamic>> jsonList;
66+
PaginatedResponse<dynamic> paginatedResponse; // Use dynamic for the list
6567
try {
6668
switch (modelName) {
6769
case 'headline':
6870
final repo = context.read<HtDataRepository<Headline>>();
69-
final results = specificQuery.isNotEmpty
71+
paginatedResponse = specificQuery.isNotEmpty
7072
? await repo.readAllByQuery(
7173
specificQuery,
7274
startAfterId: startAfterId,
7375
limit: limit,
7476
)
7577
: await repo.readAll(startAfterId: startAfterId, limit: limit);
76-
jsonList = results.map((item) => item.toJson()).toList();
7778
case 'category':
7879
final repo = context.read<HtDataRepository<Category>>();
79-
final results = specificQuery.isNotEmpty
80+
paginatedResponse = specificQuery.isNotEmpty
8081
? await repo.readAllByQuery(
8182
specificQuery,
8283
startAfterId: startAfterId,
8384
limit: limit,
8485
)
8586
: await repo.readAll(startAfterId: startAfterId, limit: limit);
86-
jsonList = results.map((item) => item.toJson()).toList();
8787
case 'source':
8888
final repo = context.read<HtDataRepository<Source>>();
89-
final results = specificQuery.isNotEmpty
89+
paginatedResponse = specificQuery.isNotEmpty
9090
? await repo.readAllByQuery(
9191
specificQuery,
9292
startAfterId: startAfterId,
9393
limit: limit,
9494
)
9595
: await repo.readAll(startAfterId: startAfterId, limit: limit);
96-
jsonList = results.map((item) => item.toJson()).toList();
9796
case 'country':
9897
final repo = context.read<HtDataRepository<Country>>();
99-
final results = specificQuery.isNotEmpty
98+
paginatedResponse = specificQuery.isNotEmpty
10099
? await repo.readAllByQuery(
101100
specificQuery,
102101
startAfterId: startAfterId,
103102
limit: limit,
104103
)
105104
: await repo.readAll(startAfterId: startAfterId, limit: limit);
106-
jsonList = results.map((item) => item.toJson()).toList();
107105
default:
108106
// This case should be caught by middleware, but added for safety
109107
return Response(
@@ -123,8 +121,21 @@ Future<Response> _handleGet(RequestContext context, String modelName) async {
123121
'Internal Server Error: Could not resolve repository for model "$modelName".',
124122
);
125123
}
126-
// Return the serialized list
127-
return Response.json(body: jsonList);
124+
125+
// Wrap the PaginatedResponse in SuccessApiResponse and serialize
126+
final successResponse = SuccessApiResponse<PaginatedResponse<dynamic>>(
127+
data: paginatedResponse,
128+
// metadata: ResponseMetadata(timestamp: DateTime.now()), // Optional
129+
);
130+
131+
// Need to provide the correct toJsonT for PaginatedResponse
132+
final responseJson = successResponse.toJson(
133+
(paginated) => paginated.toJson(
134+
(item) => (item as dynamic).toJson(), // Assuming all models have toJson
135+
),
136+
);
137+
138+
return Response.json(body: responseJson);
128139
}
129140

130141
// --- POST Handler ---
@@ -162,26 +173,22 @@ Future<Response> _handlePost(
162173
}
163174

164175
// Process based on model type
165-
Map<String, dynamic> createdJson;
176+
dynamic createdItem; // Use dynamic
166177
// Repository exceptions (like BadRequestException from create) will propagate
167178
// up to the main onRequest try/catch and be re-thrown to the middleware.
168179
switch (modelName) {
169180
case 'headline':
170181
final repo = context.read<HtDataRepository<Headline>>();
171-
final createdItem = await repo.create(newItem as Headline);
172-
createdJson = createdItem.toJson();
182+
createdItem = await repo.create(newItem as Headline);
173183
case 'category':
174184
final repo = context.read<HtDataRepository<Category>>();
175-
final createdItem = await repo.create(newItem as Category);
176-
createdJson = createdItem.toJson();
185+
createdItem = await repo.create(newItem as Category);
177186
case 'source':
178187
final repo = context.read<HtDataRepository<Source>>();
179-
final createdItem = await repo.create(newItem as Source);
180-
createdJson = createdItem.toJson();
188+
createdItem = await repo.create(newItem as Source);
181189
case 'country':
182190
final repo = context.read<HtDataRepository<Country>>();
183-
final createdItem = await repo.create(newItem as Country);
184-
createdJson = createdItem.toJson();
191+
createdItem = await repo.create(newItem as Country);
185192
default:
186193
// This case should ideally be caught by middleware, but added for safety
187194
return Response(
@@ -190,6 +197,18 @@ Future<Response> _handlePost(
190197
'Internal Server Error: Unsupported model type "$modelName" reached handler.',
191198
);
192199
}
193-
// Return the serialized created item
194-
return Response.json(statusCode: HttpStatus.created, body: createdJson);
200+
201+
// Wrap the created item in SuccessApiResponse and serialize
202+
final successResponse = SuccessApiResponse<dynamic>(
203+
data: createdItem,
204+
// metadata: ResponseMetadata(timestamp: DateTime.now()), // Optional
205+
);
206+
207+
// Provide the correct toJsonT for the specific model type
208+
final responseJson = successResponse.toJson(
209+
(item) => (item as dynamic).toJson(), // Assuming all models have toJson
210+
);
211+
212+
// Return the serialized response
213+
return Response.json(statusCode: HttpStatus.created, body: responseJson);
195214
}

0 commit comments

Comments
 (0)