Skip to content

Commit d318544

Browse files
author
Patrick FINKELSTEIN
committed
added optional print in API
1 parent cf2fc87 commit d318544

8 files changed

Lines changed: 122 additions & 58 deletions

File tree

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,18 @@ work in progress
2525

2626
How to use:
2727

28-
Please check example() in main.dart for the moment
28+
Please check examples.dart for the moment
2929

30-
https://github.com/BirdyF/strava_flutter/blob/master/lib/main.dart
30+
https://github.com/BirdyF/strava_flutter/blob/master/example/lib/examples.dart
31+
32+
33+
How to use it
34+
1 - Create a file secret.dart to put the secret shown on Strava settings related to your app
35+
https://www.strava.com/settings/api
36+
37+
2 - In constants.dart put your appID in clientID
38+
39+
3 - To see debug info in Strava API, set isInDebug to true in globals.dart
3140

3241

3342
Tested on:

example/lib/examples.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,13 @@ import 'package:strava_flutter/Models/summaryActivity.dart';
2828

2929

3030
/// Example showing how to upload an activity on Strava
31+
///
3132
/// Use file Bormes.gpx in assets
33+
///
3234
/// Should appear on your activities 6 Feb. 2018
35+
///
3336
/// Under the title Bormes3
37+
///
3438
Future<Fault> exampleUpload(String secret) async {
3539

3640
Future<void> writeToFile(ByteData data, String path) {
@@ -81,10 +85,16 @@ void example(String secret) async {
8185

8286
if (isAuthOk) {
8387

84-
DetailedAthlete athlete = await strava.getLoggedInAthlete();
88+
DetailedAthlete _athlete = await strava.getLoggedInAthlete();
89+
if (_athlete.fault.statusCode != strava.statusOk) {
90+
91+
print('Error in getloggedInAthlete ${_athlete.fault.statusCode}');
92+
}
93+
8594

8695
List<RunningRace> listRunningRaces = await strava.getRunningRaces("2019");
8796

97+
// id corresponding to BMW Berlin Marathon 29th Sept 2019
8898
RunningRace race = await strava.getRunningRaceById('2724');
8999

90100
// Change of the loggedAthlete in profile
@@ -94,7 +104,7 @@ void example(String secret) async {
94104
Gear gear = await strava.getGearById("b4366285");
95105
// print('error code getGearById ${gear.errorCode}');
96106

97-
Stats stats = await strava.getStats(athlete.id);
107+
Stats stats = await strava.getStats(_athlete.id);
98108

99109
// List<Zone> list = await strava.getLoggedInAthleteZones();
100110

lib/API/Oauth.dart

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'dart:async';
55
import 'dart:io';
66
import 'dart:convert';
77

8+
import 'globals.dart' as globals;
89
import 'constants.dart';
910
import 'token.dart';
1011

@@ -24,6 +25,11 @@ abstract class Auth {
2425
prefs.setInt('expire', expire); // Stored in seconds
2526
prefs.setString('scope', scope);
2627

28+
// Save also in globals to get direct access
29+
globals.token.accessToken = token;
30+
globals.token.scope = scope;
31+
globals.token.expiresAt =expire;
32+
2733
print('token saved!!!');
2834
}
2935

@@ -37,6 +43,11 @@ abstract class Auth {
3743
localToken.accessToken = prefs.getString('token').toString();
3844
localToken.expiresAt = prefs.getInt('expire');
3945
localToken.scope = prefs.getString('scope');
46+
47+
// load the data in globals
48+
globals.token.accessToken =localToken.accessToken;
49+
globals.token.expiresAt =localToken.expiresAt;
50+
globals.token.scope =localToken.scope;
4051
} catch (error) {
4152
print('---> Error getting the key');
4253
localToken.accessToken = null;
@@ -50,14 +61,20 @@ abstract class Auth {
5061
var disp = dateExpired.day.toString() + '/' +
5162
dateExpired.month.toString() + '/' +
5263
dateExpired.hour.toString();
53-
print('---> stored token ${localToken.accessToken} expires: $disp ');
64+
65+
globals.displayInfo('stored token ${localToken.accessToken} expires: $disp ');
5466
}
5567

5668
return (localToken);
5769
}
5870

59-
Map<String, String> createHeader(String token) {
60-
return {'Authorization': 'Bearer $token'};
71+
Map<String, String> createHeader() {
72+
var _token = globals.token;
73+
if (_token != null) {
74+
return {'Authorization': 'Bearer ${_token.accessToken}'};
75+
} else {
76+
return {null: null};
77+
}
6178
}
6279

6380
// Get the code from Strava server
@@ -107,7 +124,12 @@ abstract class Auth {
107124
});
108125
}
109126

110-
// Test purpose only
127+
/// Do Strava Authentication.
128+
///
129+
/// Do not do/show the Strava login if a token has been stored previously
130+
/// and is not expired
131+
/// Do/show the Strava login if the scope has been changed since last storage of the token
132+
/// return true if no problem in authentication has been found
111133
Future<bool> OAuth(
112134
String clientID, String redirectUrl, String scope, String secret) async {
113135
print('Welcome to Oauth');
@@ -118,8 +140,6 @@ abstract class Auth {
118140
final Token tokenStored = await getStoredToken();
119141
final String _token = tokenStored.accessToken;
120142

121-
122-
123143
// Check if the token is not expired
124144
if (_token != "null") {
125145
print('----> token has been stored before! ${tokenStored.accessToken}');
@@ -255,10 +275,10 @@ Future<bool> newAuthorization(
255275

256276
var _token = await getStoredToken();
257277

258-
var header = createHeader(_token.accessToken);
259-
if (header != null) {
278+
var _header = createHeader();
279+
if (_header != null) {
260280
final reqDeAuthorize = "https://www.strava.com/oauth/deauthorize";
261-
var rep = await http.post(reqDeAuthorize, headers: header);
281+
var rep = await http.post(reqDeAuthorize, headers: _header);
262282
if (rep.statusCode == 200) {
263283
print('DeAuthorize done');
264284
await saveToken(null, null, null);

lib/API/constants.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
// Constants.dart
22

3-
enum ErrorCode {
4-
ok,
5-
headerIsEmpty,
6-
tokenIsInvalid,
7-
unknownError,
8-
}
93

104

115

lib/API/globals.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// globals.dart
2+
3+
import 'token.dart';
4+
5+
bool isInDebug = true; // set to true to see debug message in API
6+
7+
Token token = Token();
8+
9+
// To display debug info in Strava API
10+
void displayInfo(String message) {
11+
if (isInDebug) {
12+
var msgToDisplay = '--> Strava_flutter: ' + message;
13+
print(msgToDisplay);
14+
}
15+
16+
}

lib/API/strava.dart

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@ import 'dart:convert';
33
import 'dart:io';
44
import 'dart:async';
55

6-
import 'package:url_launcher/url_launcher.dart';
7-
import 'package:shared_preferences/shared_preferences.dart';
86

9-
// import 'token.dart';
10-
11-
import 'constants.dart';
7+
import '../Models/fault.dart';
128
import '../Models/gear.dart';
139
import '../Models/detailedAthlete.dart';
1410
import '../Models/stats.dart';
@@ -19,6 +15,7 @@ import '../Models/zone.dart';
1915
import '../Models/summaryAthlete.dart';
2016
import '../Models/runningRace.dart';
2117

18+
import 'globals.dart' as globals;
2219
import 'Oauth.dart';
2320
import 'upload.dart';
2421

@@ -33,33 +30,46 @@ class Strava with Upload, Auth {
3330
final String prompt;
3431

3532

33+
34+
/// List of statuscode used by Fault
35+
/// To get info to API caller
36+
/// Should have a nicer to do it in Dart!
37+
final statusOk = 0;
38+
final statusInvalidToken = 1;
39+
final statusUnknownError = 2;
40+
final statusHeaderIsEmpty = 3;
41+
42+
3643
final tokenEndpoint = "https://www.strava.com/oauth/token";
3744
final authorizationEndpoint = "https://www.strava.com/oauth/authorize";
3845

3946
Map<String, String> header; // set in _getStoredToken
4047

48+
4149

4250
/// getRunningRacebyId
4351
///
44-
/// Scope needed:
52+
/// Scope needed: none
4553
///
4654
/// Answer has route_ids [int]
4755
Future<RunningRace> getRunningRaceById(String id) async {
4856
RunningRace returnRace = RunningRace();
4957

50-
if (header != null) {
58+
var _header = createHeader();
59+
60+
if (_header != null) {
5161
final reqRace = 'https://www.strava.com/api/v3/running_races/' + id;
5262

53-
var rep = await http.get(reqRace, headers: header);
63+
var rep = await http.get(reqRace, headers: _header);
5464
if (rep.statusCode == 200) {
55-
print(rep.statusCode);
56-
print('Race info ${rep.body}');
65+
globals.displayInfo(rep.statusCode.toString());
66+
globals.displayInfo('Race info ${rep.body}');
5767
final jsonResponse = json.decode(rep.body);
5868

5969
if (jsonResponse != null) {
6070
returnRace = RunningRace.fromJson(jsonResponse);
6171
} else {
62-
print('problem in getRunningRaceById request');
72+
globals.displayInfo('problem in getRunningRaceById request');
6373
}
6474
}
6575
return returnRace;
@@ -77,8 +87,8 @@ class Strava with Upload, Auth {
7787

7888
var rep = await http.get(reqList, headers: header);
7989
if (rep.statusCode == 200) {
80-
print(rep.statusCode);
81-
print('List races info ${rep.body}');
90+
globals.displayInfo(rep.statusCode.toString());
91+
globals.displayInfo('List races info ${rep.body}');
8292
final jsonResponse = json.decode(rep.body);
8393

8494
if (jsonResponse != null) {
@@ -233,65 +243,73 @@ class Strava with Upload, Auth {
233243

234244
Gear _gear = Gear.fromJson(jsonResponse);
235245
print(_gear.description);
236-
_gear.errorCode = ErrorCode.ok;
246+
// _gear.fault.statusCode = statusOk;
237247
returnGear = _gear;
238248
}
239249
break;
240250

241251
case 401:
242252
{
243-
print('problem in getGearById request');
244-
returnGear.errorCode = ErrorCode.tokenIsInvalid;
253+
254+
// returnGear.errorCode = statusInvalidToken;
245255
}
246256
break;
247257

248258
default:
249259
{
250-
returnGear.errorCode = ErrorCode.unknownError;
260+
// returnGear.errorCode = statusUnknownError;
251261
}
252262
break;
253263
}
254264
} else {
255-
returnGear.errorCode = ErrorCode.headerIsEmpty;
265+
// returnGear.errorCode = statusHeaderIsEmpty;
256266
}
257267

258268
return returnGear;
259269
}
260270

271+
///
272+
/// scope needed: profile:read_all scope
273+
///
274+
/// return: see status value in strava class
261275
Future<DetailedAthlete> getLoggedInAthlete() async {
262276
DetailedAthlete returnAthlete = DetailedAthlete();
263-
if (header != null) {
277+
returnAthlete.fault = Fault(88, '');
278+
279+
var _header = createHeader();
280+
281+
if (_header != null) {
264282
final reqAthlete = "https://www.strava.com/api/v3/athlete";
265-
var rep = await http.get(reqAthlete, headers: header);
283+
var rep = await http.get(reqAthlete, headers: _header);
266284

267285
switch (rep.statusCode) {
268286
case 200:
269287
{
270-
print(rep.statusCode);
271-
print('Athlete info ${rep.body}');
288+
globals.displayInfo(rep.statusCode.toString());
289+
globals.displayInfo('Athlete info ${rep.body}');
272290
final jsonResponse = json.decode(rep.body);
273291

274292
DetailedAthlete _athlete = DetailedAthlete.fromJson(jsonResponse);
275-
print(' athlete ${_athlete.firstname}, ${_athlete.lastname}');
276-
_athlete.errorCode = ErrorCode.ok;
293+
globals.displayInfo(' athlete ${_athlete.firstname}, ${_athlete.lastname}');
294+
_athlete.fault = Fault(statusOk, 'getLoggedInAthlete done');
277295

278296
returnAthlete = _athlete;
279297
}
280298
break;
281299

282300
case 401:
283301
{
284-
returnAthlete.errorCode = ErrorCode.tokenIsInvalid;
302+
returnAthlete.fault = Fault(statusInvalidToken, 'invalid token');
285303

286-
print(
287-
'problem in getLoggedInAthlete request , ${returnAthlete.errorCode} ${rep.body}');
304+
globals.displayInfo(
305+
'problem in getLoggedInAthlete request , ${returnAthlete.fault.statusCode} ${rep.body}');
288306
}
289307
break;
290308

291309
default:
292310
{
293-
returnAthlete.errorCode = ErrorCode.unknownError;
294-
print('problem in getLoggedInAthlete, unknown error');
311+
returnAthlete.fault = Fault(statusUnknownError, 'Unknown Error');
312+
globals.displayInfo('problem in getLoggedInAthlete, unknown error');
295313
}
296314
break;
297315
}
@@ -366,24 +384,24 @@ class Strava with Upload, Auth {
366384

367385
DetailedAthlete _athlete = DetailedAthlete.fromJson(jsonResponse);
368386
print(' athlete ${_athlete.firstname}, ${_athlete.weight}');
369-
_athlete.errorCode = ErrorCode.ok;
387+
_athlete.fault.statusCode = statusOk;
370388

371389
returnAthlete = _athlete;
372390
}
373391
break;
374392

375393
case 401:
376394
{
377-
returnAthlete.errorCode = ErrorCode.tokenIsInvalid;
395+
returnAthlete.fault.statusCode = statusInvalidToken;
378396

379397
print(
380-
'problem in updateLoggedInAthleteequest , ${returnAthlete.errorCode} ${rep.body}');
398+
'problem in updateLoggedInAthleteequest , ${returnAthlete.fault.statusCode} ${rep.body}');
381399
}
382400
break;
383401

384402
default:
385403
{
386-
returnAthlete.errorCode = ErrorCode.unknownError;
404+
returnAthlete.fault.statusCode = statusUnknownError;
387405
print(
388406
'problem in updateLoggedInAthlete, unknown error ${rep.body}');
389407
}

0 commit comments

Comments
 (0)