generate method Null safety

  1. @override
Future<Token> generate()
override

generate and persist the OAuth2 refresh token from a single use auth code

Implementation

@override
Future<Token> generate() async {
  final OAuthClient oAuthClient = OAuthClient(dio);

  final tokenFile = File('${Util.userHome}/.yt/.refreshToken.json');

  final tokenFileExits = tokenFile.existsSync();

  if (tokenFileExits && refresh) tokenFile.deleteSync();

  final tokenStore = <String, dynamic>{};

  String? refreshToken;

  if (tokenFileExits) {
    tokenStore.addAll(json.decode(tokenFile.readAsStringSync()));
  }

  if (tokenStore.containsKey(oauthCredentials.identifier)) {
    refreshToken = tokenStore[oauthCredentials.identifier];
  } else {
    try {
      final token = await oAuthClient.getToken({
        'client_id': oauthCredentials.identifier,
        'client_secret': oauthCredentials.secret,
        'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob',
        'grant_type': 'authorization_code'
      });

      if (token.refreshToken == null) {
        throw Exception('Could not retrieve the refresh token');
      }

      refreshToken = token.refreshToken!;
    } on DioError catch (err) {
      throw AuthorizationException(err.response.toString(), err);
    }

    tokenStore[oauthCredentials.identifier] = refreshToken;

    tokenFile.writeAsStringSync(json.encode(tokenStore));
  }

  try {
    final token = await oAuthClient.getToken({
      'client_id': oauthCredentials.identifier,
      'client_secret': oauthCredentials.secret,
      'refresh_token': refreshToken,
      'grant_type': 'refresh_token'
    });

    return token;
  } on DioError catch (err) {
    throw Exception(err.response?.data);
  }
}