Exemple #1
0
        /// <summary>
        /// Builds a <see cref="ResourceIdentifierObject"/> for a HasOne relationship.
        /// </summary>
        private ResourceIdentifierObject GetRelatedResourceLinkageForHasOne(HasOneAttribute relationship, IIdentifiable resource)
        {
            var relatedResource = (IIdentifiable)relationship.GetValue(resource);

            if (relatedResource != null)
            {
                return(GetResourceIdentifier(relatedResource));
            }

            return(null);
        }
Exemple #2
0
        private object SetHasOneRelationship(object entity,
                                             PropertyInfo[] entityProperties,
                                             HasOneAttribute attr,
                                             ContextEntity contextEntity,
                                             Dictionary <string, RelationshipData> relationships,
                                             List <ResourceObject> included = null,
                                             List <string> includePaths     = null)
        {
            var relationshipName = attr.PublicRelationshipName;

            if (relationships.TryGetValue(relationshipName, out RelationshipData relationshipData) == false)
            {
                return(entity);
            }

            var rio = (ResourceIdentifierObject)relationshipData.ExposedData;

            var foreignKey         = attr.IdentifiablePropertyName;
            var foreignKeyProperty = entityProperties.FirstOrDefault(p => p.Name == foreignKey);

            if (foreignKeyProperty == null && rio == null)
            {
                return(entity);
            }

            SetHasOneForeignKeyValue(entity, attr, foreignKeyProperty, rio);
            SetHasOneNavigationPropertyValue(entity, attr, rio, included);

            // recursive call ...
            if (included != null)
            {
                var navigationPropertyValue = attr.GetValue(entity);

                var resourceGraphEntity = _jsonApiContext.ResourceGraph.GetContextEntity(attr.DependentType);
                if (navigationPropertyValue != null && resourceGraphEntity != null)

                {
                    var includedResource = included.SingleOrDefault(r => r.Type == rio.Type && r.Id == rio.Id);
                    if (includedResource != null)
                    {
                        var paths = includePaths?.Select(x =>
                        {
                            var tmp = x.Split('.').ToList();
                            tmp.RemoveAt(0);
                            return(string.Join(".", tmp));
                        }).ToList();
                        SetRelationships(navigationPropertyValue, resourceGraphEntity, includedResource.Relationships, included, paths);
                    }
                }
            }

            return(entity);
        }
Exemple #3
0
        /// <summary>
        /// Builds a <see cref="ResourceIdentifierObject"/> for a HasOne relationship
        /// </summary>
        private ResourceIdentifierObject GetRelatedResourceLinkage(HasOneAttribute relationship, IIdentifiable entity)
        {
            var relatedEntity = (IIdentifiable)relationship.GetValue(entity);

            if (relatedEntity == null && IsRequiredToOneRelationship(relationship, entity))
            {
                throw new NotSupportedException("Cannot serialize a required to one relationship that is not populated but was included in the set of relationships to be serialized.");
            }

            if (relatedEntity != null)
            {
                return(GetResourceIdentifier(relatedEntity));
            }

            return(null);
        }
Exemple #4
0
        private object SetHasOneRelationship(object entity,
                                             PropertyInfo[] entityProperties,
                                             HasOneAttribute attr,
                                             ContextEntity contextEntity,
                                             Dictionary <string, RelationshipData> relationships,
                                             List <ResourceObject> included = null)
        {
            var relationshipName = attr.PublicRelationshipName;

            if (relationships.TryGetValue(relationshipName, out RelationshipData relationshipData) == false)
            {
                return(entity);
            }

            var rio = (ResourceIdentifierObject)relationshipData.ExposedData;

            var foreignKey         = attr.IdentifiablePropertyName;
            var foreignKeyProperty = entityProperties.FirstOrDefault(p => p.Name == foreignKey);

            if (foreignKeyProperty == null && rio == null)
            {
                return(entity);
            }

            SetHasOneForeignKeyValue(entity, attr, foreignKeyProperty, rio);
            SetHasOneNavigationPropertyValue(entity, attr, rio, included);

            // recursive call ...
            if (included != null)
            {
                var navigationPropertyValue = attr.GetValue(entity);
                var contextGraphEntity      = _jsonApiContext.ContextGraph.GetContextEntity(attr.Type);
                if (navigationPropertyValue != null && contextGraphEntity != null)
                {
                    var includedResource = included.SingleOrDefault(r => r.Type == rio.Type && r.Id == rio.Id);
                    if (includedResource != null)
                    {
                        SetRelationships(navigationPropertyValue, contextGraphEntity, includedResource.Relationships, included);
                    }
                }
            }

            return(entity);
        }