diff options
Diffstat (limited to 'src/main/java/dev/submelon/view/PantryItemLabelResource.java')
| -rw-r--r-- | src/main/java/dev/submelon/view/PantryItemLabelResource.java | 55 |
1 files changed, 55 insertions, 0 deletions
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); + } +} |
