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.AppearanceControl;
020import com.echothree.model.control.core.server.control.EntityInstanceControl;
021import com.echothree.model.control.core.server.control.EntityLockControl;
022import com.echothree.model.control.core.server.control.EventControl;
023import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject;
024import com.echothree.model.control.graphql.server.graphql.count.Connections;
025import com.echothree.model.control.graphql.server.graphql.count.CountedObjects;
026import com.echothree.model.control.graphql.server.graphql.count.CountingDataConnectionFetcher;
027import com.echothree.model.control.graphql.server.graphql.count.CountingPaginatedData;
028import com.echothree.model.control.graphql.server.util.BaseGraphQl;
029import com.echothree.model.control.graphql.server.util.count.ObjectLimiter;
030import com.echothree.model.data.core.common.EventConstants;
031import com.echothree.model.data.core.server.entity.EntityInstance;
032import com.echothree.util.server.persistence.EntityDescriptionUtils;
033import com.echothree.util.server.persistence.EntityNamesUtils;
034import com.echothree.util.server.persistence.Session;
035import graphql.annotations.annotationTypes.GraphQLDescription;
036import graphql.annotations.annotationTypes.GraphQLField;
037import graphql.annotations.annotationTypes.GraphQLName;
038import graphql.annotations.annotationTypes.GraphQLNonNull;
039import graphql.annotations.connection.GraphQLConnection;
040import graphql.schema.DataFetchingEnvironment;
041import java.util.ArrayList;
042
043@GraphQLDescription("entity instance object")
044@GraphQLName("EntityInstance")
045public class EntityInstanceObject
046        extends BaseEntityInstanceObject {
047    
048    private EntityInstance entityInstance; // Always Present
049    
050    public EntityInstanceObject(EntityInstance entityInstance) {
051        super(entityInstance);
052
053        this.entityInstance = entityInstance;
054    }
055    
056    @GraphQLField
057    @GraphQLDescription("entity type")
058    @GraphQLNonNull
059    public EntityTypeObject getEntityType() {
060        return new EntityTypeObject(entityInstance.getEntityType());
061    }
062    
063    @GraphQLField
064    @GraphQLDescription("entity unique id")
065    @GraphQLNonNull
066    public Long getEntityUniqueId() {
067        return entityInstance.getEntityUniqueId();
068    }
069
070    @GraphQLField
071    @GraphQLDescription("uuid")
072    @GraphQLNonNull
073    public String getUuid() {
074        var entityInstanceControl = Session.getModelController(EntityInstanceControl.class);
075
076        entityInstance = entityInstanceControl.ensureUuidForEntityInstance(entityInstance, false);
077
078        return entityInstance.getUuid();
079    }
080
081    @GraphQLField
082    @GraphQLDescription("entity ref")
083    @GraphQLNonNull
084    public String getEntityRef() {
085        var entityTypeDetail = entityInstance.getEntityType().getLastDetail();
086
087        return entityTypeDetail.getComponentVendor().getLastDetail().getComponentVendorName() +
088                '.' + entityTypeDetail.getEntityTypeName() +
089                '.' + entityInstance.getEntityUniqueId();
090    }
091
092    @GraphQLField
093    @GraphQLDescription("entity time")
094    public EntityTimeObject getEntityTime() {
095        var eventControl = Session.getModelController(EventControl.class);
096        var entityTime = eventControl.getEntityTime(entityInstance);
097        
098        return entityTime == null ? null : new EntityTimeObject(entityTime);
099    }
100    
101    @GraphQLField
102    @GraphQLDescription("entity visit")
103    public EntityVisitObject getEntityVisit(final DataFetchingEnvironment env) {
104        var eventControl = Session.getModelController(EventControl.class);
105        var entityInstanceControl = Session.getModelController(EntityInstanceControl.class);
106        var userSession = BaseGraphQl.getUserSession(env);
107        var visitingEntityInstance = userSession == null ? null : entityInstanceControl.getEntityInstanceByBasePK(userSession.getPartyPK());
108        var entityVisit = visitingEntityInstance == null ? null : eventControl.getEntityVisit(visitingEntityInstance, entityInstance);
109        
110        return entityVisit == null ? null : new EntityVisitObject(entityVisit);
111    }
112    
113    @GraphQLField
114    @GraphQLDescription("entity appearance")
115    public EntityAppearanceObject getEntityAppearance() {
116        var appearanceControl = Session.getModelController(AppearanceControl.class);
117        var entityAppearance = appearanceControl.getEntityAppearance(entityInstance);
118        
119        return entityAppearance == null ? null : new EntityAppearanceObject(entityAppearance);
120    }
121
122    @GraphQLField
123    @GraphQLDescription("entity lock")
124    public EntityLockObject getEntityLock(final DataFetchingEnvironment env) {
125        var entityLockControl = Session.getModelController(EntityLockControl.class);
126        var userVisit = BaseGraphQl.getUserVisit(env);
127        var entityLockTransfer = entityLockControl.getEntityLockTransferByEntityInstance(userVisit, entityInstance);
128
129        return entityLockTransfer == null ? null : new EntityLockObject(entityLockTransfer);
130    }
131
132    @GraphQLField
133    @GraphQLDescription("entity names")
134    public EntityNamesObject getEntityNames(final DataFetchingEnvironment env) {
135        var entityNamesMapping = EntityNamesUtils.getInstance().getEntityNames(entityInstance);
136
137        return entityNamesMapping == null ? null : new EntityNamesObject(entityNamesMapping.getEntityNames());
138    }
139
140    @GraphQLField
141    @GraphQLDescription("description")
142    public String getDescription(final DataFetchingEnvironment env) {
143        var userVisit = BaseGraphQl.getUserVisit(env);
144
145        return EntityDescriptionUtils.getInstance().getDescription(userVisit, entityInstance);
146    }
147
148    @GraphQLField
149    @GraphQLDescription("events")
150    @GraphQLNonNull
151    @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class)
152    public CountingPaginatedData<EventObject> getEvents(final DataFetchingEnvironment env) {
153        if(CoreSecurityUtils.getHasEventsAccess(env)) {
154            var eventControl = Session.getModelController(EventControl.class);
155            var totalCount = eventControl.countEventsByEntityInstance(getEntityInstanceByBasePK());
156
157            try(var objectLimiter = new ObjectLimiter(env, EventConstants.COMPONENT_VENDOR_NAME, EventConstants.ENTITY_TYPE_NAME, totalCount)) {
158                var entities = eventControl.getEventsByEntityInstance(getEntityInstanceByBasePK());
159                var events = new ArrayList<EventObject>(entities.size());
160
161                for(var entity : entities) {
162                    var eventobject = new EventObject(entity);
163
164                    events.add(eventobject);
165                }
166
167                return new CountedObjects<>(objectLimiter, events);
168            }
169        } else {
170            return Connections.emptyConnection();
171        }
172    }
173
174}