request parsing fix
This commit is contained in:
parent
312be30733
commit
032ea859fb
11
calls.api
11
calls.api
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"body": {
|
|
||||||
"content": "",
|
|
||||||
"file": false,
|
|
||||||
"fileSize": false
|
|
||||||
},
|
|
||||||
"headers": {},
|
|
||||||
"method": "GET",
|
|
||||||
"title": "New HTTP Request",
|
|
||||||
"url": ""
|
|
||||||
}
|
|
@ -8,6 +8,7 @@ defmodule DrainCloudCoreWeb.AuthController do
|
|||||||
|
|
||||||
def register(conn = %Plug.Conn{}, _params) do
|
def register(conn = %Plug.Conn{}, _params) do
|
||||||
req = Request.from_request(conn)
|
req = Request.from_request(conn)
|
||||||
|
|
||||||
Log.debug("new register request: #{req}")
|
Log.debug("new register request: #{req}")
|
||||||
|
|
||||||
model = Request.to_model(req)
|
model = Request.to_model(req)
|
||||||
@ -31,22 +32,10 @@ defmodule DrainCloudCoreWeb.AuthController.RegisterRequest do
|
|||||||
alias DrainCloudCore.Auth.Users, as: User
|
alias DrainCloudCore.Auth.Users, as: User
|
||||||
alias DrainCloudCoreWeb.Errors.InvalidArgumentException, as: InvalidArgumentException
|
alias DrainCloudCoreWeb.Errors.InvalidArgumentException, as: InvalidArgumentException
|
||||||
|
|
||||||
def from_request(conn) do
|
def from_request(conn = %Plug.Conn{}) do
|
||||||
res = Plug.Conn.read_body(conn)
|
:logger.debug("[from_request] incoming request: #{Kernel.inspect(conn.params)}")
|
||||||
:logger.warning(Kernel.inspect(res))
|
|
||||||
|
|
||||||
case res do
|
validate_and_build(conn.params)
|
||||||
{:error, _} ->
|
|
||||||
raise "failed to read request body: #{:error}"
|
|
||||||
|
|
||||||
{_, data, _} ->
|
|
||||||
req = Poison.decode!(data, as: %Request{})
|
|
||||||
validate_request(req)
|
|
||||||
req
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
raise "failed to read request body. unexpected result #{Kernel.inspect(res)}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_model(req = %Request{}) do
|
def to_model(req = %Request{}) do
|
||||||
@ -56,22 +45,45 @@ defmodule DrainCloudCoreWeb.AuthController.RegisterRequest do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp validate_request(req = %Request{}) do
|
defp validate_and_build(req) do
|
||||||
if String.length(req.login) < 3 do
|
validate(req)
|
||||||
|
|> build
|
||||||
|
end
|
||||||
|
|
||||||
|
defp validate(req) do
|
||||||
|
validate_login(req)
|
||||||
|
|> validate_password
|
||||||
|
end
|
||||||
|
|
||||||
|
defp validate_login(req) do
|
||||||
|
if String.length(Map.get(req, "login")) >= 3 do
|
||||||
|
req
|
||||||
|
else
|
||||||
raise InvalidArgumentException, %{
|
raise InvalidArgumentException, %{
|
||||||
message: "login must be 3 symbols at minimum",
|
message: "login must be 3 symbols at minimum",
|
||||||
args: ["login"]
|
args: ["login"]
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if String.length(req.password) < 8 do
|
|
||||||
raise InvalidArgumentException, %{
|
|
||||||
message: "password must be 8 symbols at minimum",
|
|
||||||
args: ["password"]
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp validate_password(req) do
|
||||||
|
if String.length(Map.get(req, "password")) >= 8 do
|
||||||
|
req
|
||||||
|
else
|
||||||
|
raise InvalidArgumentException, %{
|
||||||
|
message: "password must be 8 symbols at minimum",
|
||||||
|
args: ["password"]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp build(req) do
|
||||||
|
%Request{
|
||||||
|
login: Map.get(req, "login"),
|
||||||
|
password: Map.get(req, "password")
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
defimpl String.Chars, for: DrainCloudCoreWeb.AuthController.RegisterRequest do
|
defimpl String.Chars, for: DrainCloudCoreWeb.AuthController.RegisterRequest do
|
||||||
def to_string(req) do
|
def to_string(req) do
|
||||||
case Jason.encode(req) do
|
case Jason.encode(req) do
|
||||||
|
@ -2,11 +2,15 @@ defmodule DrainCloudCoreWeb.Errors.InvalidArgumentException do
|
|||||||
alias __MODULE__, as: InvalidArgumentException
|
alias __MODULE__, as: InvalidArgumentException
|
||||||
defexception [:message, :args]
|
defexception [:message, :args]
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def exception(%{message: message, args: args}) do
|
||||||
|
%InvalidArgumentException{message: message, args: args}
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def exception(term) do
|
def exception(term) do
|
||||||
case term do
|
case term do
|
||||||
[] -> %InvalidArgumentException{}
|
[] -> %InvalidArgumentException{}
|
||||||
{message, args} -> %InvalidArgumentException{message: message, args: args}
|
|
||||||
_ -> %InvalidArgumentException{message: "Error: " <> term}
|
_ -> %InvalidArgumentException{message: "Error: " <> term}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user