Page MenuHomePhorge

No OneTemporary

Size
21 KB
Referenced Files
None
Subscribers
None
diff --git a/examples/phoenix_app/config/config.exs b/examples/phoenix_app/config/config.exs
index 14ac247..4a72716 100644
--- a/examples/phoenix_app/config/config.exs
+++ b/examples/phoenix_app/config/config.exs
@@ -1,17 +1,13 @@
use Mix.Config
config :phoenix_app, PhoenixAppWeb.Endpoint,
url: [host: "localhost"],
render_errors: [view: PhoenixAppWeb.ErrorView, accepts: ~w(json)]
config :phoenix_app, ecto_repos: [PhoenixApp.Repo]
-config :phoenix_app, PhoenixApp.Repo,
- adapter: Sqlite.Ecto2,
- database: "priv/repo/phoenix_app.db"
-
config :logger, :console,
format: "$time $metadata[$level] $message\n",
metadata: [:request_id]
import_config "#{Mix.env}.exs"
diff --git a/examples/phoenix_app/config/dev.exs b/examples/phoenix_app/config/dev.exs
index 2d01f9b..e4038ac 100644
--- a/examples/phoenix_app/config/dev.exs
+++ b/examples/phoenix_app/config/dev.exs
@@ -1,10 +1,14 @@
use Mix.Config
config :phoenix_app, PhoenixAppWeb.Endpoint,
http: [port: 4000],
debug_errors: true,
code_reloader: true,
check_origin: false
config :logger, :console, format: "[$level] $message\n"
config :phoenix, :stacktrace_depth, 20
+
+config :phoenix_app, PhoenixApp.Repo,
+ adapter: Sqlite.Ecto2,
+ database: "priv/repo/phoenix_app_dev.db"
diff --git a/examples/phoenix_app/config/test.exs b/examples/phoenix_app/config/test.exs
index 7ded3bd..0b2b3d8 100644
--- a/examples/phoenix_app/config/test.exs
+++ b/examples/phoenix_app/config/test.exs
@@ -1,11 +1,14 @@
use Mix.Config
config :phoenix_app, PhoenixAppWeb.Endpoint,
http: [port: 4001],
server: false
config :logger, level: :warn
config :phoenix_app, PhoenixApp.Repo,
pool: Ecto.Adapters.SQL.Sandbox
+config :phoenix_app, PhoenixApp.Repo,
+ adapter: Sqlite.Ecto2,
+ database: "priv/repo/phoenix_app_test.db"
diff --git a/examples/phoenix_app/test/phoenix_app_web/controllers/user_controller_test.exs b/examples/phoenix_app/test/phoenix_app_web/controllers/user_controller_test.exs
index e292dc5..ee3b8ad 100644
--- a/examples/phoenix_app/test/phoenix_app_web/controllers/user_controller_test.exs
+++ b/examples/phoenix_app/test/phoenix_app_web/controllers/user_controller_test.exs
@@ -1,57 +1,57 @@
defmodule PhoenixAppWeb.UserControllerTest do
use PhoenixAppWeb.ConnCase, async: true
import OpenApiSpex.Test.Assertions
setup do
%{spec: PhoenixAppWeb.ApiSpec.spec()}
end
test "create user", %{conn: conn, spec: spec} do
conn
|> Plug.Conn.put_req_header("content-type", "application/json")
- |> post(user_path(conn, :create), %{"user" => %{"name" => "Joe", "email" => "joe@gmail.com"}, "group_id" => 1})
+ |> post(user_path(conn, :create, 1), %{"user" => %{"name" => "Joe", "email" => "joe@gmail.com"}})
|> json_response(201)
|> assert_schema("UserResponse", spec)
end
test "get user", %{conn: conn, spec: spec} do
%{id: id} = PhoenixApp.Repo.insert!(%PhoenixApp.Accounts.User{name: "Carl", email: "Carl@yahoo.com"})
conn
|> Plug.Conn.put_req_header("accept", "application/json")
|> get(user_path(conn, :show, id))
|> json_response(200)
|> assert_schema("UserResponse", spec)
end
test "list users", %{conn: conn, spec: spec} do
%{id: id1} = PhoenixApp.Repo.insert!(%PhoenixApp.Accounts.User{name: "Aaron", email: "aaron@hotmail.com"})
%{id: id2} = PhoenixApp.Repo.insert!(%PhoenixApp.Accounts.User{name: "Benjamin", email: "ben@lycos.com"})
%{id: id3} = PhoenixApp.Repo.insert!(%PhoenixApp.Accounts.User{name: "Chuck", email: "chuck@aol.com"})
response =
conn
|> Plug.Conn.put_req_header("accept", "application/json")
|> get(user_path(conn, :index))
|> json_response(200)
|> assert_schema("UsersResponse", spec)
assert [%{id: ^id1}, %{id: ^id2}, %{id: ^id3}] = response.data
end
test "User schema example", %{spec: spec} do
assert_schema(PhoenixAppWeb.Schemas.User.schema().example, "User", spec)
end
test "UserRequest schema example", %{spec: spec} do
assert_schema(PhoenixAppWeb.Schemas.UserRequest.schema().example, "UserRequest", spec)
end
test "UserResponse schema example", %{spec: spec} do
assert_schema(PhoenixAppWeb.Schemas.UserResponse.schema().example, "UserResponse", spec)
end
test "UsersResponse schema example", %{spec: spec} do
assert_schema(PhoenixAppWeb.Schemas.UsersResponse.schema().example, "UsersResponse", spec)
end
-end
\ No newline at end of file
+end
diff --git a/examples/plug_app/config/config.exs b/examples/plug_app/config/config.exs
index a1eb420..dfd0bac 100644
--- a/examples/plug_app/config/config.exs
+++ b/examples/plug_app/config/config.exs
@@ -1,12 +1,12 @@
# This file is responsible for configuring your application
# and its dependencies with the aid of the Mix.Config module.
use Mix.Config
config :plug_app, ecto_repos: [PlugApp.Repo]
config :plug_app, PlugApp.Repo,
adapter: Sqlite.Ecto2,
- database: "priv/repo/plug_app.db"
+ database: "priv/repo/plug_app_#{Mix.env()}.db"
config :logger, level: :debug
diff --git a/examples/plug_app/lib/plug_app/user_handler.ex b/examples/plug_app/lib/plug_app/user_handler.ex
index 6a2761f..668110f 100644
--- a/examples/plug_app/lib/plug_app/user_handler.ex
+++ b/examples/plug_app/lib/plug_app/user_handler.ex
@@ -1,117 +1,118 @@
defmodule PlugApp.UserHandler do
alias OpenApiSpex.Operation
alias PlugApp.{Accounts, Accounts.User}
alias PlugApp.Schemas
import OpenApiSpex.Operation, only: [parameter: 5, request_body: 4, response: 3]
defmodule Index do
use Plug.Builder
plug OpenApiSpex.Plug.Cast, operation_id: "UserHandler.Index"
plug OpenApiSpex.Plug.Validate
plug :index
def open_api_operation(_) do
%Operation{
tags: ["users"],
summary: "List users",
description: "List all useres",
operationId: "UserHandler.Index",
responses: %{
200 => response("User List Response", "application/json", Schemas.UsersResponse)
}
}
end
def index(conn, _opts) do
users = Accounts.list_users()
conn
|> Plug.Conn.put_resp_header("Content-Type", "application/json")
|> Plug.Conn.send_resp(200, render(users))
end
def render(users) do
%{
data: Enum.map(users, &Map.take(&1, [:id, :name, :email]))
}
|> Poison.encode!(pretty: true)
end
end
defmodule Show do
use Plug.Builder
plug OpenApiSpex.Plug.Cast, operation_id: "UserHandler.Show"
plug OpenApiSpex.Plug.Validate
plug :load
plug :show
def open_api_operation(_) do
%Operation{
tags: ["users"],
summary: "Show user",
description: "Show a user by ID",
operationId: "UserHandler.Show",
parameters: [
parameter(:id, :path, :integer, "User ID", example: 123, minimum: 1)
],
responses: %{
200 => response("User", "application/json", Schemas.UserResponse)
}
}
end
def load(conn = %Plug.Conn{params: %{id: id}}, _opts) do
case Accounts.get_user!(id) do
nil ->
conn
- |> put_resp_header("Content-Type", "application/json")
+ |> put_resp_content_type("application/json")
|> send_resp(404, ~s({"error": "User not found"}))
|> halt()
user -> assign(conn, :user, user)
end
end
def show(conn = %Plug.Conn{assigns: %{user: user}}, _opts) do
conn
|> put_resp_header("Content-Type", "application/json")
|> send_resp(200, render(user))
end
def render(user) do
%{
data: Map.take(user, [:id, :name, :email])
}
|> Poison.encode!(pretty: true)
end
end
defmodule Create do
use Plug.Builder
plug OpenApiSpex.Plug.Cast, operation_id: "UserHandler.Create"
plug OpenApiSpex.Plug.Validate
plug :create
def open_api_operation(_) do
%Operation{
tags: ["users"],
summary: "Create user",
description: "Create a user",
operationId: "UserHandler.Create",
requestBody: request_body("The user attributes", "application/json", Schemas.UserRequest, required: true),
responses: %{
201 => response("User", "application/json", Schemas.UserResponse)
}
}
end
- def create(conn = %Plug.Conn{params: %Schemas.UserRequest{user: user_params}}, _opts) do
+ def create(conn = %Plug.Conn{body_params: %Schemas.UserRequest{user: user_params}}, _opts) do
with {:ok, %User{} = user} <- Accounts.create_user(user_params) do
conn
- |> Plug.Conn.send_resp(201, Show.render(user))
+ |> put_resp_content_type("application/json")
+ |> send_resp(201, Show.render(user))
end
end
end
-end
\ No newline at end of file
+end
diff --git a/examples/plug_app/mix.exs b/examples/plug_app/mix.exs
index 8ceaab1..e00bd07 100644
--- a/examples/plug_app/mix.exs
+++ b/examples/plug_app/mix.exs
@@ -1,34 +1,34 @@
defmodule PlugApp.Mixfile do
use Mix.Project
def project do
[
app: :plug_app,
version: "0.1.0",
elixir: "~> 1.5",
- start_permanent: Mix.env == :prod,
+ start_permanent: Mix.env() == :prod,
deps: deps()
]
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger],
mod: {PlugApp.Application, []}
]
end
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:open_api_spex, path: "../../"},
- {:cowboy, "~> 1.0"},
+ {:plug_cowboy, "~> 1.0"},
{:plug, "~> 1.0"},
{:ecto, "~> 2.2"},
{:sqlite_ecto2, "~> 2.2"}
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
]
end
end
diff --git a/examples/plug_app/mix.lock b/examples/plug_app/mix.lock
index b5d3270..82c8edd 100644
--- a/examples/plug_app/mix.lock
+++ b/examples/plug_app/mix.lock
@@ -1,15 +1,19 @@
-%{"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [], [], "hexpm"},
- "cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [], [{:cowlib, "~> 1.0.2", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"},
- "cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [], [], "hexpm"},
- "db_connection": {:hex, :db_connection, "1.1.2", "2865c2a4bae0714e2213a0ce60a1b12d76a6efba0c51fbda59c9ab8d1accc7a8", [], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
- "decimal": {:hex, :decimal, "1.4.1", "ad9e501edf7322f122f7fc151cce7c2a0c9ada96f2b0155b8a09a795c2029770", [], [], "hexpm"},
- "ecto": {:hex, :ecto, "2.2.6", "3fd1067661d6d64851a0d4db9acd9e884c00d2d1aa41cc09da687226cf894661", [], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
- "esqlite": {:hex, :esqlite, "0.2.3", "1a8b60877fdd3d50a8a84b342db04032c0231cc27ecff4ddd0d934485d4c0cd5", [], [], "hexpm"},
- "mime": {:hex, :mime, "1.1.0", "01c1d6f4083d8aa5c7b8c246ade95139620ef8effb009edde934e0ec3b28090a", [], [], "hexpm"},
- "plug": {:hex, :plug, "1.4.3", "236d77ce7bf3e3a2668dc0d32a9b6f1f9b1f05361019946aae49874904be4aed", [], [{:cowboy, "~> 1.0.1 or ~> 1.1", [hex: :cowboy, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}], "hexpm"},
- "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [], [], "hexpm"},
- "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [], [], "hexpm"},
- "ranch": {:hex, :ranch, "1.3.2", "e4965a144dc9fbe70e5c077c65e73c57165416a901bd02ea899cfd95aa890986", [], [], "hexpm"},
- "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [], [], "hexpm"},
- "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.2.2", "7a3e5c0521e1cb6e30a4907ba4d952b97db9b2ab5d1a4806ceeb66a10b23ba65", [], [{:connection, "~> 1.0.3", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1.0", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "~> 2.2.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.3", [hex: :esqlite, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.3.2 or ~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm"},
- "sqlitex": {:hex, :sqlitex, "1.3.3", "3aac5fd702be346f71d9de6e01702c9954484cd0971aa443490bb3bde045d919", [], [{:decimal, "~> 1.1", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.3", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"}}
+%{
+ "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"},
+ "cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"},
+ "cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], [], "hexpm"},
+ "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
+ "decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"},
+ "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
+ "esqlite": {:hex, :esqlite, "0.2.4", "3a8a352c190afe2d6b828b252a6fbff65b5cc1124647f38b15bdab3bf6fd4b3e", [:rebar3], [], "hexpm"},
+ "mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"},
+ "plug": {:hex, :plug, "1.7.1", "8516d565fb84a6a8b2ca722e74e2cd25ca0fc9d64f364ec9dbec09d33eb78ccd", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}], "hexpm"},
+ "plug_cowboy": {:hex, :plug_cowboy, "1.0.0", "2e2a7d3409746d335f451218b8bb0858301c3de6d668c3052716c909936eb57a", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
+ "plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"},
+ "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"},
+ "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], [], "hexpm"},
+ "ranch": {:hex, :ranch, "1.3.2", "e4965a144dc9fbe70e5c077c65e73c57165416a901bd02ea899cfd95aa890986", [:rebar3], [], "hexpm"},
+ "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm"},
+ "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm"},
+ "sqlitex": {:hex, :sqlitex, "1.4.3", "a50f12d6aeb25f4ebb128453386c09bbba8f5abd3c7713dc5eaa92f359926ac5", [:mix], [{:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"},
+}
diff --git a/lib/open_api_spex/plug/cast.ex b/lib/open_api_spex/plug/cast.ex
index 34571ed..70b2a38 100644
--- a/lib/open_api_spex/plug/cast.ex
+++ b/lib/open_api_spex/plug/cast.ex
@@ -1,88 +1,92 @@
defmodule OpenApiSpex.Plug.Cast do
@moduledoc """
Module plug that will cast the `Conn.params` and `Conn.body_params` according to the schemas defined for the operation.
Note that when using this plug, the body params are no longer merged into `Conn.params` and must be read from `Conn.body_params`
separately.
The operation_id can be given at compile time as an argument to `init`:
plug OpenApiSpex.Plug.Cast, operation_id: "MyApp.ShowUser"
For phoenix applications, the operation_id can be obtained at runtime automatically.
defmodule MyAppWeb.UserController do
use Phoenix.Controller
plug OpenApiSpex.Plug.Cast
...
end
If you want customize the error response, you can provide the `:render_error` option to register a plug which creates
a custom response in the case of a validation error.
## Example
defmodule MyAppWeb.UserController do
use Phoenix.Controller
plug OpenApiSpex.Plug.Cast,
render_error: MyApp.RenderError
...
end
defmodule MyApp.RenderError do
def init(opts), do: opts
def call(conn, reason) do
msg = %{error: reason} |> Posion.encode!()
conn
|> Conn.put_resp_content_type("application/json")
|> Conn.send_resp(400, msg)
end
end
"""
@behaviour Plug
alias Plug.Conn
@impl Plug
- def init(opts), do: Keyword.put_new(opts, :render_error, OpenApiSpex.Plug.DefaultRenderError)
+ def init(opts) do
+ opts
+ |> Map.new()
+ |> Map.put_new(:render_error, OpenApiSpex.Plug.DefaultRenderError)
+ end
@impl Plug
- def call(conn = %{private: %{open_api_spex: private_data}}, operation_id: operation_id, render_error: render_error) do
+ def call(conn = %{private: %{open_api_spex: private_data}}, %{operation_id: operation_id, render_error: render_error}) do
spec = private_data.spec
operation = private_data.operation_lookup[operation_id]
- content_type = Conn.get_req_header(conn, "content-type")
+ content_type = Conn.get_req_header(conn, "content-type")
|> Enum.at(0, "")
|> String.split(";")
|> Enum.at(0)
private_data = Map.put(private_data, :operation_id, operation_id)
conn = Conn.put_private(conn, :open_api_spex, private_data)
case OpenApiSpex.cast(spec, operation, conn, content_type) do
{:ok, conn} -> conn
{:error, reason} ->
opts = render_error.init(reason)
conn
|> render_error.call(opts)
|> Plug.Conn.halt()
end
end
def call(conn = %{private: %{phoenix_controller: controller, phoenix_action: action, open_api_spex: _pd}}, opts) do
operation_id = controller.open_api_operation(action).operationId
if (operation_id) do
- call(conn, Keyword.put(opts, :operation_id, operation_id))
+ call(conn, Map.put(opts, :operation_id, operation_id))
else
raise "operationId was not found in action API spec"
end
end
def call(_conn = %{private: %{open_api_spex: _pd}}, _opts) do
raise ":operation_id was neither provided nor inferred from conn. Consider putting plug OpenApiSpex.Plug.Cast rather into your phoenix controller."
end
def call(_conn, _opts) do
raise ":open_api_spex was not found under :private. Maybe OpenApiSpex.Plug.PutApiSpec was not called before?"
end
end

File Metadata

Mime Type
text/x-diff
Expires
Sun, Dec 1, 7:56 AM (1 d, 21 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41636
Default Alt Text
(21 KB)

Event Timeline