001// -------------------------------------------------------------------------------- 002// Copyright 2002-2026 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.contactlist.server.graphql; 018 019import com.echothree.model.control.contactlist.server.control.ContactListControl; 020import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject; 021import com.echothree.model.control.graphql.server.graphql.count.Connections; 022import com.echothree.model.control.graphql.server.graphql.count.CountedObjects; 023import com.echothree.model.control.graphql.server.graphql.count.CountingDataConnectionFetcher; 024import com.echothree.model.control.graphql.server.graphql.count.CountingPaginatedData; 025import com.echothree.model.control.graphql.server.util.BaseGraphQl; 026import com.echothree.model.control.graphql.server.util.count.ObjectLimiter; 027import com.echothree.model.control.user.server.control.UserControl; 028import com.echothree.model.control.workflow.server.graphql.WorkflowEntranceObject; 029import com.echothree.model.control.workflow.server.graphql.WorkflowSecurityUtils; 030import com.echothree.model.data.contactlist.common.ContactListContactMechanismPurposeConstants; 031import com.echothree.model.data.contactlist.common.CustomerTypeContactListConstants; 032import com.echothree.model.data.contactlist.common.PartyContactListConstants; 033import com.echothree.model.data.contactlist.common.PartyTypeContactListConstants; 034import com.echothree.model.data.contactlist.server.entity.ContactList; 035import com.echothree.model.data.contactlist.server.entity.ContactListDetail; 036import com.echothree.util.server.persistence.Session; 037import graphql.annotations.annotationTypes.GraphQLDescription; 038import graphql.annotations.annotationTypes.GraphQLField; 039import graphql.annotations.annotationTypes.GraphQLName; 040import graphql.annotations.annotationTypes.GraphQLNonNull; 041import graphql.annotations.connection.GraphQLConnection; 042import graphql.schema.DataFetchingEnvironment; 043import java.util.ArrayList; 044import java.util.stream.Collectors; 045 046@GraphQLDescription("contact list object") 047@GraphQLName("ContactList") 048public class ContactListObject 049 extends BaseEntityInstanceObject { 050 051 private final ContactList contactList; // Always Present 052 053 public ContactListObject(ContactList contactList) { 054 super(contactList.getPrimaryKey()); 055 056 this.contactList = contactList; 057 } 058 059 private ContactListDetail contactListDetail; // Optional, use getContactListDetail() 060 061 private ContactListDetail getContactListDetail() { 062 if(contactListDetail == null) { 063 contactListDetail = contactList.getLastDetail(); 064 } 065 066 return contactListDetail; 067 } 068 069 @GraphQLField 070 @GraphQLDescription("contact list name") 071 @GraphQLNonNull 072 public String getContactListName() { 073 return getContactListDetail().getContactListName(); 074 } 075 076 @GraphQLField 077 @GraphQLDescription("contact list group") 078 public ContactListGroupObject getContactListGroup(final DataFetchingEnvironment env) { 079 var contactListGroup = getContactListDetail().getContactListGroup(); 080 081 return ContactListSecurityUtils.getHasContactListGroupAccess(env) ? new ContactListGroupObject(contactListGroup) : null; 082 } 083 084 @GraphQLField 085 @GraphQLDescription("contact list type") 086 public ContactListTypeObject getContactListType(final DataFetchingEnvironment env) { 087 var contactListType = getContactListDetail().getContactListType(); 088 089 return ContactListSecurityUtils.getHasContactListTypeAccess(env) ? new ContactListTypeObject(contactListType) : null; 090 } 091 092 @GraphQLField 093 @GraphQLDescription("contact list frequency") 094 public ContactListFrequencyObject getContactListFrequency(final DataFetchingEnvironment env) { 095 var contactListFrequency = getContactListDetail().getContactListFrequency(); 096 097 return contactListFrequency == null ? null : (ContactListSecurityUtils.getHasContactListFrequencyAccess(env) ? new ContactListFrequencyObject(contactListFrequency) : null); 098 } 099 100 @GraphQLField 101 @GraphQLDescription("default party contact list status") 102 public WorkflowEntranceObject getDefaultPartyContactListStatus(final DataFetchingEnvironment env) { 103 var defaultPartyContactListStatus = getContactListDetail().getDefaultPartyContactListStatus(); 104 105 return WorkflowSecurityUtils.getHasWorkflowEntranceAccess(env) ? new WorkflowEntranceObject(defaultPartyContactListStatus) : null; 106 } 107 108 @GraphQLField 109 @GraphQLDescription("is default") 110 @GraphQLNonNull 111 public boolean getIsDefault() { 112 return getContactListDetail().getIsDefault(); 113 } 114 115 @GraphQLField 116 @GraphQLDescription("sort order") 117 @GraphQLNonNull 118 public int getSortOrder() { 119 return getContactListDetail().getSortOrder(); 120 } 121 122 @GraphQLField 123 @GraphQLDescription("description") 124 @GraphQLNonNull 125 public String getDescription(final DataFetchingEnvironment env) { 126 var contactListControl = Session.getModelController(ContactListControl.class); 127 var userControl = Session.getModelController(UserControl.class); 128 129 return contactListControl.getBestContactListDescription(contactList, userControl.getPreferredLanguageFromUserVisit(BaseGraphQl.getUserVisit(env))); 130 } 131 132 @GraphQLField 133 @GraphQLDescription("customer type contact lists") 134 @GraphQLNonNull 135 @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class) 136 public CountingPaginatedData<CustomerTypeContactListObject> getCustomerTypeContactLists(final DataFetchingEnvironment env) { 137 if(ContactListSecurityUtils.getHasCustomerTypeContactListsAccess(env)) { 138 var contactListControl = Session.getModelController(ContactListControl.class); 139 var totalCount = contactListControl.countCustomerTypeContactListsByContactList(contactList); 140 141 try(var objectLimiter = new ObjectLimiter(env, CustomerTypeContactListConstants.COMPONENT_VENDOR_NAME, CustomerTypeContactListConstants.ENTITY_TYPE_NAME, totalCount)) { 142 var entities = contactListControl.getCustomerTypeContactListsByContactList(contactList); 143 var customerTypeContactLists = entities.stream().map(CustomerTypeContactListObject::new).collect(Collectors.toCollection(() -> new ArrayList<>(entities.size()))); 144 145 return new CountedObjects<>(objectLimiter, customerTypeContactLists); 146 } 147 } else { 148 return Connections.emptyConnection(); 149 } 150 } 151 152 @GraphQLField 153 @GraphQLDescription("party type contact lists") 154 @GraphQLNonNull 155 @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class) 156 public CountingPaginatedData<PartyTypeContactListObject> getPartyTypeContactLists(final DataFetchingEnvironment env) { 157 if(ContactListSecurityUtils.getHasPartyTypeContactListsAccess(env)) { 158 var contactListControl = Session.getModelController(ContactListControl.class); 159 var totalCount = contactListControl.countPartyTypeContactListsByContactList(contactList); 160 161 try(var objectLimiter = new ObjectLimiter(env, PartyTypeContactListConstants.COMPONENT_VENDOR_NAME, PartyTypeContactListConstants.ENTITY_TYPE_NAME, totalCount)) { 162 var entities = contactListControl.getPartyTypeContactListsByContactList(contactList); 163 var partyTypeContactLists = entities.stream().map(PartyTypeContactListObject::new).collect(Collectors.toCollection(() -> new ArrayList<>(entities.size()))); 164 165 return new CountedObjects<>(objectLimiter, partyTypeContactLists); 166 } 167 } else { 168 return Connections.emptyConnection(); 169 } 170 } 171 172 @GraphQLField 173 @GraphQLDescription("contact list contact mechanism purposes") 174 @GraphQLNonNull 175 @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class) 176 public CountingPaginatedData<ContactListContactMechanismPurposeObject> getContactListContactMechanismPurposes(final DataFetchingEnvironment env) { 177 if(ContactListSecurityUtils.getHasContactListContactMechanismPurposesAccess(env)) { 178 var contactListControl = Session.getModelController(ContactListControl.class); 179 var totalCount = contactListControl.countContactListContactMechanismPurposesByContactList(contactList); 180 181 try(var objectLimiter = new ObjectLimiter(env, ContactListContactMechanismPurposeConstants.COMPONENT_VENDOR_NAME, ContactListContactMechanismPurposeConstants.ENTITY_TYPE_NAME, totalCount)) { 182 var entities = contactListControl.getContactListContactMechanismPurposesByContactList(contactList); 183 var contactListContactMechanismPurposes = entities.stream().map(ContactListContactMechanismPurposeObject::new).collect(Collectors.toCollection(() -> new ArrayList<>(entities.size()))); 184 185 return new CountedObjects<>(objectLimiter, contactListContactMechanismPurposes); 186 } 187 } else { 188 return Connections.emptyConnection(); 189 } 190 } 191 192 @GraphQLField 193 @GraphQLDescription("party contact lists") 194 @GraphQLNonNull 195 @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class) 196 public CountingPaginatedData<PartyContactListObject> getPartyContactLists(final DataFetchingEnvironment env) { 197 if(ContactListSecurityUtils.getHasPartyContactListsAccess(env)) { 198 var contactListControl = Session.getModelController(ContactListControl.class); 199 var totalCount = contactListControl.countPartyContactListsByContactList(contactList); 200 201 try(var objectLimiter = new ObjectLimiter(env, PartyContactListConstants.COMPONENT_VENDOR_NAME, PartyContactListConstants.ENTITY_TYPE_NAME, totalCount)) { 202 var entities = contactListControl.getPartyContactListsByContactList(contactList); 203 var partyContactLists = entities.stream().map(PartyContactListObject::new).collect(Collectors.toCollection(() -> new ArrayList<>(entities.size()))); 204 205 return new CountedObjects<>(objectLimiter, partyContactLists); 206 } 207 } else { 208 return Connections.emptyConnection(); 209 } 210 } 211 212}