package com.truckmuncher.app.data.sync;
import com.truckmuncher.api.auth.AuthRequest;
import com.truckmuncher.api.auth.AuthResponse;
import com.truckmuncher.api.auth.AuthService;
import com.truckmuncher.app.authentication.SessionTokenPreference;
import com.truckmuncher.app.authentication.UserAccount;
import com.truckmuncher.app.data.ApiException;
import com.truckmuncher.app.data.ExpiredSessionException;
import com.truckmuncher.app.data.SocialCredentialsException;
import javax.inject.Inject;
import retrofit.RetrofitError;
import timber.log.Timber;
public class ApiExceptionResolver {
private final AuthService authService;
private final SessionTokenPreference sessionTokenPreference;
private final UserAccount userAccount;
@Inject
public ApiExceptionResolver(AuthService authService, SessionTokenPreference sessionTokenPreference, UserAccount userAccount) {
this.authService = authService;
this.sessionTokenPreference = sessionTokenPreference;
this.userAccount = userAccount;
}
public ApiResult resolve(ApiException exception) {
if (exception instanceof ExpiredSessionException) {
return handleExpiredSessionException();
} else if (exception instanceof SocialCredentialsException) {
return ApiResult.NEEDS_USER_INPUT;
} else {
Throwable t = exception.getCause();
if (t instanceof RetrofitError) {
RetrofitError error = (RetrofitError) t;
switch (error.getKind()) {
case NETWORK:
return ApiResult.TEMPORARY_ERROR;
case CONVERSION:
return ApiResult.PERMANENT_ERROR;
default:
// If it was a server error, we either handle it elsewhere or a repeat request won't make a difference.
Timber.e(exception, "Got an unknown %s", RetrofitError.class.getSimpleName());
return ApiResult.PERMANENT_ERROR;
}
}
Timber.e(exception, "Got an unknown exception");
return ApiResult.PERMANENT_ERROR;
}
}
private ApiResult handleExpiredSessionException() {
try {
AuthResponse response = authService.getAuth(new AuthRequest());
sessionTokenPreference.set(response.sessionToken);
userAccount.setUserId(response.userId);
return ApiResult.SHOULD_RETRY;
} catch (SocialCredentialsException e) {
return resolve(e);
}
}
}