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}