diff --git a/src/main/java/org/springframework/data/repository/reactive/RxJava2CrudRepository.java b/src/main/java/org/springframework/data/repository/reactive/RxJava2CrudRepository.java new file mode 100644 index 000000000..dc99502a3 --- /dev/null +++ b/src/main/java/org/springframework/data/repository/reactive/RxJava2CrudRepository.java @@ -0,0 +1,170 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.repository.reactive; + +import io.reactivex.Completable; +import io.reactivex.Flowable; +import io.reactivex.Maybe; +import io.reactivex.Single; + +import java.io.Serializable; + +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.Repository; + +/** + * Interface for generic CRUD operations on a repository for a specific type. This repository follows reactive paradigms + * and uses RxJava 2 types. + * + * @author Mark Paluch + * @since 2.0 + * @see Single + * @see Flowable + * @see Completable + */ +@NoRepositoryBean +public interface RxJava2CrudRepository extends Repository { + + /** + * Saves a given entity. Use the returned instance for further operations as the save operation might have changed the + * entity instance completely. + * + * @param entity must not be {@literal null}. + * @return the saved entity. + */ + Single save(S entity); + + /** + * Saves all given entities. + * + * @param entities must not be {@literal null}. + * @return the saved entities. + * @throws IllegalArgumentException in case the given entity is {@literal null}. + */ + Flowable save(Iterable entities); + + /** + * Saves all given entities. + * + * @param entityStream must not be {@literal null}. + * @return the saved entities. + * @throws IllegalArgumentException in case the given {@code Publisher} is {@literal null}. + */ + Flowable save(Flowable entityStream); + + /** + * Retrieves an entity by its id. + * + * @param id must not be {@literal null}. + * @return the entity with the given id or {@link Maybe#empty()} if none found. + * @throws IllegalArgumentException if {@code id} is {@literal null}. + */ + Maybe findOne(ID id); + + /** + * Retrieves an entity by its id supplied by a {@link Single}. + * + * @param id must not be {@literal null}. + * @return the entity with the given id or {@link Maybe#empty()} if none found. + * @throws IllegalArgumentException if {@code id} is {@literal null}. + */ + Maybe findOne(Single id); + + /** + * Returns whether an entity with the given id exists. + * + * @param id must not be {@literal null}. + * @return {@literal true} if an entity with the given id exists, {@literal false} otherwise. + * @throws IllegalArgumentException if {@code id} is {@literal null}. + */ + Single exists(ID id); + + /** + * Returns whether an entity with the given id exists supplied by a {@link Single}. + * + * @param id must not be {@literal null}. + * @return {@literal true} if an entity with the given id exists, {@literal false} otherwise. + * @throws IllegalArgumentException if {@code id} is {@literal null} + */ + Single exists(Single id); + + /** + * Returns all instances of the type. + * + * @return all entities. + */ + Flowable findAll(); + + /** + * Returns all instances of the type with the given IDs. + * + * @param ids must not be {@literal null}. + * @return the found entities. + */ + Flowable findAll(Iterable ids); + + /** + * Returns all instances of the type with the given IDs. + * + * @param idStream must not be {@literal null}. + * @return the found entities. + */ + Flowable findAll(Flowable idStream); + + /** + * Returns the number of entities available. + * + * @return the number of entities. + */ + Single count(); + + /** + * Deletes the entity with the given id. + * + * @param id must not be {@literal null}. + * @throws IllegalArgumentException in case the given {@code id} is {@literal null}. + */ + Completable delete(ID id); + + /** + * Deletes a given entity. + * + * @param entity must not be {@literal null}. + * @throws IllegalArgumentException in case the given entity is {@literal null}. + */ + Completable delete(T entity); + + /** + * Deletes the given entities. + * + * @param entities must not be {@literal null}. + * @throws IllegalArgumentException in case the given {@link Iterable} is {@literal null}. + */ + Completable delete(Iterable entities); + + /** + * Deletes the given entities. + * + * @param entityStream must not be {@literal null}. + * @throws IllegalArgumentException in case the given {@link Flowable} is {@literal null}. + */ + Completable delete(Flowable entityStream); + + /** + * Deletes all entities managed by the repository. + */ + Completable deleteAll(); +} diff --git a/src/main/java/org/springframework/data/repository/reactive/RxJava2SortingRepository.java b/src/main/java/org/springframework/data/repository/reactive/RxJava2SortingRepository.java new file mode 100644 index 000000000..7d027e51f --- /dev/null +++ b/src/main/java/org/springframework/data/repository/reactive/RxJava2SortingRepository.java @@ -0,0 +1,45 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.repository.reactive; + +import io.reactivex.Flowable; + +import java.io.Serializable; + +import org.springframework.data.domain.Sort; +import org.springframework.data.repository.NoRepositoryBean; + +/** + * Extension of {@link RxJava2CrudRepository} to provide additional methods to retrieve entities using the sorting + * abstraction. + * + * @author Mark Paluch + * @since 2.0 + * @see Sort + * @see Flowable + * @see RxJava2CrudRepository + */ +@NoRepositoryBean +public interface RxJava2SortingRepository extends RxJava2CrudRepository { + + /** + * Returns all entities sorted by the given options. + * + * @param sort must not be {@literal null}. + * @return all entities sorted by the given options. + */ + Flowable findAll(Sort sort); +}