package com.fastaccess.data.dao.model; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import com.fastaccess.App; import com.fastaccess.data.dao.ReleasesAssetsListModel; import com.fastaccess.data.dao.converters.ReleasesAssetsConverter; import com.fastaccess.data.dao.converters.UserConverter; import com.fastaccess.helper.RxHelper; import com.google.gson.annotations.SerializedName; import java.util.Date; import java.util.List; import io.requery.Convert; 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.Completable; import rx.Observable; import rx.Single; import static com.fastaccess.data.dao.model.Release.CREATED_AT; import static com.fastaccess.data.dao.model.Release.ID; import static com.fastaccess.data.dao.model.Release.LOGIN; import static com.fastaccess.data.dao.model.Release.REPO_ID; /** * Created by Kosh on 16 Mar 2017, 7:40 PM */ @Entity @NoArgsConstructor @Table(name = "release_table") public abstract class AbstractRelease implements Parcelable { @Key long id; String url; String htmlUrl; String assetsUrl; String uploadUrl; String tagName; String targetCommitish; String name; boolean draft; boolean preRelease; Date createdAt; Date publishedAt; String repoId; String login; @SerializedName("tarball_url") String tarballUrl; @SerializedName("body_html") String body; @SerializedName("zipball_url") String zipBallUrl; @Convert(UserConverter.class) User author; @Convert(ReleasesAssetsConverter.class) ReleasesAssetsListModel assets; public Single save(Release entity) { return App.getInstance().getDataStore() .delete(Release.class) .where(ID.eq(entity.getId())) .get() .toSingle() .flatMap(i -> App.getInstance().getDataStore().insert(entity)); } public static Observable save(@NonNull List<Release> models, @NonNull String repoId, @NonNull String login) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(Release.class) .where(REPO_ID.eq(login)) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(models)) .flatMap(releasesModel -> { releasesModel.setRepoId(repoId); releasesModel.setLogin(login); return releasesModel.save(releasesModel).toObservable(); })); } public static Completable delete(@NonNull String repoId, @NonNull String login) { return App.getInstance().getDataStore() .delete(Release.class) .where(REPO_ID.eq(repoId) .and(LOGIN.eq(login))) .get() .toSingle() .toCompletable(); } public static Observable<Release> get(long id) { return App.getInstance().getDataStore() .select(Release.class) .where(ID.eq(id)) .get() .toObservable(); } public static Observable<List<Release>> get(@NonNull String repoId, @NonNull String login) { return App.getInstance().getDataStore() .select(Release.class) .where(REPO_ID.eq(repoId) .and(LOGIN.eq(login))) .orderBy(CREATED_AT.desc()) .get() .toObservable() .toList(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeLong(this.id); dest.writeString(this.url); dest.writeString(this.htmlUrl); dest.writeString(this.assetsUrl); dest.writeString(this.uploadUrl); dest.writeString(this.tagName); dest.writeString(this.targetCommitish); dest.writeString(this.name); dest.writeByte(this.draft ? (byte) 1 : (byte) 0); dest.writeByte(this.preRelease ? (byte) 1 : (byte) 0); dest.writeLong(this.createdAt != null ? this.createdAt.getTime() : -1); dest.writeLong(this.publishedAt != null ? this.publishedAt.getTime() : -1); dest.writeString(this.repoId); dest.writeString(this.login); dest.writeString(this.tarballUrl); dest.writeString(this.body); dest.writeString(this.zipBallUrl); dest.writeParcelable(this.author, flags); dest.writeList(this.assets); } protected AbstractRelease(Parcel in) { this.id = in.readLong(); this.url = in.readString(); this.htmlUrl = in.readString(); this.assetsUrl = in.readString(); this.uploadUrl = in.readString(); this.tagName = in.readString(); this.targetCommitish = in.readString(); this.name = in.readString(); this.draft = in.readByte() != 0; this.preRelease = in.readByte() != 0; long tmpCreatedAt = in.readLong(); this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt); long tmpPublishedAt = in.readLong(); this.publishedAt = tmpPublishedAt == -1 ? null : new Date(tmpPublishedAt); this.repoId = in.readString(); this.login = in.readString(); this.tarballUrl = in.readString(); this.body = in.readString(); this.zipBallUrl = in.readString(); this.author = in.readParcelable(User.class.getClassLoader()); this.assets = new ReleasesAssetsListModel(); in.readList(this.assets, this.assets.getClass().getClassLoader()); } public static final Creator<Release> CREATOR = new Creator<Release>() { @Override public Release createFromParcel(Parcel source) {return new Release(source);} @Override public Release[] newArray(int size) {return new Release[size];} }; }