33
44import 'dart:io' ;
55
6+ import 'package:dart_frog/dart_frog.dart' ;
7+ import 'package:ht_api/src/registry/model_registry.dart' ;
68import 'package:dart_frog/dart_frog.dart' ;
79import 'package:ht_api/src/registry/model_registry.dart' ;
810import 'package:ht_data_repository/ht_data_repository.dart' ;
911import '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