Skip to content

Commit d01c956

Browse files
protestContestmattpolzin
authored andcommitted
fix incorrect ordering of serialized lists
1 parent 78ca704 commit d01c956

2 files changed

Lines changed: 31 additions & 6 deletions

File tree

lib/jsonapi/serializer.ex

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,13 @@ 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+
57+
{to_include, Enum.reverse(encoded_data)}
5558
end
5659

5760
def encode_data(view, data, conn, query_includes, options) do
@@ -115,9 +118,10 @@ defmodule JSONAPI.Serializer do
115118
query_includes
116119
# credo:disable-for-next-line
117120
|> Enum.reduce([], fn
118-
{^relationship_name, value}, acc -> Enum.reverse([value | acc])
121+
{^relationship_name, value}, acc -> [value | acc]
119122
_, acc -> acc
120123
end)
124+
|> Enum.reverse()
121125
|> List.flatten()
122126
else
123127
[]
@@ -126,7 +130,8 @@ defmodule JSONAPI.Serializer do
126130
{rel_included, encoded_rel} =
127131
encode_data(rel_view, rel_data, conn, rel_query_includes, options)
128132

129-
{Enum.reverse([encoded_rel | rel_included]), acc}
133+
# credo:disable-for-next-line
134+
{rel_included ++ [encoded_rel], acc}
130135
else
131136
{nil, acc}
132137
end

test/jsonapi/serializer_test.exs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,26 @@ 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 %{
292+
data: [
293+
%{id: "1"},
294+
%{id: "2"},
295+
%{id: "3"}
296+
]
297+
} = encoded
298+
end
299+
280300
test "serialize handles an empty relationship" do
281301
data = %{
282302
id: 1,

0 commit comments

Comments
 (0)