Skip to content

Commit 36b974a

Browse files
committed
Nested properties support added to QueryStringExtensions.
1 parent 6aa5851 commit 36b974a

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

src/ByteAether.QueryLink.Test/HttpExtensionsTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,4 +318,21 @@ private static void AssertDefinitionsEqual(Definitions expected, Definitions act
318318
}
319319
}
320320

321+
[Fact]
322+
public void ToQueryString_NestedProperties_EncodesCorrectly()
323+
{
324+
var definitions = new Definitions
325+
{
326+
Filters = [new("Address.Street", FilterOperator.Eq, "Main St")],
327+
Orders = [new("Address.City.Name", true)]
328+
};
329+
330+
var query = definitions.ToQueryString();
331+
332+
Assert.Contains("filter[]=Address%2EStreet%3dMain+St", query);
333+
Assert.Contains("order=-Address%2ECity%2EName", query);
334+
335+
var parsedDefinitions = QueryStringExtensions.FromQueryString(query);
336+
AssertDefinitionsEqual(definitions, parsedDefinitions);
337+
}
321338
}

src/ByteAether.QueryLink/QueryStringExtensions.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ public static string ToQueryString(
5757
)
5858
.Append(definitions.Orders.Any() ? $"&{orderKey}=" : string.Empty)
5959
.Append(
60-
string.Join(',', definitions.Orders
61-
.Select(ToQueryString)
60+
string.Join(
61+
',',
62+
definitions.Orders.Select(ToQueryString)
6263
)
6364
)
6465
.ToString();
@@ -90,12 +91,9 @@ public static Definitions FromQueryString(
9091
var valParts = _filterSplitter.Split(queryParam.Value, 2);
9192
var op = _operatorFromStringMap[valParts[1]];
9293
var filterValue = StringValueParser.Parse(valParts[2]);
94+
var decodedName = HttpUtility.UrlDecode(valParts[0]).Replace("%2E", ".");
9395

94-
filters.Add(new FilterDefinition<object?>(
95-
valParts[0],
96-
_operatorFromStringMap[valParts[1]],
97-
filterValue
98-
));
96+
filters.Add(new FilterDefinition<object?>(decodedName, op, filterValue));
9997
}
10098
else if (queryParam.Key == orderKey)
10199
{
@@ -104,7 +102,7 @@ public static Definitions FromQueryString(
104102
.Select(part =>
105103
{
106104
var isReversed = part[0] == '-';
107-
var fieldName = part.TrimStart('-', '+');
105+
var fieldName = HttpUtility.UrlDecode(part.TrimStart('-', '+')).Replace("%2E", ".");
108106
return new OrderDefinition(fieldName, isReversed);
109107
})
110108
);
@@ -119,7 +117,7 @@ public static Definitions FromQueryString(
119117
}
120118

121119
private static string ToQueryString(OrderDefinition def)
122-
=> HttpUtility.UrlEncode((def.IsReversed ? "-" : string.Empty) + def.Name);
120+
=> HttpUtility.UrlEncode((def.IsReversed ? "-" : string.Empty) + def.Name).Replace(".", "%2E");
123121

124122
private static string ToQueryString<T>(FilterDefinition<T> def)
125123
{
@@ -129,6 +127,6 @@ private static string ToQueryString<T>(FilterDefinition<T> def)
129127
? "[" + string.Join(',', (def.Value as IEnumerable)!.OfType<object>().Select(x => x.ToString()?.Replace(",", "\\,"))) + "]"
130128
: def.Value?.ToString();
131129

132-
return HttpUtility.UrlEncode($"{def.Name}{_operatorToStringMap[def.Operation]}{valueSet}");
130+
return HttpUtility.UrlEncode($"{def.Name}{_operatorToStringMap[def.Operation]}{valueSet}").Replace(".", "%2E");
133131
}
134132
}

0 commit comments

Comments
 (0)