aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/dev/submelon/exceptions/ItemNotFoundException.java11
-rw-r--r--src/main/java/dev/submelon/model/PantryItem.java (renamed from src/main/java/dev/submelon/rest/json/PantryItem.java)19
-rw-r--r--src/main/java/dev/submelon/rest/json/PantryItemResource.java63
-rw-r--r--src/main/java/dev/submelon/view/PantryItemResource.java46
4 files changed, 69 insertions, 70 deletions
diff --git a/src/main/java/dev/submelon/exceptions/ItemNotFoundException.java b/src/main/java/dev/submelon/exceptions/ItemNotFoundException.java
new file mode 100644
index 0000000..6e37c86
--- /dev/null
+++ b/src/main/java/dev/submelon/exceptions/ItemNotFoundException.java
@@ -0,0 +1,11 @@
+package dev.submelon.exceptions;
+
+import io.smallrye.graphql.api.ErrorCode;
+
+@ErrorCode("item-not-found")
+public class ItemNotFoundException extends RuntimeException {
+
+ public ItemNotFoundException(Throwable th) {
+ super(th);
+ }
+}
diff --git a/src/main/java/dev/submelon/rest/json/PantryItem.java b/src/main/java/dev/submelon/model/PantryItem.java
index 6a30031..fc4fdf0 100644
--- a/src/main/java/dev/submelon/rest/json/PantryItem.java
+++ b/src/main/java/dev/submelon/model/PantryItem.java
@@ -1,28 +1,33 @@
-package dev.submelon.rest.json;
-
-import java.util.UUID;
+package dev.submelon.model;
import org.bson.codecs.pojo.annotations.BsonId;
+import org.bson.types.ObjectId;
-import io.quarkus.mongodb.panache.PanacheMongoEntityBase;
import io.quarkus.mongodb.panache.common.MongoEntity;
+import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntityBase;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+@Builder
@Data
+@NoArgsConstructor
+@AllArgsConstructor
@EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true)
@MongoEntity(collection = "item")
-public class PantryItem extends PanacheMongoEntityBase {
+public class PantryItem extends ReactivePanacheMongoEntityBase {
@BsonId
@EqualsAndHashCode.Include
- private UUID id;
+ private ObjectId id;
private String name;
private String description;
- private double quantity;
+ private Double quantity;
private String quantityUnitType;
diff --git a/src/main/java/dev/submelon/rest/json/PantryItemResource.java b/src/main/java/dev/submelon/rest/json/PantryItemResource.java
deleted file mode 100644
index 75a986d..0000000
--- a/src/main/java/dev/submelon/rest/json/PantryItemResource.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package dev.submelon.rest.json;
-
-import java.util.List;
-import java.util.UUID;
-
-import javax.transaction.Transactional;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/items")
-public class PantryItemResource {
-
- @GET
- @Produces(MediaType.APPLICATION_JSON)
- public List<PantryItem> getItems() {
- return PantryItem.findAll().list();
- }
-
- @Transactional
- @POST
- @Produces(MediaType.APPLICATION_JSON)
- public PantryItem postItem(PantryItem item) {
- PantryItem.persist(item);
-
- return item;
- }
-
- @Transactional
- @PUT
- @Path("/{id}")
- @Produces(MediaType.APPLICATION_JSON)
- public PantryItem putItem(@PathParam("id") String id, PantryItem item) {
- UUID _id = UUID.fromString(id);
- if (item.getId().equals(_id)) {
- PantryItem.persist(item);
- } else {
- throw new WebApplicationException(Response.status(400).entity("ID does not match body").build());
- }
-
- return item;
- }
-
- @Transactional
- @DELETE
- @Path("/{id}")
- public Response deleteItem(@PathParam("id") String id) {
- UUID _id = UUID.fromString(id);
- boolean result = PantryItem.deleteById(_id);
- if (result) {
- return Response.ok().build();
- } else {
- return Response.status(404).entity("Could not find item").build();
- }
- }
-}
diff --git a/src/main/java/dev/submelon/view/PantryItemResource.java b/src/main/java/dev/submelon/view/PantryItemResource.java
new file mode 100644
index 0000000..677fd26
--- /dev/null
+++ b/src/main/java/dev/submelon/view/PantryItemResource.java
@@ -0,0 +1,46 @@
+package dev.submelon.view;
+
+import java.util.List;
+
+import org.bson.types.ObjectId;
+import org.eclipse.microprofile.graphql.Description;
+import org.eclipse.microprofile.graphql.GraphQLApi;
+import org.eclipse.microprofile.graphql.Mutation;
+import org.eclipse.microprofile.graphql.Name;
+import org.eclipse.microprofile.graphql.Query;
+
+import dev.submelon.exceptions.ItemNotFoundException;
+import dev.submelon.model.PantryItem;
+import io.smallrye.mutiny.Uni;
+
+@GraphQLApi
+public class PantryItemResource {
+
+ @Query("allItems")
+ @Description("Get all items stored in the pantry")
+ public Uni<List<PantryItem>> getItems() {
+ return PantryItem.findAll().list();
+ }
+
+ @Query
+ @Description("Get an item stored in the pantry")
+ public Uni<PantryItem> getItem(@Name("itemId") String id) {
+ ObjectId _id = new ObjectId(id);
+ return PantryItem.findById(_id);
+ }
+
+ @Mutation
+ @Description("Store an item in the pantry")
+ public Uni<PantryItem> storeItem(PantryItem item) {
+ return PantryItem.persist(item).replaceWith(item);
+ }
+
+ @Mutation
+ @Description("Remove an item from the pantry")
+ public Uni<Boolean> deleteItem(String id) {
+ ObjectId _id = new ObjectId(id);
+ return PantryItem.deleteById(_id)
+ .onFailure()
+ .transform(ItemNotFoundException::new);
+ }
+}