Skip to content

Commit 7e31746

Browse files
authored
add converter for product search facets (#375)
1 parent 4672750 commit 7e31746

File tree

4 files changed

+139
-0
lines changed

4 files changed

+139
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.IO;
2+
using commercetools.Sdk.Api.Models.ProductSearches;
3+
using FluentAssertions;
4+
using Xunit;
5+
6+
namespace commercetools.Api.Serialization.Tests
7+
{
8+
public class ProductSearchDeserializationTest : IClassFixture<SerializationFixture>
9+
{
10+
private readonly SerializationFixture _serializationFixture;
11+
12+
public ProductSearchDeserializationTest(SerializationFixture serializationFixture)
13+
{
14+
this._serializationFixture = serializationFixture;
15+
}
16+
17+
[Fact]
18+
public void FacetDeserialization()
19+
{
20+
var serializerService = this._serializationFixture.SerializerService;
21+
var serialized = File.ReadAllText("Resources/ProductSearch/facets.json");
22+
var deserialized = serializerService.Deserialize<IProductPagedSearchResponse>(serialized);
23+
Assert.NotNull(deserialized);
24+
var facets = deserialized.Facets;
25+
var bucket = Assert.IsAssignableFrom<IProductSearchFacetResultBucket>(facets[0]);
26+
Assert.Equal("supplierName", bucket.Name);
27+
Assert.Equal("Example Inc.", bucket.Buckets[0].Key);
28+
Assert.Equal(77, bucket.Buckets[0].Count);
29+
var count = Assert.IsAssignableFrom<IProductSearchFacetResultCount>(facets[1]);
30+
Assert.Equal("supplierCounts", count.Name);
31+
Assert.Equal(10, count.Value);
32+
33+
var serialize = serializerService.Serialize(deserialized);
34+
35+
Assert.Equal("{\"total\":0,\"offset\":0,\"limit\":0,\"facets\":[{\"name\":\"supplierName\",\"buckets\":[{\"key\":\"Example Inc.\",\"count\":77}]},{\"name\":\"supplierCounts\",\"value\":10}]}", serialize);
36+
}
37+
}
38+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"total":0,
3+
"offset": 0,
4+
"limit": 0,
5+
"facets": [
6+
{
7+
"name": "supplierName",
8+
"buckets": [
9+
{
10+
"key": "Example Inc.",
11+
"count": 77
12+
}
13+
]
14+
},
15+
{
16+
"name": "supplierCounts",
17+
"value": 10
18+
}
19+
]
20+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using System.Collections.Generic;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
using commercetools.Sdk.Api.Models.Products;
5+
using commercetools.Base.Serialization;
6+
using commercetools.Base.Serialization.MapperTypeRetrievers;
7+
using commercetools.Sdk.Api.Models.ProductSearches;
8+
using commercetools.Sdk.Api.Serialization.MapperTypeRetrievers;
9+
using Attribute = commercetools.Sdk.Api.Models.Products.Attribute;
10+
using Type = System.Type;
11+
12+
namespace commercetools.Sdk.Api.Serialization.JsonConverters
13+
{
14+
public class ProductSearchFacetConverter : JsonConverter<IProductSearchFacetResult>
15+
{
16+
private readonly ISerializerService _serializerService;
17+
18+
public ProductSearchFacetConverter(ISerializerService serializerService)
19+
{
20+
this._serializerService = serializerService;
21+
}
22+
23+
public override bool CanConvert(Type typeToConvert)
24+
{
25+
return typeof(IProductSearchFacetResult).IsAssignableFrom(typeToConvert);
26+
}
27+
28+
public override IProductSearchFacetResult Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
29+
{
30+
var jsonDocument = JsonDocument.ParseValue(ref reader);
31+
IAttribute attribute;
32+
var rootElement = jsonDocument.RootElement;
33+
if (rootElement.ValueKind == JsonValueKind.Object)
34+
{
35+
var nameProp = rootElement.GetProperty("name");
36+
if (rootElement.TryGetProperty("buckets", out var bucketsElement))
37+
{
38+
return new ProductSearchFacetResultBucket
39+
{
40+
Name = nameProp.GetString(),
41+
Buckets = bucketsElement.ToObject<List<IProductSearchFacetResultBucketEntry>>(_serializerService)
42+
};
43+
}
44+
if (rootElement.TryGetProperty("value", out var valueElement))
45+
{
46+
return new ProductSearchFacetResultCount
47+
{
48+
Name = nameProp.GetString(),
49+
Value = valueElement.GetInt64()
50+
};
51+
}
52+
53+
return new ProductSearchFacetResult
54+
{
55+
Name = nameProp.GetString()
56+
};
57+
}
58+
59+
return null;
60+
}
61+
62+
public override void Write(Utf8JsonWriter writer, IProductSearchFacetResult value,
63+
JsonSerializerOptions options)
64+
{
65+
writer.WriteStartObject();
66+
writer.WriteString("name", value.Name);
67+
if (value is ProductSearchFacetResultBucket bucket)
68+
{
69+
writer.WritePropertyName("buckets");
70+
JsonSerializer.Serialize(writer, bucket.Buckets, options);
71+
}
72+
else if (value is ProductSearchFacetResultCount count) {
73+
writer.WritePropertyName("value");
74+
JsonSerializer.Serialize(writer, count.Value, options);
75+
}
76+
77+
writer.WriteEndObject();
78+
}
79+
}
80+
}

commercetools.Sdk/commercetools.Sdk.Api/Serialization/SerializerService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public SerializerService(
4949
_serializerOptions.Converters.Add(new MessageDeliveryConverter(this));
5050
_serializerOptions.Converters.Add(new CustomDateTimeConverter());
5151
_serializerOptions.Converters.Add(new CustomDateConverter());
52+
_serializerOptions.Converters.Add(new ProductSearchFacetConverter(this));
5253
_serializerOptions.Converters.Add(new FieldContainerConverter(customFieldsMapperTypeRetriever, this));
5354
_serializerOptions.Converters.Add(new AttributeConverter(attributesMapperTypeRetriever, attributeTypeRetriever, this));
5455
_serializerOptions.Converters.Add(new DeserializeAsConverterFactory(

0 commit comments

Comments
 (0)