package com.fastaccess.data.dao.model; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import com.annimon.stream.LongStream; import com.annimon.stream.Stream; import com.fastaccess.App; import com.fastaccess.data.dao.FilesListModel; import com.fastaccess.data.dao.GithubFileModel; import com.fastaccess.data.dao.converters.GitHubFilesConverter; import com.fastaccess.data.dao.converters.UserConverter; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.RxHelper; import com.fastaccess.ui.widgets.SpannableBuilder; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; import java.util.Date; import java.util.List; import io.requery.Column; import io.requery.Convert; import io.requery.Entity; import io.requery.Key; import io.requery.Persistable; import io.requery.rx.SingleEntityStore; import lombok.NoArgsConstructor; import rx.Observable; import rx.Single; /** * Created by Kosh on 16 Mar 2017, 7:32 PM */ @Entity @NoArgsConstructor public abstract class AbstractGist implements Parcelable { @SerializedName("nooope") @Key long id; String url; String forksUrl; String commitsUrl; String gitPullUrl; String gitPushUrl; String htmlUrl; boolean publicX; Date createdAt; Date updatedAt; String description; int comments; String commentsUrl; boolean truncated; String ownerName; @SerializedName("id") String gistId; @Convert(GitHubFilesConverter.class) GithubFileModel files; @Column(name = "user_column") @Convert(UserConverter.class) User user; @Convert(UserConverter.class) User owner; public Single save(Gist modelEntity) { return App.getInstance().getDataStore() .delete(Gist.class) .where(Gist.ID.eq(modelEntity.getId())) .get() .toSingle() .flatMap(integer -> App.getInstance().getDataStore().insert(modelEntity)); } public static Observable save(@NonNull List<Gist> gists) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(Gist.class) .where(Gist.OWNER_NAME.isNull()) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(gists)) .flatMap(gist -> singleEntityStore.insert(gist).toObservable())); } public static Observable save(@NonNull List<Gist> gists, @NonNull String ownerName) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(Gist.class) .where(Gist.OWNER_NAME.equal(ownerName)) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(gists)) .flatMap(gist -> { gist.setOwnerName(ownerName); return gist.save(gist).toObservable(); })); } @NonNull public static Observable<List<Gist>> getMyGists(@NonNull String ownerName) { return App.getInstance() .getDataStore() .select(Gist.class) .where(Gist.OWNER_NAME.equal(ownerName)) .get() .toObservable() .toList(); } @NonNull public static Observable<List<Gist>> getGists() { return App.getInstance() .getDataStore() .select(Gist.class) .where(Gist.OWNER_NAME.isNull()) .get() .toObservable() .toList(); } public static Observable<Gist> getGist(@NonNull String gistId) { return App.getInstance() .getDataStore() .select(Gist.class) .where(Gist.GIST_ID.eq(gistId)) .get() .toObservable(); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AbstractGist that = (AbstractGist) o; return url != null ? url.equals(that.url) : that.url == null; } @Override public int hashCode() { return url != null ? url.hashCode() : 0; } @NonNull public List<FilesListModel> getFilesAsList() { List<FilesListModel> models = new ArrayList<>(); if (files != null) { models.addAll(files.values()); } return models; } @NonNull public SpannableBuilder getDisplayTitle(boolean isFromProfile) { return getDisplayTitle(isFromProfile, false); } @NonNull public SpannableBuilder getDisplayTitle(boolean isFromProfile, boolean gistView) { SpannableBuilder spannableBuilder = SpannableBuilder.builder(); boolean addDescription = true; if (!isFromProfile) { if (owner != null) { spannableBuilder.bold(owner.getLogin()); } else if (user != null) { spannableBuilder.bold(user.getLogin()); } else { spannableBuilder.bold("Anonymous"); } if (!gistView) { List<FilesListModel> files = getFilesAsList(); if (!files.isEmpty()) { FilesListModel filesListModel = files.get(0); if (!InputHelper.isEmpty(filesListModel.getFilename()) && filesListModel.getFilename().trim().length() > 2) { spannableBuilder.append(" ").append("/").append(" ") .append(filesListModel.getFilename()); addDescription = false; } } } } if (!InputHelper.isEmpty(description) && addDescription) { if (!InputHelper.isEmpty(spannableBuilder.toString())) { spannableBuilder.append(" ").append("/").append(" "); } spannableBuilder.append(description); } if (InputHelper.isEmpty(spannableBuilder.toString())) { if (isFromProfile) spannableBuilder.bold("N/A"); } return spannableBuilder; } public long getSize() { List<FilesListModel> models = getFilesAsList(); if (!models.isEmpty()) { return Stream.of(models).flatMapToLong(filesListModel -> LongStream.of(filesListModel.getSize())).sum(); } return 0; } @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.forksUrl); dest.writeString(this.commitsUrl); dest.writeString(this.gitPullUrl); dest.writeString(this.gitPushUrl); dest.writeString(this.htmlUrl); dest.writeByte(this.publicX ? (byte) 1 : (byte) 0); dest.writeLong(this.createdAt != null ? this.createdAt.getTime() : -1); dest.writeLong(this.updatedAt != null ? this.updatedAt.getTime() : -1); dest.writeString(this.description); dest.writeInt(this.comments); dest.writeString(this.commentsUrl); dest.writeByte(this.truncated ? (byte) 1 : (byte) 0); dest.writeString(this.ownerName); dest.writeString(this.gistId); dest.writeSerializable(this.files); dest.writeParcelable(this.user, flags); dest.writeParcelable(this.owner, flags); } protected AbstractGist(Parcel in) { this.id = in.readLong(); this.url = in.readString(); this.forksUrl = in.readString(); this.commitsUrl = in.readString(); this.gitPullUrl = in.readString(); this.gitPushUrl = in.readString(); this.htmlUrl = in.readString(); this.publicX = in.readByte() != 0; 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.description = in.readString(); this.comments = in.readInt(); this.commentsUrl = in.readString(); this.truncated = in.readByte() != 0; this.ownerName = in.readString(); this.gistId = in.readString(); this.files = (GithubFileModel) in.readSerializable(); this.user = in.readParcelable(User.class.getClassLoader()); this.owner = in.readParcelable(User.class.getClassLoader()); } public static final Creator<Gist> CREATOR = new Creator<Gist>() { @Override public Gist createFromParcel(Parcel source) {return new Gist(source);} @Override public Gist[] newArray(int size) {return new Gist[size];} }; }