001// -------------------------------------------------------------------------------- 002// Copyright 2002-2025 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.core.server.graphql; 018 019import com.echothree.model.control.core.server.control.CoreControl; 020import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject; 021import com.echothree.model.control.graphql.server.graphql.count.CountedObjects; 022import com.echothree.model.control.graphql.server.graphql.count.CountingDataConnectionFetcher; 023import com.echothree.model.control.graphql.server.graphql.count.CountingPaginatedData; 024import com.echothree.model.control.graphql.server.util.BaseGraphQl; 025import com.echothree.model.control.graphql.server.util.count.ObjectLimiter; 026import com.echothree.model.control.user.server.control.UserControl; 027import com.echothree.model.data.core.common.EntityAttributeConstants; 028import com.echothree.model.data.core.server.entity.EntityAttribute; 029import com.echothree.model.data.core.server.entity.EntityAttributeGroup; 030import com.echothree.model.data.core.server.entity.EntityAttributeGroupDetail; 031import com.echothree.model.data.core.server.entity.EntityInstance; 032import com.echothree.util.server.persistence.Session; 033import graphql.annotations.annotationTypes.GraphQLDescription; 034import graphql.annotations.annotationTypes.GraphQLField; 035import graphql.annotations.annotationTypes.GraphQLName; 036import graphql.annotations.annotationTypes.GraphQLNonNull; 037import graphql.annotations.connection.GraphQLConnection; 038import graphql.schema.DataFetchingEnvironment; 039import java.util.ArrayList; 040import java.util.Collection; 041 042@GraphQLDescription("entity attribute group object") 043@GraphQLName("EntityAttributeGroup") 044public class EntityAttributeGroupObject 045 extends BaseEntityInstanceObject { 046 047 private final EntityAttributeGroup entityAttributeGroup; // Always Present 048 private final EntityInstance entityInstance; 049 050 public EntityAttributeGroupObject(EntityAttributeGroup entityAttributeGroup, EntityInstance entityInstance) { 051 super(entityAttributeGroup.getPrimaryKey()); 052 053 this.entityAttributeGroup = entityAttributeGroup; 054 this.entityInstance = entityInstance; 055 } 056 057 private EntityAttributeGroupDetail entityAttributeGroupDetail; // Optional, use getEntityAttributeGroupDetail() 058 059 private EntityAttributeGroupDetail getEntityAttributeGroupDetail() { 060 if(entityAttributeGroupDetail == null) { 061 entityAttributeGroupDetail = entityAttributeGroup.getLastDetail(); 062 } 063 064 return entityAttributeGroupDetail; 065 } 066 067 @GraphQLField 068 @GraphQLDescription("entity attribute group name") 069 @GraphQLNonNull 070 public String getEntityAttributeGroupName() { 071 return getEntityAttributeGroupDetail().getEntityAttributeGroupName(); 072 } 073 074 @GraphQLField 075 @GraphQLDescription("is default") 076 @GraphQLNonNull 077 public boolean getIsDefault() { 078 return getEntityAttributeGroupDetail().getIsDefault(); 079 } 080 081 @GraphQLField 082 @GraphQLDescription("sort order") 083 @GraphQLNonNull 084 public int getSortOrder() { 085 return getEntityAttributeGroupDetail().getSortOrder(); 086 } 087 088 @GraphQLField 089 @GraphQLDescription("description") 090 @GraphQLNonNull 091 public String getDescription(final DataFetchingEnvironment env) { 092 var coreControl = Session.getModelController(CoreControl.class); 093 var userControl = Session.getModelController(UserControl.class); 094 095 return coreControl.getBestEntityAttributeGroupDescription(entityAttributeGroup, userControl.getPreferredLanguageFromUserVisit(BaseGraphQl.getUserVisit(env))); 096 } 097 098 099 @GraphQLField 100 @GraphQLDescription("entity attributes") 101 @GraphQLNonNull 102 @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class) 103 public CountingPaginatedData<EntityAttributeObject> getEntityAttributes(final DataFetchingEnvironment env) { 104// if(CoreSecurityUtils.getHasEntityAttributesAccess(env)) { 105 var coreControl = Session.getModelController(CoreControl.class); 106 var entityType = entityInstance == null ? null : entityInstance.getEntityType(); 107 108 long totalCount; 109 if(entityType == null) { 110 totalCount = coreControl.countEntityAttributeEntityAttributeGroupsByEntityAttributeGroup(entityAttributeGroup); 111 } else { 112 totalCount = coreControl.countEntityAttributesByEntityAttributeGroupAndEntityType(entityAttributeGroup, entityType); 113 } 114 115 try(var objectLimiter = new ObjectLimiter(env, EntityAttributeConstants.COMPONENT_VENDOR_NAME, EntityAttributeConstants.ENTITY_TYPE_NAME, totalCount)) { 116 Collection<EntityAttribute> entities; 117 if(entityType == null) { 118 var entityAttributeGroupEntityAttributes = coreControl.getEntityAttributeEntityAttributeGroupsByEntityAttributeGroup(entityAttributeGroup); 119 120 entities = new ArrayList<>(entityAttributeGroupEntityAttributes.size()); 121 entityAttributeGroupEntityAttributes.forEach(eagea -> entities.add(eagea.getEntityAttribute())); 122 } else { 123 entities = coreControl.getEntityAttributesByEntityAttributeGroupAndEntityType(entityAttributeGroup, entityType); 124 } 125 126 var entityAttributes = new ArrayList<EntityAttributeObject>(entities.size()); 127 128 entities.forEach((entity) -> entityAttributes.add(new EntityAttributeObject(entity, entityInstance))); 129 130 return new CountedObjects<>(objectLimiter, entityAttributes); 131 } 132// } else { 133// return Connections.emptyConnection(); 134// } 135 } 136 137 @GraphQLField 138 @GraphQLDescription("entity attribute entity attribute groups") 139 public Collection<EntityAttributeEntityAttributeGroupObject> getEntityAttributeEntityAttributeGroups(final DataFetchingEnvironment env) { 140 Collection<EntityAttributeEntityAttributeGroupObject> entityAttributeEntityAttributeGroupObjects = null; 141 142 if(CoreSecurityUtils.getHasEntityAttributeEntityAttributeGroupsAccess(env)) { 143 var coreControl = Session.getModelController(CoreControl.class); 144 var entityAttributeEntityAttributeGroups = coreControl.getEntityAttributeEntityAttributeGroupsByEntityAttributeGroup(entityAttributeGroup); 145 146 entityAttributeEntityAttributeGroupObjects = new ArrayList<>(entityAttributeEntityAttributeGroups.size()); 147 148 for(var entityAttributeEntityAttributeGroup : entityAttributeEntityAttributeGroups) { 149 entityAttributeEntityAttributeGroupObjects.add(new EntityAttributeEntityAttributeGroupObject(entityAttributeEntityAttributeGroup)); 150 } 151 } 152 153 return entityAttributeEntityAttributeGroupObjects; 154 } 155 156}