From 1ffceda1d99d448c36a3fdf69cfa3e101d7e0929 Mon Sep 17 00:00:00 2001 From: Matteo Costantini Date: Fri, 4 Sep 2020 16:20:49 +0200 Subject: [PATCH 1/4] Add support for comma-separated filter values --- lib/jsonapi/plugs/query_parser.ex | 9 ++++++++- test/jsonapi/plugs/query_parser_test.exs | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/jsonapi/plugs/query_parser.ex b/lib/jsonapi/plugs/query_parser.ex index b598112e..1171b66e 100644 --- a/lib/jsonapi/plugs/query_parser.ex +++ b/lib/jsonapi/plugs/query_parser.ex @@ -113,7 +113,7 @@ defmodule JSONAPI.QueryParser do Enum.reduce(filter, config, fn {key, val}, acc -> check_filter_validity!(opts_filter, key, config) - %{acc | filter: Keyword.put(acc.filter, String.to_atom(key), val)} + %{acc | filter: Keyword.put(acc.filter, String.to_atom(key), parse_filter_value(val))} end) end @@ -123,6 +123,13 @@ defmodule JSONAPI.QueryParser do end end + defp parse_filter_value(value) do + case String.split(value, ",") do + [value] -> value + values -> values + end + end + @spec parse_fields(Config.t(), map()) :: Config.t() | no_return() def parse_fields(%Config{} = config, fields) when fields == %{}, do: config diff --git a/test/jsonapi/plugs/query_parser_test.exs b/test/jsonapi/plugs/query_parser_test.exs index 29c1ef58..848dad1e 100644 --- a/test/jsonapi/plugs/query_parser_test.exs +++ b/test/jsonapi/plugs/query_parser_test.exs @@ -67,6 +67,12 @@ defmodule JSONAPI.QueryParserTest do assert filter[:name] == "jason" end + test "parse_filter/2 handles multiple comma-separated filter values" do + config = struct(Config, opts: [filter: ~w(name)], view: MyView) + filter = parse_filter(config, %{"name" => "jason,api"}).filter + assert filter[:name] == ["jason", "api"] + end + test "parse_filter/2 raises on invalid filters" do config = struct(Config, opts: [], view: MyView) From dd819ed59ed7eb6e1cd4148692a046fca94f88ce Mon Sep 17 00:00:00 2001 From: Matteo Costantini Date: Mon, 12 Oct 2020 15:13:38 +0200 Subject: [PATCH 2/4] Make filter values separator configurable and disabled by default --- lib/jsonapi/plugs/query_parser.ex | 10 +++++++++- test/jsonapi/plugs/query_parser_test.exs | 16 +++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/jsonapi/plugs/query_parser.ex b/lib/jsonapi/plugs/query_parser.ex index 1171b66e..5e549f6b 100644 --- a/lib/jsonapi/plugs/query_parser.ex +++ b/lib/jsonapi/plugs/query_parser.ex @@ -124,7 +124,15 @@ defmodule JSONAPI.QueryParser do end defp parse_filter_value(value) do - case String.split(value, ",") do + :jsonapi + |> Application.get_env(:filter_values_separator, nil) + |> do_parse_filter_value(value) + end + + defp do_parse_filter_value(nil, value), do: value + + defp do_parse_filter_value(separator, value) do + case String.split(value, separator) do [value] -> value values -> values end diff --git a/test/jsonapi/plugs/query_parser_test.exs b/test/jsonapi/plugs/query_parser_test.exs index 848dad1e..d7e08ea7 100644 --- a/test/jsonapi/plugs/query_parser_test.exs +++ b/test/jsonapi/plugs/query_parser_test.exs @@ -36,11 +36,10 @@ defmodule JSONAPI.QueryParserTest do end setup do + previous_env = System.get_env() Application.put_env(:jsonapi, :field_transformation, :underscore) - on_exit(fn -> - Application.delete_env(:jsonapi, :field_transformation) - end) + on_exit(fn -> System.put_env(previous_env) end) {:ok, []} end @@ -67,12 +66,19 @@ defmodule JSONAPI.QueryParserTest do assert filter[:name] == "jason" end - test "parse_filter/2 handles multiple comma-separated filter values" do + test "parse_filter/2 handles multiple comma-separated filter values if configured" do + Application.put_env(:jsonapi, :filter_values_separator, ";") config = struct(Config, opts: [filter: ~w(name)], view: MyView) - filter = parse_filter(config, %{"name" => "jason,api"}).filter + filter = parse_filter(config, %{"name" => "jason;api"}).filter assert filter[:name] == ["jason", "api"] end + test "parse_filter/2 does not does not parse comma-separated filter values if not configured" do + config = struct(Config, opts: [filter: ~w(name)], view: MyView) + filter = parse_filter(config, %{"name" => "jason;api"}).filter + assert filter[:name] == "jason;api" + end + test "parse_filter/2 raises on invalid filters" do config = struct(Config, opts: [], view: MyView) From d94a853f774e77a856ad500e06ede679bf9d7248 Mon Sep 17 00:00:00 2001 From: Matteo Costantini Date: Mon, 12 Oct 2020 15:23:24 +0200 Subject: [PATCH 3/4] Fix parse_filter/2 tests --- test/jsonapi/plugs/query_parser_test.exs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/jsonapi/plugs/query_parser_test.exs b/test/jsonapi/plugs/query_parser_test.exs index d7e08ea7..25bd370c 100644 --- a/test/jsonapi/plugs/query_parser_test.exs +++ b/test/jsonapi/plugs/query_parser_test.exs @@ -36,10 +36,11 @@ defmodule JSONAPI.QueryParserTest do end setup do - previous_env = System.get_env() Application.put_env(:jsonapi, :field_transformation, :underscore) - on_exit(fn -> System.put_env(previous_env) end) + on_exit(fn -> + Application.delete_env(:jsonapi, :field_transformation) + end) {:ok, []} end @@ -74,6 +75,7 @@ defmodule JSONAPI.QueryParserTest do end test "parse_filter/2 does not does not parse comma-separated filter values if not configured" do + Application.delete_env(:jsonapi, :filter_values_separator) config = struct(Config, opts: [filter: ~w(name)], view: MyView) filter = parse_filter(config, %{"name" => "jason;api"}).filter assert filter[:name] == "jason;api" From 770df7fd24195668e468d871e105d5d031233960 Mon Sep 17 00:00:00 2001 From: Matteo Costantini Date: Wed, 14 Oct 2020 16:10:00 +0200 Subject: [PATCH 4/4] Restore env after tests --- test/jsonapi/plugs/query_parser_test.exs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/jsonapi/plugs/query_parser_test.exs b/test/jsonapi/plugs/query_parser_test.exs index 25bd370c..c57f1b1e 100644 --- a/test/jsonapi/plugs/query_parser_test.exs +++ b/test/jsonapi/plugs/query_parser_test.exs @@ -36,11 +36,10 @@ defmodule JSONAPI.QueryParserTest do end setup do + previous_env = System.get_env() Application.put_env(:jsonapi, :field_transformation, :underscore) - on_exit(fn -> - Application.delete_env(:jsonapi, :field_transformation) - end) + on_exit(fn -> System.put_env(previous_env) end) {:ok, []} end