package com.mathiasluo.designer.model;
import com.mathiasluo.designer.app.APP;
import com.mathiasluo.designer.bean.AccessToken;
import com.mathiasluo.designer.bean.AuthBody;
import com.mathiasluo.designer.bean.User;
import com.mathiasluo.designer.model.IModel.UserModel;
import com.mathiasluo.designer.model.service.ServiceAPI;
import com.mathiasluo.designer.model.service.ServiceAPIModel;
import com.mathiasluo.designer.utils.LogUtils;
import com.mathiasluo.designer.utils.SPUtil;
import io.realm.Realm;
import io.realm.RealmResults;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by MathiasLuo on 2016/3/5.
*/
public class UserModelImpl implements UserModel {
ServiceAPI mServiceAPI;
private UserModelImpl() {
mServiceAPI = ServiceAPIModel.provideServiceAPI(ServiceAPIModel.provideOkHttpClient());
}
public final static UserModel getInstance() {
return UserModelHolder.instance;
}
private final static class UserModelHolder {
private final static UserModel instance = new UserModelImpl();
}
@Override
public Observable<User> getCurrentUser() {
final String accessToken = SPUtil.getAccessToken(APP.getInstance());
if (!accessToken.equals(SPUtil.NOACESSTOKEN)) {
return queryUserFromReaml(accessToken);
} else
return Observable.just(null);
}
@Override
public Observable deleteCurrentUser() {
final String accessToken = SPUtil.getAccessToken(APP.getInstance());
if (!accessToken.equals(SPUtil.NOACESSTOKEN)) {
return queryUserFromReaml(accessToken)
.map(user -> {
Realm mReam = Realm.getDefaultInstance();
mReam.beginTransaction();
user.removeFromRealm();
mReam.commitTransaction();
return user;
});
} else
return null;
}
@Override
public Observable<User> queryUserFromReaml(String accessToken) {
LogUtils.e("accessToken" + accessToken);
return Observable.just(accessToken)
.flatMap(s -> {
Realm mRealm = Realm.getDefaultInstance();
return mRealm.where(User.class)
.equalTo("accessToken", s)
.findAllAsync()
.asObservable()
.flatMap(users ->
Observable.from(users));
});
}
@Override
public Observable<String> Login2GetAccessToken(String athuCode) {
return mServiceAPI
.getAccessToken(new AuthBody(athuCode))
.flatMap(new Func1<AccessToken, Observable<String>>() {
@Override
public Observable<String> call(AccessToken accessToken) {
return Observable.just(accessToken.getAccess_token());
}
});
}
@Override
public Observable<User> getUseWithAccessToken(String accessToken) {
return mServiceAPI.getUserWithAccessToken(accessToken);
}
@Override
public Observable<User> setCurrentUser(User user) {
return Observable.just(user)
.map(new Func1<User, User>() {
@Override
public User call(User user) {
saveUserToReaml(user);
return user;
}
});
}
@Override
public void saveUserToReaml(User user) {
Realm mRealm = Realm.getDefaultInstance();
mRealm.beginTransaction();
mRealm.copyToRealmOrUpdate(user);
mRealm.commitTransaction();
mRealm.close();
}
@Override
public Observable<User> getOtherUser(String username) {
return mServiceAPI.getUserInfo(username);
}
}