diff options
Diffstat (limited to 'src/main/java/dev')
| -rw-r--r-- | src/main/java/dev/submelon/exceptions/ItemNotFoundException.java | 11 | ||||
| -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.java | 63 | ||||
| -rw-r--r-- | src/main/java/dev/submelon/view/PantryItemResource.java | 46 |
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); + } +} |
