Skip to content

Commit 7f0107f

Browse files
committed
add pagination to methods that suppor it
1 parent 892d6c7 commit 7f0107f

File tree

1 file changed

+105
-19
lines changed

1 file changed

+105
-19
lines changed

lib/src/network/explorer/explorer_client.dart

Lines changed: 105 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,24 @@ import 'explorer_api.dart'
2424
Status,
2525
Tapi;
2626

27+
class PaginatedRequest<T> {
28+
int page;
29+
int total;
30+
int totalPages;
31+
int firstPage;
32+
int lastPage;
33+
T data;
34+
35+
PaginatedRequest({
36+
required this.page,
37+
required this.total,
38+
required this.totalPages,
39+
required this.firstPage,
40+
required this.lastPage,
41+
required this.data,
42+
});
43+
}
44+
2745
enum ExplorerMode {
2846
production,
2947
development,
@@ -52,7 +70,21 @@ class ExplorerClient {
5270
var response = await http.get(uri);
5371
if (response.statusCode == 200) {
5472
// response is okay
55-
return convert.jsonDecode(response.body) as Map<String, dynamic>;
73+
dynamic result =
74+
convert.jsonDecode(response.body) as Map<String, dynamic>;
75+
76+
if (response.headers["x-pagination"] != null) {
77+
dynamic paginationHeaders = response.headers["x-pagination"];
78+
79+
return PaginatedRequest(
80+
data: result,
81+
firstPage: paginationHeaders["first_page"],
82+
lastPage: paginationHeaders["last_page"],
83+
page: paginationHeaders["page"],
84+
total: paginationHeaders["total"],
85+
totalPages: paginationHeaders["total_pages"],
86+
);
87+
}
5688
} else if (response.statusCode == 500) {}
5789
throw ExplorerException(
5890
code: response.statusCode, message: response.reasonPhrase!);
@@ -179,20 +211,40 @@ class ExplorerClient {
179211
}
180212
}
181213

182-
Future<NetworkBalances> networkBalances({int? page, int? pageSize}) async {
214+
Future<PaginatedRequest<NetworkBalances>> networkBalances(
215+
{int? page, int? pageSize}) async {
183216
try {
184-
return NetworkBalances.fromJson(await _processGet(
185-
api('network/balances', {"page": page, "page_size": pageSize})));
217+
PaginatedRequest<dynamic> result = await _processGet(
218+
api('network/balances', {"page": page, "page_size": pageSize}));
219+
220+
return PaginatedRequest(
221+
data: NetworkBalances.fromJson(result.data),
222+
firstPage: result.firstPage,
223+
lastPage: result.lastPage,
224+
page: result.page,
225+
total: result.total,
226+
totalPages: result.totalPages,
227+
);
186228
} on ExplorerException catch (e) {
187229
throw ExplorerException(
188230
code: e.code, message: '{"network": "${e.message}"}');
189231
}
190232
}
191233

192-
Future<NetworkReputation> reputation({int? page, int? pageSize}) async {
234+
Future<PaginatedRequest<NetworkReputation>> reputation(
235+
{int? page, int? pageSize}) async {
193236
try {
194-
return NetworkReputation.fromJson(await _processGet(
195-
api('network/reputation', {"page": page, "page_size": pageSize})));
237+
PaginatedRequest<dynamic> result = await _processGet(
238+
api('network/reputation', {"page": page, "page_size": pageSize}));
239+
240+
return PaginatedRequest(
241+
data: NetworkReputation.fromJson(result.data),
242+
firstPage: result.firstPage,
243+
lastPage: result.lastPage,
244+
page: result.page,
245+
total: result.total,
246+
totalPages: result.totalPages,
247+
);
196248
} on ExplorerException catch (e) {
197249
throw ExplorerException(
198250
code: e.code, message: '{"network": "${e.message}"}');
@@ -233,37 +285,71 @@ class ExplorerClient {
233285
try {
234286
switch (tab) {
235287
case 'blocks':
236-
List<Map<String, dynamic>> data = await _processGet(api(
237-
'address/blocks',
238-
{'address': value, 'page': page, 'page_size': pageSize}));
239-
return AddressBlocks.fromJson(data);
288+
PaginatedRequest<List<Map<String, dynamic>>> result =
289+
await _processGet(api('address/blocks',
290+
{'address': value, 'page': page, 'page_size': pageSize}));
291+
return PaginatedRequest(
292+
data: AddressBlocks.fromJson(result.data),
293+
firstPage: result.firstPage,
294+
lastPage: result.lastPage,
295+
page: result.page,
296+
total: result.total,
297+
totalPages: result.totalPages,
298+
);
240299
// case 'details':
241300
// var data = await _processGet(api('address', {'value': value}));
242301
// return AddressDetails.fromJson(data);
243302
case 'data_requests_solved':
244-
var data = await _processGet(api('address/data-requests-solved',
303+
PaginatedRequest<dynamic> result = await _processGet(api(
304+
'address/data-requests-solved',
245305
{'value': value, 'page': page, 'page_size': pageSize}));
246-
return AddressDataRequestsSolved.fromJson(
247-
{'address': value, 'data_requests_solved': data});
306+
return PaginatedRequest(
307+
data: AddressDataRequestsSolved.fromJson(
308+
{'address': value, 'data_requests_solved': result.data}),
309+
firstPage: result.firstPage,
310+
lastPage: result.lastPage,
311+
page: result.page,
312+
total: result.total,
313+
totalPages: result.totalPages,
314+
);
248315
case 'data_requests_created':
249316
// TODO: implement method
250317
// waiting on the explorer to return valid response
251318
break;
252319
case 'value_transfers':
253-
var data = await _processGet(api('address/value-transfers',
320+
PaginatedRequest<dynamic> result = await _processGet(api(
321+
'address/value-transfers',
254322
{'value': value, 'page': page, 'page_size': pageSize}));
255-
return AddressValueTransfers.fromJson(data);
323+
324+
return PaginatedRequest(
325+
data: AddressValueTransfers.fromJson(result.data),
326+
firstPage: result.firstPage,
327+
lastPage: result.lastPage,
328+
page: result.page,
329+
total: result.total,
330+
totalPages: result.totalPages,
331+
);
256332
}
257333
} on ExplorerException catch (e) {
258334
throw ExplorerException(
259335
code: e.code, message: '{"address": "${e.message}"}');
260336
}
261337
}
262338

263-
Future<Blockchain> blockchain({int? page, int? pageSize}) async {
339+
Future<PaginatedRequest<Blockchain>> blockchain(
340+
{int? page, int? pageSize}) async {
264341
try {
265-
return Blockchain.fromJson(await _processGet(
266-
api('network/blockchain', {'page': page, 'page_size': pageSize})));
342+
PaginatedRequest<dynamic> result = await _processGet(
343+
api('network/blockchain', {'page': page, 'page_size': pageSize}));
344+
345+
return PaginatedRequest(
346+
data: Blockchain.fromJson(result.data),
347+
firstPage: result.firstPage,
348+
lastPage: result.lastPage,
349+
page: result.page,
350+
total: result.total,
351+
totalPages: result.totalPages,
352+
);
267353
} on ExplorerException catch (e) {
268354
throw ExplorerException(
269355
code: e.code, message: '{"blockchain": "${e.message}"}');

0 commit comments

Comments
 (0)