private async Task <object> GetValue(
            TypeAccessor edgeObjectTypeAccessor,
            ConnectionEdge connectionEdge,
            IGraphRequestContext graphRequestContext,
            List <ConnectionEdgeDestinationFilter> connectionEdgeDestinationFilters,
            QueryExecutionContext queryExecutionContext)
        {
            var member           = edgeObjectTypeAccessor.GetMembers().Single(x => x.Name == connectionEdge.MetaFieldName);
            var destTypeAccessor = TypeAccessor.Create(member.Type);
            var destQueryMember  = destTypeAccessor.GetMembers().Single(m => m.GetAttribute(typeof(KeyAttribute), true) != null);
            var qp = new QueryStep();

            qp.QueryParameters.Add(new QueryParameter
            {
                ContextValue = new ContextValue {
                    Comparison = Comparisons.Equal, Values = new List <object> {
                        connectionEdge.DestinationId
                    }
                },
                MemberModel = new ModelMember(member.Type, destTypeAccessor, destQueryMember, false)
            });

            if (connectionEdgeDestinationFilters != null)
            {
                connectionEdgeDestinationFilters.Where(x => x.Type == member.Type.AssemblyQualifiedName)
                .ToList().ForEach(connectionEdgeDestinationFilter =>
                {
                    qp.QueryParameters.Add(new QueryParameter
                    {
                        ContextValue = new ContextValue {
                            Comparison = Comparisons.Equal, Values = connectionEdgeDestinationFilter.Mapper(queryExecutionContext)
                        },
                        MemberModel = connectionEdgeDestinationFilter.ModelMember
                    });
                });
            }

            var entities = (await _graphQlRepositoryProvider.QueryAsync(EntityQueryName, qp, graphRequestContext)).ToList();

            if (entities.Count > 1)
            {
                throw new InvalidOperationException(MultipleEntitiesDetectedError);
            }

            return(entities.SingleOrDefault());
        }
        private QueryStep CreateQueryStep(ConnectionEdge connectionEdge)
        {
            var qp               = new QueryStep();
            var destType         = Type.GetType(connectionEdge.SourceType);
            var destTypeAccessor = TypeAccessor.Create(destType);
            var destQueryMember  = destTypeAccessor.GetMembers().Single(m => m.Name.ToLower() == connectionEdge.DestinationFieldName.ToLower());

            qp.QueryParameters.Add(new QueryParameter
            {
                ContextValue = new ContextValue {
                    Comparison = Comparisons.Equal, Values = new List <object> {
                        connectionEdge.DestinationId
                    }
                },
                MemberModel = new ModelMember(destType, destTypeAccessor, destQueryMember, false)
            });
            return(qp);
        }
Beispiel #3
0
        private void HandleConnectionEdge(
            string sourceId,
            Type sourceType,
            Type edgeType,
            string sourceFieldName,
            object edgeObjectInstance,
            List <ConnectionEdge> connectionEdges,
            InternalConnectionEdgeState internalConnectionEdgeState,
            Action <object> entityAction,
            bool isListEdge)
        {
            var edgeTypeAccessor = TypeAccessor.Create(edgeType);

            var connectionEdge = new ConnectionEdge
            {
                SourceType      = sourceType.AssemblyQualifiedName,
                SourceFieldName = sourceFieldName,
                SourceId        = sourceId,
                MetaType        = edgeType.AssemblyQualifiedName
            };

            Member destinationId    = null;
            Member destinationModel = null;

            foreach (var edgeMember in edgeTypeAccessor.GetMembers())
            {
                var connectionEdgeDestinationKey = edgeMember.GetAttribute(typeof(ConnectionEdgeDestinationKeyAttribute),
                                                                           false) as ConnectionEdgeDestinationKeyAttribute;

                if (connectionEdgeDestinationKey != null)
                {
                    destinationId = edgeMember;
                }
                else
                {
                    var connectionEdgeDestination = edgeMember.GetAttribute(typeof(ConnectionEdgeDestinationAttribute),
                                                                            false) as ConnectionEdgeDestinationAttribute;

                    if (connectionEdgeDestination != null)
                    {
                        destinationModel = edgeMember;
                    }
                }
            }

            if (destinationId == null)
            {
                throw new InvalidProgramException("Property with ConnectionEdgeDestinationKeyAttribute is required on a Connection.");
            }

            if (destinationModel == null)
            {
                throw new InvalidProgramException("Property with ConnectionEdgeDestinationAttribute is required on a Connection.");
            }

            var destId = edgeTypeAccessor[edgeObjectInstance, destinationId.Name];

            if (destId == null)
            {
                throw new InvalidProgramException("Value on property with ConnectionEdgeDestinationKeyAttribute is required!");
            }

            // Eval destination model instance first.
            var destObject = edgeTypeAccessor[edgeObjectInstance, destinationModel.Name];

            if (destObject != null)
            {
                var id = destId.ToString();
                DiscoverConnectionEdges(id, destObject, connectionEdges, internalConnectionEdgeState, entityAction);
                internalConnectionEdgeState.InvokeAction(destObject, id, destinationModel.Type.Name);
                edgeTypeAccessor[edgeObjectInstance, destinationModel.Name] = null;
            }

            connectionEdge.DestinationId = destId.ToString();

            connectionEdge.Id = isListEdge ?
                                $"{connectionEdge.SourceFieldName}_src{connectionEdge.SourceId}_des{connectionEdge.DestinationId}" :
                                $"{connectionEdge.SourceFieldName}_{connectionEdge.SourceId}";

            connectionEdge.MetaFieldName = destinationModel.Name;
            connectionEdge.MetaValue     = JsonConvert.SerializeObject(edgeObjectInstance);
            connectionEdges.Add(connectionEdge);
        }