Skip to content

Commit c945aff

Browse files
fix incorrect ordering of serialized lists
1 parent 78ca704 commit c945aff

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

lib/jsonapi/serializer.ex

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ defmodule JSONAPI.Serializer do
4848
def encode_data(_view, nil, _conn, _query_includes, _options), do: {[], nil}
4949

5050
def encode_data(view, data, conn, query_includes, options) when is_list(data) do
51-
Enum.map_reduce(data, [], fn d, acc ->
52-
{to_include, encoded_data} = encode_data(view, d, conn, query_includes, options)
53-
{to_include, Enum.reverse([encoded_data | acc])}
54-
end)
51+
{to_include, encoded_data} =
52+
Enum.map_reduce(data, [], fn d, acc ->
53+
{to_include, encoded_data} = encode_data(view, d, conn, query_includes, options)
54+
{to_include, [encoded_data | acc]}
55+
end)
56+
{to_include, Enum.reverse(encoded_data)}
5557
end
5658

5759
def encode_data(view, data, conn, query_includes, options) do
@@ -115,9 +117,10 @@ defmodule JSONAPI.Serializer do
115117
query_includes
116118
# credo:disable-for-next-line
117119
|> Enum.reduce([], fn
118-
{^relationship_name, value}, acc -> Enum.reverse([value | acc])
120+
{^relationship_name, value}, acc -> [value | acc]
119121
_, acc -> acc
120122
end)
123+
|> Enum.reverse()
121124
|> List.flatten()
122125
else
123126
[]
@@ -126,7 +129,7 @@ defmodule JSONAPI.Serializer do
126129
{rel_included, encoded_rel} =
127130
encode_data(rel_view, rel_data, conn, rel_query_includes, options)
128131

129-
{Enum.reverse([encoded_rel | rel_included]), acc}
132+
{rel_included ++ [encoded_rel], acc}
130133
else
131134
{nil, acc}
132135
end

test/jsonapi/serializer_test.exs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,24 @@ defmodule JSONAPI.SerializerTest do
277277
assert Enum.count(encoded[:included]) == 4
278278
end
279279

280+
test "serialize keeps the order of a list" do
281+
data1 = %{id: 1}
282+
data2 = %{id: 2}
283+
data3 = %{id: 3}
284+
285+
data_list = [data1, data2, data3]
286+
287+
conn = Plug.Conn.fetch_query_params(%Plug.Conn{})
288+
289+
encoded = Serializer.serialize(PostView, data_list, conn)
290+
291+
assert %{data: [
292+
%{id: "1"},
293+
%{id: "2"},
294+
%{id: "3"}
295+
]} = encoded
296+
end
297+
280298
test "serialize handles an empty relationship" do
281299
data = %{
282300
id: 1,

0 commit comments

Comments
 (0)