public void Transform_UpdateDocument_To_Delta_OneField() { // Arrange var updateDocument = new UpdateDocument { Data = new Dictionary<string, object> { { "posts", JObject.FromObject(new PostUpdateOneField() { Title = "Food" }) } } }; var configuration = (new ConfigurationBuilder()) .Resource<Post>() .WithSimpleProperty(x => x.AuthorId) .WithSimpleProperty(x => x.Id) .WithSimpleProperty(x => x.Title); var context = new Context { Configuration = configuration.ConfigurationBuilder.Build() }; var sut = new JsonApiTransformer() { TransformationHelper = new TransformationHelper() }; // Act var resultDelta = sut.TransformBack(updateDocument, typeof(Post), context); // Assert resultDelta.ObjectPropertyValues.ContainsKey("title").ShouldBeTrue(); }
public void Transform_properties_with_reserverd_keyword() { var updateDocument = new UpdateDocument() { Data = new Dictionary<string, object>() { { "posts", JObject.Parse("{ \"_id\":123, \"title\": \"someTitle\" }") } } }; var configuration = (new ConfigurationBuilder()) .Resource<Post>() .WithSimpleProperty(x => x.AuthorId) .WithSimpleProperty(x => x.Id) .WithSimpleProperty(x => x.Title); var context = new Context { Configuration = configuration.ConfigurationBuilder.Build() }; var sut = new JsonApiTransformer() { TransformationHelper = new TransformationHelper() }; // Act var resultDelta = sut.TransformBack(updateDocument, typeof(Post), context); // Assert resultDelta.ObjectPropertyValues.ContainsKey("id").ShouldBeTrue(); }
public UpdateDocumentTypeWrapper(UpdateDocument updateDocument, Type type) { UpdateDocument = updateDocument; Type = type; }
private void ValidateUpdateDocument(UpdateDocument updateDocument) { if (updateDocument == null) { throw new JsonException("Json body can not be empty or whitespace."); } if (updateDocument.Data == null) { throw new JsonException("Json body should contain some content."); } }
public IDelta TransformBack(UpdateDocument updateDocument, Type type, Context context) { var mapping = context.Configuration.GetMapping(type); var openGeneric = typeof(Delta<>); var closedGenericType = openGeneric.MakeGenericType(type); var delta = Activator.CreateInstance(closedGenericType) as IDelta; if (delta == null) { return null; } var resourceKey = mapping.ResourceType; if (!updateDocument.Data.ContainsKey(resourceKey)) { return delta; } var resource = updateDocument.Data[resourceKey] as JObject; if (resource == null) { return delta; } // Scan the data for which properties are only set foreach (var propertySetter in mapping.PropertySettersExpressions) { JToken value; resource.TryGetValue(propertySetter.Key, StringComparison.CurrentCultureIgnoreCase, out value); if (value == null) { continue; } // Set only the properties that are present var methodCallExpression = propertySetter.Value.Body as MethodCallExpression; if (methodCallExpression != null) { Type returnType = methodCallExpression.Arguments[0].Type; var resultValue = TransformationHelper.GetValue(value, returnType); string key = propertySetter.Key.TrimStart('_'); delta.ObjectPropertyValues.Add(key, resultValue); } } JToken linksToken; resource.TryGetValue("links", StringComparison.CurrentCultureIgnoreCase, out linksToken); JObject links = linksToken as JObject; if (links != null) { foreach (var link in mapping.Relationships) { JToken value; links.TryGetValue(link.RelationshipName, StringComparison.CurrentCultureIgnoreCase, out value); if (value == null) { continue; } if (link.IsCollection) { var property = link.RelatedCollectionProperty; if (property != null) { var resultValue = TransformationHelper.GetCollection(value, link); string key = link.RelationshipName.TrimStart('_'); delta.ObjectPropertyValues.Add(key, resultValue); } } else { delta.ObjectPropertyValues.Add(link.ParentResourceNavigationPropertyName, TransformationHelper.GetValue(value, link.ParentResourceNavigationPropertyType)); } } } return delta; }