Skip to content

Commit

Permalink
Remove matching params before constructing exploded params
Browse files Browse the repository at this point in the history
  • Loading branch information
hamir-suspect committed Jan 3, 2024
1 parent f14596b commit 8683985
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 34 deletions.
2 changes: 2 additions & 0 deletions examples/plug_app/.tool-versions
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
elixir 1.11.4-otp-22
erlang 22.3.4.26
5 changes: 1 addition & 4 deletions examples/plug_app/lib/plug_app/user_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,7 @@ defmodule PlugApp.UserHandler do
end
end

# def show(conn = %Plug.Conn{assigns: %{user: user}}, _opts) do
def show(conn, _opts) do
IO.inspect(conn.params)

def show(conn = %Plug.Conn{assigns: %{user: user}}, _opts) do
user = Accounts.get_user!(conn.params.id)

conn
Expand Down
3 changes: 1 addition & 2 deletions examples/plug_app/mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ defmodule PlugApp.Mixfile do
{:plug, "~> 1.0"},
{:ecto, "~> 2.2"},
{:sqlite_ecto2, "~> 2.4"},
{:jason, "~> 1.0"},
{:cors_plug, "~> 3.0"}
{:jason, "~> 1.0"}
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
]
Expand Down
1 change: 0 additions & 1 deletion examples/plug_app/mix.lock
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
%{
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"},
"cors_plug": {:hex, :cors_plug, "3.0.3", "7c3ac52b39624bc616db2e937c282f3f623f25f8d550068b6710e58d04a0e330", [:mix], [{:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "3f2d759e8c272ed3835fab2ef11b46bddab8c1ab9528167bd463b6452edf830d"},
"cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
"cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
Expand Down
42 changes: 20 additions & 22 deletions lib/open_api_spex/cast_parameters.ex
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ defmodule OpenApiSpex.CastParameters do
properties: parameters |> Map.new(fn p -> {p.name, Parameter.schema(p)} end),
required: parameters |> Enum.filter(& &1.required) |> Enum.map(& &1.name)
}
# |> maybe_combine_oneOfs(parameters, components)
|> maybe_add_additional_properties(components),
parameters_contexts(parameters)
}
Expand Down Expand Up @@ -141,7 +140,23 @@ defmodule OpenApiSpex.CastParameters do
# fields in parameters and combine the parameters in a single struct
# so that the casting can do further work
defp maybe_combine_params(%{} = parameters, %{} = schema, %{} = parameters_contexts) do
Enum.reduce(parameters_contexts, parameters, fn
# first filter out from parameters fields that match non exploding properties.
# we do this because we want to keep the original parameters struct intact
# and not remove fields that are not part of the exploding property

non_exploding_matches = Enum.reduce(parameters, Map.new(), fn {key, value}, acc ->
case Map.get(parameters_contexts, key, %{}) do
%{explode: false} ->
Map.put(acc, key, value)

_ ->
acc
end
end)

possible_exploding_matches = Enum.reject(parameters, &Enum.member?(non_exploding_matches, &1)) |> Map.new()

combined_params = Enum.reduce(parameters_contexts, possible_exploding_matches, fn
{key, %{explode: true}}, parameters ->
# we have exploding property, we need to search for it's possible fields
# and add them under the key into the parameters struct.
Expand All @@ -153,18 +168,15 @@ defmodule OpenApiSpex.CastParameters do
Schema.possible_properties(schema_of_exploding_property)

{struct_params, found_keys} =
Enum.reduce(fields, {Map.new(), []}, fn {field_key, _}, {struct_params, found_keys} ->
Enum.reduce(fields, {Map.new(), []}, fn {field_key, _default}, {struct_params, found_keys} ->
param_field_key = field_key |> Atom.to_string()
val = Map.get(parameters, param_field_key)

{new_params, new_found_keys} =
unless is_nil(val) do
{Map.put(struct_params, param_field_key, val), [param_field_key | found_keys]}
else
{struct_params, found_keys}
end

{new_params, new_found_keys}
end)

parameters
Expand All @@ -174,6 +186,8 @@ defmodule OpenApiSpex.CastParameters do
_, parameters ->
parameters
end)

Map.merge(non_exploding_matches, combined_params)
end

defp pre_parse_parameters(%{} = parameters, %{} = parameters_context, parsers) do
Expand Down Expand Up @@ -250,20 +264,4 @@ defmodule OpenApiSpex.CastParameters do
_ -> schema
end
end

defp maybe_combine_oneOfs(schema, parameters, components) do
# check if any params have explode,
# if so add the properties of it's schema to the top level
# and remove the key for that
%{}
end

defp create_one_of_schemas(parameters) do
if Enum.any?(parameters, fn p ->
p.explode == true and is_list(Parameter.schema(p).oneOf)
end) do
# in this case we need to create multiple schemas. Each of the schemas
# has to have properties defined in other parameters + add required properties
end
end
end
5 changes: 0 additions & 5 deletions test/cast_parameters_test.exs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
defmodule OpenApiSpex.CastParametersTest do
use ExUnit.Case

require IEx

alias OpenApiSpex.{
CastParameters,
Components,
Expand Down Expand Up @@ -205,9 +203,6 @@ defmodule OpenApiSpex.CastParametersTest do
|> Plug.Conn.put_req_header("content-type", "application/json")
|> Plug.Conn.fetch_query_params()

# require IEx
# IEx.pry()

assert {:ok, _} = CastParameters.cast(conn, operation, spec)
end
end
Expand Down

0 comments on commit 8683985

Please sign in to comment.