@@ -19,20 +19,30 @@ defmodule JSONAPI.Serializer do
1919 @ spec serialize ( View . t ( ) , View . data ( ) , Conn . t ( ) | nil , View . meta ( ) | nil , View . options ( ) ) ::
2020 document ( )
2121 def serialize ( view , data , conn \\ nil , meta \\ nil , options \\ [ ] ) do
22- { query_includes , query_page } =
22+ { query_includes , query_page , includes_post_processor } =
2323 case conn do
24- % Conn { assigns: % { jsonapi_query: % Config { include: include , page: page } } } ->
25- { include , page }
24+ % Conn {
25+ assigns: % {
26+ jsonapi_query: % Config { include: include , page: page , includes_post_processor: includes_post_processor }
27+ }
28+ } ->
29+ { include , page , includes_post_processor }
2630
2731 _ ->
28- { [ ] , nil }
32+ { [ ] , nil , nil }
2933 end
3034
3135 { to_include , encoded_data } = encode_data ( view , data , conn , query_includes , options )
3236
37+ post_process_includes =
38+ case includes_post_processor do
39+ nil -> & Enum . uniq / 1
40+ process -> & process . ( & 1 , query_includes )
41+ end
42+
3343 encoded_data = % {
3444 data: encoded_data ,
35- included: flatten_included ( to_include )
45+ included: flatten_included ( to_include , post_process_includes )
3646 }
3747
3848 encoded_data =
@@ -296,12 +306,12 @@ defmodule JSONAPI.Serializer do
296306 end
297307
298308 # Flatten and unique all the included objects
299- @ spec flatten_included ( keyword ( ) ) :: keyword ( )
300- def flatten_included ( included ) do
309+ @ spec flatten_included ( keyword ( ) , ( keyword ( ) -> keyword ( ) ) ) :: keyword ( )
310+ def flatten_included ( included , post_process ) do
301311 included
302312 |> List . flatten ( )
303313 |> Enum . reject ( & is_nil / 1 )
304- |> Enum . uniq ( )
314+ |> post_process . ( )
305315 end
306316
307317 defp assoc_loaded? ( nil ) , do: serialize_nil_relationships? ( )
0 commit comments