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.LicenseModel;
import com.fastaccess.data.dao.RepoPermissionsModel;
import com.fastaccess.data.dao.TopicsModel;
import com.fastaccess.data.dao.converters.LicenseConverter;
import com.fastaccess.data.dao.converters.RepoConverter;
import com.fastaccess.data.dao.converters.RepoPermissionConverter;
import com.fastaccess.data.dao.converters.TopicsConverter;
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.Column;
import io.requery.Convert;
import io.requery.Entity;
import io.requery.Key;
import io.requery.Nullable;
import io.requery.Persistable;
import io.requery.rx.SingleEntityStore;
import lombok.NoArgsConstructor;
import rx.Observable;
import rx.Single;
import static com.fastaccess.data.dao.model.Repo.FULL_NAME;
import static com.fastaccess.data.dao.model.Repo.ID;
import static com.fastaccess.data.dao.model.Repo.REPOS_OWNER;
import static com.fastaccess.data.dao.model.Repo.STARRED_USER;
import static com.fastaccess.data.dao.model.Repo.UPDATED_AT;
/**
* Created by Kosh on 16 Mar 2017, 7:54 PM
*/
@Entity @NoArgsConstructor public abstract class AbstractRepo implements Parcelable {
@Key long id;
String name;
String fullName;
@SerializedName("private") boolean privateX;
String htmlUrl;
String description;
boolean fork;
String url;
String forksUrl;
String keysUrl;
String collaboratorsUrl;
String teamsUrl;
String hooksUrl;
String issueEventsUrl;
String eventsUrl;
String assigneesUrl;
String branchesUrl;
String tagsUrl;
String blobsUrl;
String gitTagsUrl;
String gitRefsUrl;
String treesUrl;
String statusesUrl;
String languagesUrl;
String stargazersUrl;
String contributorsUrl;
String subscribersUrl;
String subscriptionUrl;
String commitsUrl;
String gitCommitsUrl;
String commentsUrl;
String issueCommentUrl;
String contentsUrl;
String compareUrl;
String mergesUrl;
String archiveUrl;
String downloadsUrl;
String issuesUrl;
String pullsUrl;
String milestonesUrl;
String notificationsUrl;
String labelsUrl;
String releasesUrl;
Date createdAt;
Date updatedAt;
Date pushedAt;
String gitUrl;
String sshUrl;
String cloneUrl;
String svnUrl;
String homepage;
long size;
long stargazersCount;
long watchersCount;
@Column(name = "language_column") String language;
boolean hasIssues;
boolean hasDownloads;
boolean hasWiki;
boolean hasPages;
long forksCount;
String mirrorUrl;
long openIssuesCount;
long forks;
long openIssues;
long watchers;
String defaultBranch;
@Nullable @Convert(TopicsConverter.class) TopicsModel topics;
@Convert(UserConverter.class) User owner;
@Convert(RepoPermissionConverter.class) RepoPermissionsModel permissions;
@Convert(UserConverter.class) User organization;
@Convert(RepoConverter.class) Repo parent;
@Convert(RepoConverter.class) Repo source;
@Convert(LicenseConverter.class) LicenseModel license;
@SerializedName("subscribers_count") int subsCount;
int networkCount;
String starredUser;
String reposOwner;
public Single save(@NonNull Repo entity) {
return App.getInstance().getDataStore().delete(Repo.class)
.where(ID.eq(entity.getId()))
.get()
.toSingle()
.flatMap(i -> App.getInstance().getDataStore().insert(entity));
}
public static Observable<Repo> getRepo(@NonNull String name, @NonNull String login) {
return App.getInstance().getDataStore()
.select(Repo.class)
.where(FULL_NAME.eq(login + "/" + name))
.get()
.toObservable();
}
public static Repo getRepo(long id) {
return App.getInstance().getDataStore()
.select(Repo.class)
.where(ID.eq(id))
.get()
.firstOrNull();
}
public static Observable saveStarred(@NonNull List<Repo> models, @NonNull String starredUser) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return RxHelper.safeObservable(singleEntityStore.delete(Repo.class)
.where(STARRED_USER.eq(starredUser))
.get()
.toSingle()
.toObservable()
.flatMap(integer -> Observable.from(models))
.flatMap(repo -> {
repo.setStarredUser(starredUser);
return repo.save(repo).toObservable();
}));
}
public static Observable saveMyRepos(@NonNull List<Repo> models, @NonNull String reposOwner) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return RxHelper.safeObservable(singleEntityStore.delete(Repo.class)
.where(REPOS_OWNER.eq(reposOwner))
.get()
.toSingle()
.toObservable()
.flatMap(integer -> Observable.from(models))
.flatMap(repo -> {
repo.setReposOwner(reposOwner);
return repo.save(repo).toObservable();
}));
}
public static Observable<List<Repo>> getStarred(@NonNull String starredUser) {
return App.getInstance().getDataStore()
.select(Repo.class)
.where(STARRED_USER.eq(starredUser))
.orderBy(UPDATED_AT.desc())
.get()
.toObservable()
.toList();
}
public static Observable<List<Repo>> getMyRepos(@NonNull String reposOwner) {
return App.getInstance().getDataStore()
.select(Repo.class)
.where(REPOS_OWNER.eq(reposOwner))
.orderBy(UPDATED_AT.desc())
.get()
.toObservable()
.toList();
}
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractRepo that = (AbstractRepo) o;
return id == that.id;
}
@Override public int hashCode() {
return (int) (id ^ (id >>> 32));
}
@Override public int describeContents() { return 0; }
@Override public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(this.id);
dest.writeString(this.name);
dest.writeString(this.fullName);
dest.writeByte(this.privateX ? (byte) 1 : (byte) 0);
dest.writeString(this.htmlUrl);
dest.writeString(this.description);
dest.writeByte(this.fork ? (byte) 1 : (byte) 0);
dest.writeString(this.url);
dest.writeString(this.forksUrl);
dest.writeString(this.keysUrl);
dest.writeString(this.collaboratorsUrl);
dest.writeString(this.teamsUrl);
dest.writeString(this.hooksUrl);
dest.writeString(this.issueEventsUrl);
dest.writeString(this.eventsUrl);
dest.writeString(this.assigneesUrl);
dest.writeString(this.branchesUrl);
dest.writeString(this.tagsUrl);
dest.writeString(this.blobsUrl);
dest.writeString(this.gitTagsUrl);
dest.writeString(this.gitRefsUrl);
dest.writeString(this.treesUrl);
dest.writeString(this.statusesUrl);
dest.writeString(this.languagesUrl);
dest.writeString(this.stargazersUrl);
dest.writeString(this.contributorsUrl);
dest.writeString(this.subscribersUrl);
dest.writeString(this.subscriptionUrl);
dest.writeString(this.commitsUrl);
dest.writeString(this.gitCommitsUrl);
dest.writeString(this.commentsUrl);
dest.writeString(this.issueCommentUrl);
dest.writeString(this.contentsUrl);
dest.writeString(this.compareUrl);
dest.writeString(this.mergesUrl);
dest.writeString(this.archiveUrl);
dest.writeString(this.downloadsUrl);
dest.writeString(this.issuesUrl);
dest.writeString(this.pullsUrl);
dest.writeString(this.milestonesUrl);
dest.writeString(this.notificationsUrl);
dest.writeString(this.labelsUrl);
dest.writeString(this.releasesUrl);
dest.writeLong(this.createdAt != null ? this.createdAt.getTime() : -1);
dest.writeLong(this.updatedAt != null ? this.updatedAt.getTime() : -1);
dest.writeLong(this.pushedAt != null ? this.pushedAt.getTime() : -1);
dest.writeString(this.gitUrl);
dest.writeString(this.sshUrl);
dest.writeString(this.cloneUrl);
dest.writeString(this.svnUrl);
dest.writeString(this.homepage);
dest.writeLong(this.size);
dest.writeLong(this.stargazersCount);
dest.writeLong(this.watchersCount);
dest.writeString(this.language);
dest.writeByte(this.hasIssues ? (byte) 1 : (byte) 0);
dest.writeByte(this.hasDownloads ? (byte) 1 : (byte) 0);
dest.writeByte(this.hasWiki ? (byte) 1 : (byte) 0);
dest.writeByte(this.hasPages ? (byte) 1 : (byte) 0);
dest.writeLong(this.forksCount);
dest.writeString(this.mirrorUrl);
dest.writeLong(this.openIssuesCount);
dest.writeLong(this.forks);
dest.writeLong(this.openIssues);
dest.writeLong(this.watchers);
dest.writeString(this.defaultBranch);
dest.writeList(this.topics);
dest.writeParcelable(this.owner, flags);
dest.writeParcelable(this.permissions, flags);
dest.writeParcelable(this.organization, flags);
dest.writeParcelable(this.parent, flags);
dest.writeParcelable(this.source, flags);
dest.writeParcelable(this.license, flags);
dest.writeInt(this.subsCount);
dest.writeInt(this.networkCount);
dest.writeString(this.starredUser);
dest.writeString(this.reposOwner);
}
protected AbstractRepo(Parcel in) {
this.id = in.readLong();
this.name = in.readString();
this.fullName = in.readString();
this.privateX = in.readByte() != 0;
this.htmlUrl = in.readString();
this.description = in.readString();
this.fork = in.readByte() != 0;
this.url = in.readString();
this.forksUrl = in.readString();
this.keysUrl = in.readString();
this.collaboratorsUrl = in.readString();
this.teamsUrl = in.readString();
this.hooksUrl = in.readString();
this.issueEventsUrl = in.readString();
this.eventsUrl = in.readString();
this.assigneesUrl = in.readString();
this.branchesUrl = in.readString();
this.tagsUrl = in.readString();
this.blobsUrl = in.readString();
this.gitTagsUrl = in.readString();
this.gitRefsUrl = in.readString();
this.treesUrl = in.readString();
this.statusesUrl = in.readString();
this.languagesUrl = in.readString();
this.stargazersUrl = in.readString();
this.contributorsUrl = in.readString();
this.subscribersUrl = in.readString();
this.subscriptionUrl = in.readString();
this.commitsUrl = in.readString();
this.gitCommitsUrl = in.readString();
this.commentsUrl = in.readString();
this.issueCommentUrl = in.readString();
this.contentsUrl = in.readString();
this.compareUrl = in.readString();
this.mergesUrl = in.readString();
this.archiveUrl = in.readString();
this.downloadsUrl = in.readString();
this.issuesUrl = in.readString();
this.pullsUrl = in.readString();
this.milestonesUrl = in.readString();
this.notificationsUrl = in.readString();
this.labelsUrl = in.readString();
this.releasesUrl = in.readString();
long tmpCreatedAt = in.readLong();
this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt);
long tmpUpdatedAt = in.readLong();
this.updatedAt = tmpUpdatedAt == -1 ? null : new Date(tmpUpdatedAt);
long tmpPushedAt = in.readLong();
this.pushedAt = tmpPushedAt == -1 ? null : new Date(tmpPushedAt);
this.gitUrl = in.readString();
this.sshUrl = in.readString();
this.cloneUrl = in.readString();
this.svnUrl = in.readString();
this.homepage = in.readString();
this.size = in.readLong();
this.stargazersCount = in.readLong();
this.watchersCount = in.readLong();
this.language = in.readString();
this.hasIssues = in.readByte() != 0;
this.hasDownloads = in.readByte() != 0;
this.hasWiki = in.readByte() != 0;
this.hasPages = in.readByte() != 0;
this.forksCount = in.readLong();
this.mirrorUrl = in.readString();
this.openIssuesCount = in.readLong();
this.forks = in.readLong();
this.openIssues = in.readLong();
this.watchers = in.readLong();
this.defaultBranch = in.readString();
this.topics = new TopicsModel();
in.readList(this.topics, this.topics.getClass().getClassLoader());
this.owner = in.readParcelable(User.class.getClassLoader());
this.permissions = in.readParcelable(RepoPermissionsModel.class.getClassLoader());
this.organization = in.readParcelable(User.class.getClassLoader());
this.parent = in.readParcelable(Repo.class.getClassLoader());
this.source = in.readParcelable(Repo.class.getClassLoader());
this.license = in.readParcelable(LicenseModel.class.getClassLoader());
this.subsCount = in.readInt();
this.networkCount = in.readInt();
this.starredUser = in.readString();
this.reposOwner = in.readString();
}
public static final Creator<Repo> CREATOR = new Creator<Repo>() {
@Override public Repo createFromParcel(Parcel source) {return new Repo(source);}
@Override public Repo[] newArray(int size) {return new Repo[size];}
};
}