From b554e1301b118edc779216248c3e13758e588413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mathieu?= Date: Tue, 17 Mar 2020 15:25:13 +0100 Subject: [PATCH] MongoDB with Panache deleteById() --- docs/src/main/asciidoc/mongodb-panache.adoc | 9 +++++++++ .../hibernate/orm/panache/PanacheEntityBase.java | 2 +- .../hibernate/orm/panache/PanacheRepositoryBase.java | 2 +- .../mongodb/panache/PanacheMongoEntityBase.java | 11 +++++++++++ .../mongodb/panache/PanacheMongoRepositoryBase.java | 11 +++++++++++ .../reactive/ReactivePanacheMongoEntityBase.java | 12 ++++++++++++ .../reactive/ReactivePanacheMongoRepositoryBase.java | 12 ++++++++++++ .../reactive/runtime/ReactiveMongoOperations.java | 6 ++++++ .../mongodb/panache/runtime/MongoOperations.java | 8 ++++++++ .../it/mongodb/panache/book/BookEntityResource.java | 6 ++++-- .../mongodb/panache/book/BookRepositoryResource.java | 6 ++++-- .../reactive/book/ReactiveBookEntityResource.java | 8 +++++++- .../book/ReactiveBookRepositoryResource.java | 8 +++++++- 13 files changed, 93 insertions(+), 8 deletions(-) diff --git a/docs/src/main/asciidoc/mongodb-panache.adoc b/docs/src/main/asciidoc/mongodb-panache.adoc index 2e630104f8742e..c0d358340f9110 100644 --- a/docs/src/main/asciidoc/mongodb-panache.adoc +++ b/docs/src/main/asciidoc/mongodb-panache.adoc @@ -222,6 +222,9 @@ Person.delete("status", Status.Alive); // delete all persons Person.deleteAll(); + +// delete by id +boolean deleted = Person.deleteById(personId); ---- All `list` methods have equivalent `stream` versions. @@ -382,6 +385,9 @@ personRepository.delete("status", Status.Alive); // delete all persons personRepository.deleteAll(); + +// delete by id +boolean deleted = personRepository.deleteById(personId); ---- All `list` methods have equivalent `stream` versions. @@ -775,6 +781,9 @@ Uni deleteCount = ReactivePerson.delete("status", Status.Alive); // delete all persons deleteCount = ReactivePerson.deleteAll(); + +// delete by id +Uni deleted = ReactivePerson.deleteById(personId); ---- TIP: If you use MongoDB with Panache in conjunction with RESTEasy, you can directly return a reactive type inside your JAX-RS resource endpoint as long as you include the `quarkus-resteasy-mutiny` extension. diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java index 3372cacc4f7fcb..74ed7d23ee51d3 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java @@ -642,7 +642,7 @@ public static long deleteAll() { * Delete an entity of this type by ID. * * @param id the ID of the entity to delete. - * @return false if the entity is not delete (not found). + * @return false if the entity was not deleted (not found). */ @GenerateBridge public static boolean deleteById(Object id) { diff --git a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java index 4f63444aa8867b..6b26a4c17d4ce6 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java +++ b/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheRepositoryBase.java @@ -638,7 +638,7 @@ public default long deleteAll() { * Delete an entity of this type by ID. * * @param id the ID of the entity to delete. - * @return false if the entity is not deleted (not found). + * @return false if the entity was not deleted (not found). */ @GenerateBridge public default boolean deleteById(Id id) { diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoEntityBase.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoEntityBase.java index f924fb22f09f40..be4d2a1169ed9d 100755 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoEntityBase.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoEntityBase.java @@ -697,6 +697,17 @@ public static long deleteAll() { throw MongoOperations.implementationInjectionMissing(); } + /** + * Delete an entity of this type by ID. + * + * @param id the ID of the entity to delete. + * @return false if the entity was not deleted (not found). + */ + @GenerateBridge + public static boolean deleteById(Object id) { + throw MongoOperations.implementationInjectionMissing(); + } + /** * Delete all entities of this type matching the given query, with optional indexed parameters. * diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoRepositoryBase.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoRepositoryBase.java index 532328334129ca..e2ecf4351c0478 100755 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoRepositoryBase.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/PanacheMongoRepositoryBase.java @@ -702,6 +702,17 @@ public default long deleteAll() { throw MongoOperations.implementationInjectionMissing(); } + /** + * Delete an entity of this type by ID. + * + * @param id the ID of the entity to delete. + * @return false if the entity was not deleted (not found). + */ + @GenerateBridge + public default boolean deleteById(Id id) { + throw MongoOperations.implementationInjectionMissing(); + } + /** * Delete all entities of this type matching the given query, with optional indexed parameters. * diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoEntityBase.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoEntityBase.java index 9bc3f8e811b867..4e270800898359 100644 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoEntityBase.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoEntityBase.java @@ -8,6 +8,7 @@ import org.bson.Document; import io.quarkus.mongodb.panache.reactive.runtime.ReactiveMongoOperations; +import io.quarkus.mongodb.panache.runtime.MongoOperations; import io.quarkus.mongodb.reactive.ReactiveMongoCollection; import io.quarkus.mongodb.reactive.ReactiveMongoDatabase; import io.quarkus.panache.common.Parameters; @@ -707,6 +708,17 @@ public static Uni deleteAll() { throw ReactiveMongoOperations.implementationInjectionMissing(); } + /** + * Delete an entity of this type by ID. + * + * @param id the ID of the entity to delete. + * @return false if the entity was not deleted (not found). + */ + @GenerateBridge + public static Uni deleteById(Object id) { + throw MongoOperations.implementationInjectionMissing(); + } + /** * Delete all entities of this type matching the given query, with optional indexed parameters. * diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoRepositoryBase.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoRepositoryBase.java index 00555892454ad5..4703fc98b28cf4 100644 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoRepositoryBase.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/ReactivePanacheMongoRepositoryBase.java @@ -8,6 +8,7 @@ import org.bson.Document; import io.quarkus.mongodb.panache.reactive.runtime.ReactiveMongoOperations; +import io.quarkus.mongodb.panache.runtime.MongoOperations; import io.quarkus.mongodb.reactive.ReactiveMongoCollection; import io.quarkus.mongodb.reactive.ReactiveMongoDatabase; import io.quarkus.panache.common.Parameters; @@ -703,6 +704,17 @@ public default Uni deleteAll() { throw ReactiveMongoOperations.implementationInjectionMissing(); } + /** + * Delete an entity of this type by ID. + * + * @param id the ID of the entity to delete. + * @return false if the entity was not deleted (not found). + */ + @GenerateBridge + public default Uni deleteById(Id id) { + throw MongoOperations.implementationInjectionMissing(); + } + /** * Delete all entities of this type matching the given query, with optional indexed parameters. * diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/runtime/ReactiveMongoOperations.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/runtime/ReactiveMongoOperations.java index 2745ab518da91e..26106022853f63 100644 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/runtime/ReactiveMongoOperations.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/reactive/runtime/ReactiveMongoOperations.java @@ -565,6 +565,12 @@ public static Uni deleteAll(Class entityClass) { return collection.deleteMany(new Document()).map(deleteResult -> deleteResult.getDeletedCount()); } + public static Uni deleteById(Class entityClass, Object id) { + ReactiveMongoCollection collection = mongoCollection(entityClass); + Document query = new Document().append(ID, id); + return collection.deleteOne(query).map(results -> results.getDeletedCount() == 1); + } + public static Uni delete(Class entityClass, String query, Object... params) { String bindQuery = bindQuery(entityClass, query, params); Document docQuery = Document.parse(bindQuery); diff --git a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoOperations.java b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoOperations.java index b8666dc85c8313..e5b7e09f805347 100644 --- a/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoOperations.java +++ b/extensions/panache/mongodb-panache/runtime/src/main/java/io/quarkus/mongodb/panache/runtime/MongoOperations.java @@ -27,6 +27,7 @@ import com.mongodb.client.model.ReplaceOneModel; import com.mongodb.client.model.ReplaceOptions; import com.mongodb.client.model.WriteModel; +import com.mongodb.client.result.DeleteResult; import io.quarkus.arc.Arc; import io.quarkus.mongodb.panache.MongoEntity; @@ -537,6 +538,13 @@ public static long deleteAll(Class entityClass) { return collection.deleteMany(new Document()).getDeletedCount(); } + public static boolean deleteById(Class entityClass, Object id) { + MongoCollection collection = mongoCollection(entityClass); + Document query = new Document().append(ID, id); + DeleteResult results = collection.deleteOne(query); + return results.getDeletedCount() == 1; + } + public static long delete(Class entityClass, String query, Object... params) { String bindQuery = bindQuery(entityClass, query, params); Document docQuery = Document.parse(bindQuery); diff --git a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookEntityResource.java b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookEntityResource.java index 8cb8c21d1ddabd..f8f018e81df140 100644 --- a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookEntityResource.java +++ b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookEntityResource.java @@ -59,8 +59,10 @@ public Response upsertBook(BookEntity book) { @DELETE @Path("/{id}") public void deleteBook(@PathParam("id") String id) { - BookEntity theBook = BookEntity.findById(new ObjectId(id)); - theBook.delete(); + boolean deleted = BookEntity.deleteById(new ObjectId(id)); + if (!deleted) { + throw new NotFoundException(); + } } @GET diff --git a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookRepositoryResource.java b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookRepositoryResource.java index 51f6852b8790fb..5de29dc6f49f4f 100644 --- a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookRepositoryResource.java +++ b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/book/BookRepositoryResource.java @@ -62,8 +62,10 @@ public Response upsertBook(Book book) { @DELETE @Path("/{id}") public void deleteBook(@PathParam("id") String id) { - Book theBook = bookRepository.findById(new ObjectId(id)); - bookRepository.delete(theBook); + boolean deleted = bookRepository.deleteById(new ObjectId(id)); + if (!deleted) { + throw new NotFoundException(); + } } @GET diff --git a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookEntityResource.java b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookEntityResource.java index 4fb0a981ddf2cf..54d11aee5cf3e0 100644 --- a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookEntityResource.java +++ b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookEntityResource.java @@ -73,7 +73,13 @@ public Uni upsertBook(ReactiveBookEntity book) { @DELETE @Path("/{id}") public Uni deleteBook(@PathParam("id") String id) { - return ReactiveBookEntity.findById(new ObjectId(id)).flatMap(book -> book.delete()); + return ReactiveBookEntity.deleteById(new ObjectId(id)) + .map(d -> { + if (d) { + return null; + } + throw new NotFoundException(); + }); } @GET diff --git a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookRepositoryResource.java b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookRepositoryResource.java index 0b340e726c1610..543dab581b1051 100644 --- a/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookRepositoryResource.java +++ b/integration-tests/mongodb-panache/src/main/java/io/quarkus/it/mongodb/panache/reactive/book/ReactiveBookRepositoryResource.java @@ -77,7 +77,13 @@ public Uni upsertBook(Book book) { @DELETE @Path("/{id}") public Uni deleteBook(@PathParam("id") String id) { - return reactiveBookRepository.findById(new ObjectId(id)).flatMap(book -> reactiveBookRepository.delete(book)); + return reactiveBookRepository.deleteById(new ObjectId(id)) + .map(d -> { + if (d) { + return null; + } + throw new NotFoundException(); + }); } @GET