validateUserToken static method

Future<Result<String>> validateUserToken()

Implementation

static Future<Result<String>> validateUserToken() async {
  final result = await checkKwikpassHealth();
  if(result.isSuccess) {
    final healthData = result.getDataOrThrow();
    if(healthData?.isKwikpassHealthy == false){
      throw Exception('Kwikpass is unhealthy');
    }
  }

  try {
    final gokwik = DioClient().getClient();

    final results = await Future.wait([
      cacheInstance.getValue(cdnConfigInstance.getKeys(StorageKeyKeys.gkAccessTokenKey)!),
      cacheInstance.getValue(cdnConfigInstance.getKeys(StorageKeyKeys.checkoutAccessTokenKey)!),
    ]);

    final accessToken = results[0];
    final checkoutAccessToken = results[1];

    if (accessToken != null) {
      gokwik.options.headers[cdnConfigInstance.getHeader(APIHeaderKeys.gkAccessToken)!] = accessToken;
    }
    if (checkoutAccessToken != null) {
      gokwik.options.headers[cdnConfigInstance.getHeader(APIHeaderKeys.checkoutAccessToken)!] =
          checkoutAccessToken;
    }

    final response = (await gokwik.get(cdnConfigInstance.getEndpoint(APIEndpointKeys.validateUserToken)!))
        .toBaseResponse<ValidateUserTokenResponseData>(
      fromJson: (json) {
        // if (json == null) {
        //   throw Exception('Response data is null');
        // }
        return ValidateUserTokenResponseData.fromJson(json);
      },
    );

    if (response.isSuccess == false) {
      return Failure(response.errorMessage ?? 'Failed to validate token');
    }

    if (response.data == null) {
      return const Failure('No data received from validate token response');
    }

    try {
      final responseData = jsonEncode(response.data);

      await cacheInstance.setValue(
        cdnConfigInstance.getKeys(StorageKeyKeys.gkVerifiedUserKey)!,
        responseData,
      );

      return Success(responseData);
    } catch (e) {
      return Failure('Error parsing validate token response: $e');
    }
  } catch (err) {
    throw handleApiError(err);
  }
}