@@ -5,6 +5,7 @@ import 'shlink_exception.dart';
5
5
import 'dto/create_short_url.dart' ;
6
6
import 'dto/meta.dart' ;
7
7
import 'dto/short_url.dart' ;
8
+ import 'dto/visit.dart' ;
8
9
import 'enums/order_field.dart' ;
9
10
import 'extension/datetime.dart' ;
10
11
@@ -212,9 +213,7 @@ class Shlink {
212
213
Map <String , dynamic > mShortUrls = mJson['shortUrls' ];
213
214
214
215
List <dynamic > lstData = mShortUrls['data' ];
215
- for (dynamic data in lstData) {
216
- lstShortUrls.add (ShortUrl .fromJson (data));
217
- }
216
+ lstShortUrls.addAll (lstData.map ((u) => ShortUrl .fromJson (u)).toList ());
218
217
219
218
Map <String , dynamic > mPagination = mShortUrls['pagination' ];
220
219
if (mPagination['pagesCount' ] > mPagination['currentPage' ]) {
@@ -334,4 +333,64 @@ class Shlink {
334
333
String sBody = await utf8.decoder.bind (response).single;
335
334
throw ShlinkException .fromJson (response.statusCode, sBody);
336
335
}
336
+
337
+ /// List the visits of [shortCode] within [startDate] and [endDate]
338
+ Future <List <Visit >> listVisits (String shortCode,
339
+ {DateTime startDate, DateTime endDate}) async {
340
+ return _listVisits (1 , shortCode, startDate, endDate);
341
+ }
342
+
343
+ /// Internal visit list method
344
+ Future <List <Visit >> _listVisits (
345
+ int iPage, String shortCode, DateTime startDate, DateTime endDate) async {
346
+ String sUrl = '$_url $_API_PATH /short-urls/${shortCode }/visits?page=$iPage ' ;
347
+
348
+ if (_domain != null && _domain.isNotEmpty) {
349
+ sUrl += '&domain=$_domain ' ;
350
+ }
351
+
352
+ // Start Date
353
+ if (startDate != null ) {
354
+ sUrl +=
355
+ '&startDate=${Uri .encodeQueryComponent (startDate .toIso8601StringShlink ())}' ;
356
+ }
357
+
358
+ // End Date
359
+ if (endDate != null ) {
360
+ sUrl +=
361
+ '&endDate=${Uri .encodeQueryComponent (endDate .toIso8601StringShlink ())}' ;
362
+ }
363
+
364
+ List <Visit > lstVisits = < Visit > [];
365
+
366
+ HttpClientRequest request = await HttpClient ().getUrl (Uri .parse (sUrl))
367
+ ..headers.contentType = ContentType .json
368
+ ..headers.set (_HEADER_API_KEY , _apiKey);
369
+
370
+ HttpClientResponse response = await request.close ();
371
+
372
+ if (response.statusCode == 404 ) {
373
+ return null ;
374
+ }
375
+
376
+ String sBody = await utf8.decoder.bind (response).single;
377
+
378
+ if (response.statusCode != 200 ) {
379
+ throw ShlinkException .fromJson (response.statusCode, sBody);
380
+ }
381
+
382
+ Map <String , dynamic > mJson = jsonDecode (sBody);
383
+ Map <String , dynamic > mVisits = mJson['visits' ];
384
+
385
+ List <dynamic > lstVisitsJson = mVisits['data' ];
386
+ lstVisits.addAll (lstVisitsJson.map ((v) => Visit .fromJson (v)).toList ());
387
+
388
+ Map <String , dynamic > mPagination = mVisits['pagination' ];
389
+ if (mPagination['pagesCount' ] > mPagination['currentPage' ]) {
390
+ lstVisitsJson
391
+ .addAll (await _listVisits (iPage + 1 , shortCode, startDate, endDate));
392
+ }
393
+
394
+ return lstVisits;
395
+ }
337
396
}
0 commit comments