package tc.oc.api.model; import java.util.Collection; import java.util.Collections; import com.google.common.reflect.TypeToken; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import tc.oc.api.docs.virtual.Model; import tc.oc.api.exceptions.NotFound; import tc.oc.api.message.types.FindMultiRequest; import tc.oc.api.message.types.FindMultiResponse; import tc.oc.api.message.types.FindRequest; import tc.oc.commons.core.concurrent.FutureUtils; public interface QueryService<Complete extends Model> { TypeToken<Complete> completeType(); ListenableFuture<FindMultiResponse<Complete>> find(FindRequest<Complete> request); default ListenableFuture<FindMultiResponse<Complete>> all() { return find(new FindRequest<>(completeType())); } default ListenableFuture<Complete> find(String id) { return FutureUtils.mapAsync( find(Collections.singleton(id)), response -> response.documents().stream().findAny() .map(Futures::immediateFuture) .orElseGet(() -> Futures.immediateFailedFuture(new NotFound(completeType().toString() + " with id " + id, null))) ); } default ListenableFuture<FindMultiResponse<Complete>> find(Collection<String> ids) { return find(new FindMultiRequest<>(completeType(), ids)); } }