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}