001// -------------------------------------------------------------------------------- 002// Copyright 2002-2024 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.model.control.vendor.server.graphql; 018 019import com.echothree.model.control.cancellationpolicy.server.graphql.CancellationPolicyObject; 020import com.echothree.model.control.cancellationpolicy.server.graphql.CancellationPolicySecurityUtils; 021import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject; 022import com.echothree.model.control.graphql.server.graphql.count.Connections; 023import com.echothree.model.control.graphql.server.graphql.count.CountedObjects; 024import com.echothree.model.control.graphql.server.graphql.count.CountingDataConnectionFetcher; 025import com.echothree.model.control.graphql.server.graphql.count.CountingPaginatedData; 026import com.echothree.model.control.graphql.server.util.count.ObjectLimiter; 027import com.echothree.model.control.item.server.graphql.ItemObject; 028import com.echothree.model.control.item.server.graphql.ItemSecurityUtils; 029import com.echothree.model.control.returnpolicy.server.graphql.ReturnPolicyObject; 030import com.echothree.model.control.returnpolicy.server.graphql.ReturnPolicySecurityUtils; 031import com.echothree.model.control.vendor.common.workflow.VendorItemStatusConstants; 032import com.echothree.model.control.vendor.server.control.VendorControl; 033import com.echothree.model.control.workflow.server.graphql.WorkflowEntityStatusObject; 034import com.echothree.model.data.vendor.common.VendorItemCostConstants; 035import com.echothree.model.data.vendor.server.entity.VendorItem; 036import com.echothree.model.data.vendor.server.entity.VendorItemDetail; 037import com.echothree.util.server.persistence.Session; 038import graphql.annotations.annotationTypes.GraphQLDescription; 039import graphql.annotations.annotationTypes.GraphQLField; 040import graphql.annotations.annotationTypes.GraphQLName; 041import graphql.annotations.annotationTypes.GraphQLNonNull; 042import graphql.annotations.connection.GraphQLConnection; 043import graphql.schema.DataFetchingEnvironment; 044import java.util.ArrayList; 045import java.util.stream.Collectors; 046 047@GraphQLDescription("vendor item object") 048@GraphQLName("VendorItem") 049public class VendorItemObject 050 extends BaseEntityInstanceObject { 051 052 private final VendorItem vendorItem; // Always Present 053 054 public VendorItemObject(VendorItem vendorItem) { 055 super(vendorItem.getPrimaryKey()); 056 057 this.vendorItem = vendorItem; 058 } 059 060 private VendorItemDetail vendorItemDetail; // Optional, use getVendorItemDetail() 061 062 private VendorItemDetail getVendorItemDetail() { 063 if(vendorItemDetail == null) { 064 vendorItemDetail = vendorItem.getLastDetail(); 065 } 066 067 return vendorItemDetail; 068 } 069 070 @GraphQLField 071 @GraphQLDescription("item") 072 public ItemObject getItem(final DataFetchingEnvironment env) { 073 return ItemSecurityUtils.getHasItemAccess(env) ? new ItemObject(getVendorItemDetail().getItem()) : null; 074 } 075 076 @GraphQLField 077 @GraphQLDescription("vendor") 078 public VendorObject getVendor(final DataFetchingEnvironment env) { 079 var party = getVendorItemDetail().getVendorParty(); 080 081 return VendorSecurityUtils.getHasVendorAccess(env, party) ? new VendorObject(party) : null; 082 } 083 084 @GraphQLField 085 @GraphQLDescription("vendor item name") 086 @GraphQLNonNull 087 public String getVendorItemName() { 088 return getVendorItemDetail().getVendorItemName(); 089 } 090 091 @GraphQLField 092 @GraphQLDescription("description") 093 public String getDescription() { 094 return getVendorItemDetail().getDescription(); 095 } 096 097 @GraphQLField 098 @GraphQLDescription("priority") 099 @GraphQLNonNull 100 public int getPriority() { 101 return getVendorItemDetail().getPriority(); 102 } 103 104 @GraphQLField 105 @GraphQLDescription("cancellation policy") 106 public CancellationPolicyObject getCancellationPolicy(final DataFetchingEnvironment env) { 107 var defaultCancellationPolicy = getVendorItemDetail().getCancellationPolicy(); 108 109 return defaultCancellationPolicy == null ? null : CancellationPolicySecurityUtils.getHasCancellationPolicyAccess(env) ? 110 new CancellationPolicyObject(defaultCancellationPolicy) : null; 111 } 112 113 @GraphQLField 114 @GraphQLDescription("return policy") 115 public ReturnPolicyObject getReturnPolicy(final DataFetchingEnvironment env) { 116 var defaultReturnPolicy = getVendorItemDetail().getReturnPolicy(); 117 118 return defaultReturnPolicy == null ? null : ReturnPolicySecurityUtils.getHasReturnPolicyAccess(env) ? 119 new ReturnPolicyObject(defaultReturnPolicy) : null; 120 } 121 122 @GraphQLField 123 @GraphQLDescription("vendor item status") 124 public WorkflowEntityStatusObject getVendorItemStatus(final DataFetchingEnvironment env) { 125 return getWorkflowEntityStatusObject(env, VendorItemStatusConstants.Workflow_VENDOR_ITEM_STATUS); 126 } 127 128 @GraphQLField 129 @GraphQLDescription("vendor item costs") 130 @GraphQLNonNull 131 @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class) 132 public CountingPaginatedData<VendorItemCostObject> getVendorItemCosts(final DataFetchingEnvironment env) { 133 if(VendorSecurityUtils.getHasVendorItemCostsAccess(env)) { 134 var vendorControl = Session.getModelController(VendorControl.class); 135 var totalCount = vendorControl.countVendorItemCostsByVendorItem(vendorItem); 136 137 try(var objectLimiter = new ObjectLimiter(env, VendorItemCostConstants.COMPONENT_VENDOR_NAME, VendorItemCostConstants.ENTITY_TYPE_NAME, totalCount)) { 138 var entities = vendorControl.getVendorItemCostsByVendorItem(vendorItem); 139 var items = entities.stream().map(VendorItemCostObject::new).collect(Collectors.toCollection(() -> new ArrayList<>(entities.size()))); 140 141 return new CountedObjects<>(objectLimiter, items); 142 } 143 } else { 144 return Connections.emptyConnection(); 145 } 146 } 147 148}