package tc.oc.api.model;
import java.util.Collection;
import com.google.common.reflect.TypeToken;
import com.google.common.util.concurrent.ListenableFuture;
import tc.oc.api.docs.virtual.Model;
import tc.oc.api.docs.virtual.PartialModel;
import tc.oc.api.message.types.PartialModelUpdate;
import tc.oc.api.message.types.UpdateMultiRequest;
import tc.oc.api.message.types.UpdateMultiResponse;
public interface UpdateService<Partial extends PartialModel> {
TypeToken<Partial> partialType();
default PartialModelUpdate<Partial> updateRequest(Partial document) {
return new PartialModelUpdate<Partial>() {
@Override public Partial document() { return document; }
@Override public TypeToken<Partial> model() { return partialType(); }
};
}
ListenableFuture<?> update(String id, PartialModelUpdate<Partial> request);
default ListenableFuture<?> update(String id, Partial partial) {
return update(id, updateRequest(partial));
}
default ListenableFuture<?> update(Partial partial) {
if(!(partial instanceof Model)) {
throw new IllegalArgumentException("Partial model has no _id field");
}
Model model = (Model) partial;
if(model._id() == null) {
throw new IllegalArgumentException("_id is null");
}
return update(model._id(), partial);
}
default <T extends Partial> ListenableFuture<UpdateMultiResponse> updateMulti(Collection<T> models) {
return updateMulti((UpdateMultiRequest<T>) () -> models);
}
ListenableFuture<UpdateMultiResponse> updateMulti(UpdateMultiRequest<? extends Partial> request);
}