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.PayloadModel; import com.fastaccess.data.dao.converters.PayloadConverter; import com.fastaccess.data.dao.converters.RepoConverter; import com.fastaccess.data.dao.converters.UserConverter; import com.fastaccess.data.dao.types.EventsType; 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.rx.SingleEntityStore; import lombok.NoArgsConstructor; import rx.Observable; import rx.Single; /** * Created by Kosh on 16 Mar 2017, 7:29 PM */ @Entity @NoArgsConstructor public abstract class AbstractEvent implements Parcelable { @Key long id; EventsType type; Date createdAt; @Convert(UserConverter.class) User actor; @Convert(RepoConverter.class) Repo repo; @Convert(PayloadConverter.class) PayloadModel payload; @SerializedName("public") boolean publicEvent; @NonNull public static Single save(@NonNull List<Event> events) { SingleEntityStore<Persistable> dataSource = App.getInstance().getDataStore(); return dataSource.delete(Event.class) .get() .toSingle() .flatMap(i -> dataSource.insert(events)); } @NonNull public static Observable<List<Event>> getEvents() { return App.getInstance().getDataStore() .select(Event.class) .orderBy(Event.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.writeInt(this.type == null ? -1 : this.type.ordinal()); dest.writeLong(this.createdAt != null ? this.createdAt.getTime() : -1); dest.writeParcelable(this.actor, flags); dest.writeParcelable(this.repo, flags); dest.writeParcelable(this.payload, flags); dest.writeByte(this.publicEvent ? (byte) 1 : (byte) 0); } protected AbstractEvent(Parcel in) { this.id = in.readLong(); int tmpType = in.readInt(); this.type = tmpType == -1 ? null : EventsType.values()[tmpType]; long tmpCreatedAt = in.readLong(); this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt); this.actor = in.readParcelable(User.class.getClassLoader()); this.repo = in.readParcelable(Repo.class.getClassLoader()); this.payload = in.readParcelable(PayloadModel.class.getClassLoader()); this.publicEvent = in.readByte() != 0; } public static final Creator<Event> CREATOR = new Creator<Event>() { @Override public Event createFromParcel(Parcel source) {return new Event(source);} @Override public Event[] newArray(int size) {return new Event[size];} }; }