blob: 28211ab5203feb35bf0e3f7492789e247abd190f [file] [log] [blame]
package org.apache.fineract.data.datamanager;
import org.apache.fineract.data.local.PreferenceKey;
import org.apache.fineract.data.local.PreferencesHelper;
import org.apache.fineract.data.models.Authentication;
import org.apache.fineract.exceptions.ExceptionStatusCode;
import io.reactivex.Completable;
import io.reactivex.CompletableSource;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.functions.Function;
/**
* @author Rajan Maurya
* On 20/08/17.
*/
public class MifosBaseDataManager {
private DataManagerAuth dataManagerAuth;
private PreferencesHelper preferencesHelper;
public MifosBaseDataManager(DataManagerAuth dataManagerAuth,
PreferencesHelper preferencesHelper) {
this.dataManagerAuth = dataManagerAuth;
this.preferencesHelper = preferencesHelper;
}
public <T> Observable<T> authenticatedObservableApi(Observable<T> observable) {
return observable.onErrorResumeNext(refreshTokenAndRetryObser(observable));
}
public Completable authenticatedCompletableApi(Completable completable) {
return completable.onErrorResumeNext(refreshTokenAndRetryCompletable(completable));
}
public <T> Function<Throwable, ? extends Observable<? extends T>> refreshTokenAndRetryObser(
final Observable<T> toBeResumed) {
return new Function<Throwable, Observable<? extends T>>() {
@Override
public Observable<? extends T> apply(Throwable throwable) throws Exception {
// Here check if the error thrown really is a 403
if (ExceptionStatusCode.isHttp403Error(throwable)) {
preferencesHelper.putBoolean(PreferenceKey.PREF_KEY_REFRESH_ACCESS_TOKEN, true);
return dataManagerAuth.refreshToken().concatMap(new Function<Authentication,
ObservableSource<? extends T>>() {
@Override
public ObservableSource<? extends T> apply(
Authentication authentication) throws Exception {
preferencesHelper.putBoolean(
PreferenceKey.PREF_KEY_REFRESH_ACCESS_TOKEN, false);
preferencesHelper.putAccessToken(
authentication.getAccessToken());
preferencesHelper.putSignInUser(authentication);
return toBeResumed;
}
});
}
// re-throw this error because it's not recoverable from here
return Observable.error(throwable);
}
};
}
public Function<Throwable, ? extends CompletableSource> refreshTokenAndRetryCompletable(
final Completable toBeResumed) {
return new Function<Throwable, CompletableSource>() {
@Override
public CompletableSource apply(Throwable throwable) throws Exception {
// Here check if the error thrown really is a 403
if (ExceptionStatusCode.isHttp403Error(throwable)) {
preferencesHelper.putBoolean(PreferenceKey.PREF_KEY_REFRESH_ACCESS_TOKEN, true);
return dataManagerAuth.refreshToken().flatMapCompletable(
new Function<Authentication, CompletableSource>() {
@Override
public CompletableSource apply(Authentication authentication)
throws Exception {
preferencesHelper.putBoolean(
PreferenceKey.PREF_KEY_REFRESH_ACCESS_TOKEN, false);
preferencesHelper.putAccessToken(
authentication.getAccessToken());
preferencesHelper.putSignInUser(authentication);
return toBeResumed;
}
});
}
// re-throw this error because it's not recoverable from here
return Completable.error(throwable);
}
};
}
}