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); }
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)); }
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); }
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)); }