aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/dev')
-rw-r--r--src/main/java/dev/submelon/model/PantryItem.java2
-rw-r--r--src/main/java/dev/submelon/model/PantryItemLabel.java17
-rw-r--r--src/main/java/dev/submelon/view/PantryItemLabelResource.java55
3 files changed, 74 insertions, 0 deletions
diff --git a/src/main/java/dev/submelon/model/PantryItem.java b/src/main/java/dev/submelon/model/PantryItem.java
index fc4fdf0..30d9851 100644
--- a/src/main/java/dev/submelon/model/PantryItem.java
+++ b/src/main/java/dev/submelon/model/PantryItem.java
@@ -31,4 +31,6 @@ public class PantryItem extends ReactivePanacheMongoEntityBase {
private String quantityUnitType;
+ private String[] labels;
+
}
diff --git a/src/main/java/dev/submelon/model/PantryItemLabel.java b/src/main/java/dev/submelon/model/PantryItemLabel.java
new file mode 100644
index 0000000..96c266a
--- /dev/null
+++ b/src/main/java/dev/submelon/model/PantryItemLabel.java
@@ -0,0 +1,17 @@
+package dev.submelon.model;
+
+import io.quarkus.mongodb.panache.common.MongoEntity;
+import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true)
+@MongoEntity(collection = "label")
+public class PantryItemLabel extends ReactivePanacheMongoEntity {
+
+ private String title;
+
+ private String color;
+
+}
diff --git a/src/main/java/dev/submelon/view/PantryItemLabelResource.java b/src/main/java/dev/submelon/view/PantryItemLabelResource.java
new file mode 100644
index 0000000..985e96e
--- /dev/null
+++ b/src/main/java/dev/submelon/view/PantryItemLabelResource.java
@@ -0,0 +1,55 @@
+package dev.submelon.view;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.eclipse.microprofile.graphql.Description;
+import org.eclipse.microprofile.graphql.GraphQLApi;
+import org.eclipse.microprofile.graphql.Mutation;
+import org.eclipse.microprofile.graphql.Query;
+
+import dev.submelon.model.PantryItemLabel;
+import io.smallrye.mutiny.Multi;
+import io.smallrye.mutiny.Uni;
+
+@GraphQLApi
+public class PantryItemLabelResource {
+
+ @Query("allLabels")
+ @Description("Get all labels that can be assigned to items")
+ public Uni<List<PantryItemLabel>> getItems() {
+ return PantryItemLabel.findAll().list();
+ }
+
+ @Mutation
+ @Description("Create any new labels from list of labels")
+ public Uni<List<PantryItemLabel>> syncLabels(PantryItemLabel[] labels) {
+ return Multi.createFrom().items(labels)
+ .filter(label -> StringUtils.isNotBlank(label.getTitle()))
+ .onItem().transformToUniAndMerge(this::getOrCreateLabel)
+ .collect().asList();
+ }
+
+ private Uni<PantryItemLabel> getOrCreateLabel(PantryItemLabel label) {
+ return findByTitle(label.getTitle())
+ .onItem().transformToUni(opt -> {
+ if (opt.isPresent()) {
+ return Uni.createFrom().item(opt.get());
+ } else {
+ return persistNewLabel(label);
+ }
+ });
+ }
+
+ private Uni<Optional<PantryItemLabel>> findByTitle(String title) {
+ return PantryItemLabel
+ .find(new Document("title", title))
+ .firstResultOptional();
+ }
+
+ private Uni<PantryItemLabel> persistNewLabel(PantryItemLabel label) {
+ return PantryItemLabel.persist(label).replaceWith(label);
+ }
+}