package com.fastaccess.data.dao.model; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.fastaccess.App; import com.fastaccess.helper.RxHelper; import java.util.Date; import java.util.List; import io.requery.Column; import io.requery.Entity; import io.requery.Key; import io.requery.Persistable; import io.requery.Table; import io.requery.rx.SingleEntityStore; import lombok.NoArgsConstructor; import rx.Observable; import rx.Single; import static com.fastaccess.data.dao.model.User.FOLLOWER_NAME; import static com.fastaccess.data.dao.model.User.FOLLOWING_NAME; import static com.fastaccess.data.dao.model.User.ID; import static com.fastaccess.data.dao.model.User.LOGIN; import static com.fastaccess.data.dao.model.User.REPO_ID; /** * Created by Kosh on 16 Mar 2017, 7:55 PM */ @Entity @NoArgsConstructor @Table(name = "user_table") public abstract class AbstractUser implements Parcelable { @Key long id; String login; String avatarUrl; String gravatarId; String url; String htmlUrl; String followersUrl; String followingUrl; String gistsUrl; String starredUrl; String subscriptionsUrl; String organizationsUrl; String reposUrl; String eventsUrl; String receivedEventsUrl; String type; boolean siteAdmin; String name; String company; String blog; String location; String email; boolean hireable; String bio; long publicRepos; long publicGists; long followers; long following; Date createdAt; Date updatedAt; int contributions; String followingName; String followerName; @Column(name = "date_column") Date date; String repoId; String description; public void save(User entity) { if (getUser(entity.getId()) != null) { App.getInstance().getDataStore().update(entity).toBlocking().value(); } else { App.getInstance().getDataStore().insert(entity).toBlocking().value(); } } protected Single saveAsSingle(User user) { return App.getInstance().getDataStore() .delete(User.class) .where(LOGIN.eq(user.getLogin())) .get() .toSingle() .flatMap(aVoid -> App.getInstance().getDataStore().insert(user)); } @Nullable public static User getUser(String login) { return App.getInstance().getDataStore() .select(User.class) .where(LOGIN.eq(login)) .get() .firstOrNull(); } @Nullable public static User getUser(long id) { return App.getInstance().getDataStore() .select(User.class) .where(ID.eq(id)) .get() .firstOrNull(); } public static Observable saveUserFollowerList(@NonNull List<User> models, @NonNull String followingName) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(User.class) .where(FOLLOWING_NAME.eq(followingName)) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(models)) .flatMap(userModel -> { userModel.setFollowingName(followingName); return userModel.saveAsSingle(userModel).toObservable(); })); } public static Observable saveUserFollowingList(@NonNull List<User> models, @NonNull String followerName) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(User.class) .where(FOLLOWER_NAME.eq(followerName)) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(models)) .flatMap(userModel -> { userModel.setFollowerName(followerName); return userModel.saveAsSingle(userModel).toObservable(); })); } public static Observable saveUserContributorList(@NonNull List<User> models, @NonNull String repoId) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(User.class) .where(REPO_ID.eq(repoId)) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(models)) .flatMap(userModel -> { userModel.setRepoId(repoId); return userModel.saveAsSingle(userModel).toObservable(); })); } @NonNull public static Observable<List<User>> getUserFollowerList(@NonNull String following) { return App.getInstance().getDataStore() .select(User.class) .where(FOLLOWING_NAME.eq(following)) .get() .toObservable() .toList(); } @NonNull public static Observable<List<User>> getUserFollowingList(@NonNull String follower) { return App.getInstance().getDataStore() .select(User.class) .where(FOLLOWER_NAME.eq(follower)) .get() .toObservable() .toList(); } @NonNull public static Observable<List<User>> getUserContributorList(@NonNull String repoId) { return App.getInstance().getDataStore() .select(User.class) .where(REPO_ID.eq(repoId)) .get() .toObservable() .toList(); } public boolean isOrganizationType() { return type != null && type.equalsIgnoreCase("Organization"); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeLong(this.id); dest.writeString(this.login); dest.writeString(this.avatarUrl); dest.writeString(this.gravatarId); dest.writeString(this.url); dest.writeString(this.htmlUrl); dest.writeString(this.followersUrl); dest.writeString(this.followingUrl); dest.writeString(this.gistsUrl); dest.writeString(this.starredUrl); dest.writeString(this.subscriptionsUrl); dest.writeString(this.organizationsUrl); dest.writeString(this.reposUrl); dest.writeString(this.eventsUrl); dest.writeString(this.receivedEventsUrl); dest.writeString(this.type); dest.writeByte(this.siteAdmin ? (byte) 1 : (byte) 0); dest.writeString(this.name); dest.writeString(this.company); dest.writeString(this.blog); dest.writeString(this.location); dest.writeString(this.email); dest.writeByte(this.hireable ? (byte) 1 : (byte) 0); dest.writeString(this.bio); dest.writeLong(this.publicRepos); dest.writeLong(this.publicGists); dest.writeLong(this.followers); dest.writeLong(this.following); dest.writeLong(this.createdAt != null ? this.createdAt.getTime() : -1); dest.writeLong(this.updatedAt != null ? this.updatedAt.getTime() : -1); dest.writeInt(this.contributions); dest.writeString(this.followingName); dest.writeString(this.followerName); dest.writeLong(this.date != null ? this.date.getTime() : -1); dest.writeString(this.repoId); dest.writeString(this.description); } protected AbstractUser(Parcel in) { this.id = in.readLong(); this.login = in.readString(); this.avatarUrl = in.readString(); this.gravatarId = in.readString(); this.url = in.readString(); this.htmlUrl = in.readString(); this.followersUrl = in.readString(); this.followingUrl = in.readString(); this.gistsUrl = in.readString(); this.starredUrl = in.readString(); this.subscriptionsUrl = in.readString(); this.organizationsUrl = in.readString(); this.reposUrl = in.readString(); this.eventsUrl = in.readString(); this.receivedEventsUrl = in.readString(); this.type = in.readString(); this.siteAdmin = in.readByte() != 0; this.name = in.readString(); this.company = in.readString(); this.blog = in.readString(); this.location = in.readString(); this.email = in.readString(); this.hireable = in.readByte() != 0; this.bio = in.readString(); this.publicRepos = in.readLong(); this.publicGists = in.readLong(); this.followers = in.readLong(); this.following = in.readLong(); long tmpCreatedAt = in.readLong(); this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt); long tmpUpdatedAt = in.readLong(); this.updatedAt = tmpUpdatedAt == -1 ? null : new Date(tmpUpdatedAt); this.contributions = in.readInt(); this.followingName = in.readString(); this.followerName = in.readString(); long tmpDate = in.readLong(); this.date = tmpDate == -1 ? null : new Date(tmpDate); this.repoId = in.readString(); this.description = in.readString(); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel source) {return new User(source);} @Override public User[] newArray(int size) {return new User[size];} }; }