Пример #1
0
        private JObject SerializeRelationships(ResourceGraphNode node, FieldsetProperty fieldset)
        {
            if (!node.Relationships.Any())
            {
                return(null);
            }

            var response = new JObject();

            foreach (var kv in node.Relationships)
            {
                if (fieldset != null && !fieldset.Fields.Contains(kv.Value.Relationship.Name.ToComparablePropertyName()))
                {
                    continue;
                }

                var relationship = kv.Value.Relationship;

                var item = new JObject();

                var data = SerializeRelationshipData(node, kv.Value);

                var relationshipId = default(string);

                if (data != null &&
                    relationship.Kind == RelationshipKind.BelongsTo &&
                    kv.Value.SourceObject != null)
                {
                    relationshipId = (string)data["id"];
                }

                var links   = new JObject();
                var self    = _urlBuilder.BuildRelationshipPath(node.Resource, node.Key.Id.ToString(), relationship);
                var related = _urlBuilder.BuildRelationshipPath(node.Resource, node.Key.Id.ToString(), relationship, relationshipId);

                if (!string.IsNullOrEmpty(self) && relationship.LinkType.HasFlag(LinkType.Self))
                {
                    AddUrl(links, "self", self);
                }

                if (!string.IsNullOrEmpty(related) && relationship.LinkType.HasFlag(LinkType.Related))
                {
                    AddUrl(links, "related", related);
                }

                if (links.HasValues)
                {
                    item["links"] = links;
                }

                if (data != null && kv.Value != null)
                {
                    item["data"] = data;
                }

                response[_propertyNameConverter.ToJsonPropertyName(kv.Key)] = item;
            }

            return(response);
        }
Пример #2
0
        private JObject SerializeAttributes(ResourceGraphNode node, FieldsetProperty fieldset)
        {
            var attributeHash = node.Resource.Attributes
                                .Where(a =>
                                       node.SourceObject.IncludesProperty(_propertyNameConverter.ToModelPropertyName(a.InternalName)) && fieldset.Fields.Contains(a.InternalName.ToComparablePropertyName()))
                                .Select(a =>
                                        new
            {
                Key   = _propertyNameConverter.ToJsonPropertyName(a.InternalName),
                Value = node.SourceObject.GetValueOfProperty(_propertyNameConverter.ToModelPropertyName(a.InternalName))
            })
                                .ToDictionary(
                kvp => kvp.Key,
                kvp => kvp.Value);

            return(JObject.FromObject(attributeHash, _serializer));
        }
Пример #3
0
        private JObject SerializeNode(ResourceGraphNode node, bool isCollection)
        {
            var response = new JObject
            {
                ["type"] = node.Key.Type,
                ["id"]   = JToken.FromObject(node.Key.Id)
            };

            if (isCollection)
            {
                var self = _urlBuilder.BuildCanonicalPath(node.Resource, node.Key.Id.ToString());

                if (!string.IsNullOrEmpty(self) && node.Resource.LinkType.HasFlag(LinkType.Self))
                {
                    response["links"] = AddUrl(new JObject(), "self", self);
                }
            }

            JObject attributes = null;

            if (_fieldsetContext != null && _fieldsetContext.Properties.Count(property => property.Type == node.Key.Type) > 0)
            {
                FieldsetProperty fieldset = _fieldsetContext.Properties.Where(property => property.Type == node.Key.Type).First();
                attributes = SerializeAttributes(node, fieldset);
            }
            else
            {
                attributes = SerializeAttributes(node);
            }

            if (attributes != null)
            {
                response["attributes"] = attributes;
            }

            var relationships = SerializeRelationships(node);

            if (relationships != null)
            {
                response["relationships"] = relationships;
            }

            return(response);
        }
Пример #4
0
        private JObject SerializeAttributes(ResourceGraphNode node, FieldsetProperty fieldset)
        {
            // The source serializer uses a SourceContractResolver to ensure that we only serialize the properties needed
            var serializedSourceObject = JObject.FromObject(node.SourceObject, _sourceSerializer);
            var attributeHash          = node.Resource.Attributes
                                         .Where(a =>
                                                node.SourceObject.IncludesProperty(_propertyNameConverter.ToModelPropertyName(a.InternalName)) && fieldset.Fields.Contains(a.InternalName.ToComparablePropertyName()))
                                         .Select(a =>
                                                 new
            {
                Key   = _propertyNameConverter.ToJsonPropertyName(a.InternalName),
                Value = serializedSourceObject.SelectToken(_propertyNameConverter.ToJsonPropertyName(a.InternalName)) ??
                        serializedSourceObject.SelectToken(a.PropertyName)
            })
                                         .ToDictionary(
                kvp => kvp.Key,
                kvp => kvp.Value);

            return(JObject.FromObject(attributeHash, _serializer));
        }