mirror of
https://github.com/mitchell/shortnr.git
synced 2025-12-19 14:07:22 +00:00
First working iteration of shortnr api
This commit is contained in:
parent
7ff70d452a
commit
9ee9eddbfa
8 changed files with 147 additions and 12 deletions
|
|
@ -4,16 +4,23 @@ defmodule Shortnr.Transport.Http do
|
|||
@type ok_error :: {:ok, term(), Plug.Conn.t()} | error()
|
||||
@type error :: {:error, {atom(), String.t()}, Plug.Conn.t()}
|
||||
|
||||
@spec handle(ok_error(), (term() -> ok_error())) :: ok_error()
|
||||
@spec handle(ok_error(), (... -> ok_error())) :: ok_error()
|
||||
def handle(error = {:error, _sub_error, _conn}, _func), do: error
|
||||
|
||||
def handle({:ok, request, conn}, func) do
|
||||
def handle({:ok, request, conn}, func) when is_function(func, 1) do
|
||||
case func.(request) do
|
||||
{:ok, response} -> {:ok, response, conn}
|
||||
{:error, error_value} -> convert_error(error_value, conn)
|
||||
end
|
||||
end
|
||||
|
||||
def handle({:ok, _request, conn}, func) when is_function(func, 0) do
|
||||
case func.() do
|
||||
{:ok, response} -> {:ok, response, conn}
|
||||
{:error, error_value} -> convert_error(error_value, conn)
|
||||
end
|
||||
end
|
||||
|
||||
defp convert_error({:invalid_argument, message}, conn),
|
||||
do: {:error, {:bad_request, message}, conn}
|
||||
|
||||
|
|
@ -24,12 +31,18 @@ defmodule Shortnr.Transport.Http do
|
|||
send_resp(original_conn, status_to_code(status), body)
|
||||
end
|
||||
|
||||
def send({:ok, body, conn}, :found, _original_conn) do
|
||||
conn = put_resp_header(conn, "Location", URI.to_string(body))
|
||||
send_resp(conn, status_to_code(:found), URI.to_string(body))
|
||||
end
|
||||
|
||||
def send({:ok, body, conn}, success_status, _original_conn) do
|
||||
send_resp(conn, status_to_code(success_status), body)
|
||||
end
|
||||
|
||||
defp status_to_code(:ok), do: 200
|
||||
defp status_to_code(:created), do: 201
|
||||
defp status_to_code(:found), do: 302
|
||||
defp status_to_code(:bad_request), do: 400
|
||||
defp status_to_code(:not_found), do: 404
|
||||
defp status_to_code(:internal_server_error), do: 500
|
||||
|
|
|
|||
30
lib/transport/text.ex
Normal file
30
lib/transport/text.ex
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
defmodule Shortnr.Transport.Text do
|
||||
import Plug.Conn
|
||||
alias Shortnr.Transport.Http
|
||||
alias Shortnr.URL
|
||||
|
||||
@spec decode_request(Plug.Conn.t()) :: Http.ok_error()
|
||||
def decode_request(conn) do
|
||||
{:ok, body, conn} = read_body(conn)
|
||||
{:ok, body, conn}
|
||||
end
|
||||
|
||||
@spec encode_response(Http.ok_error()) :: Http.ok_error()
|
||||
def encode_response(ok_error = {:error, _, _}), do: ok_error
|
||||
|
||||
def encode_response({:ok, [], conn}) do
|
||||
{:ok, "", conn}
|
||||
end
|
||||
|
||||
def encode_response({:ok, body, conn}) when is_list(body) do
|
||||
{:ok, for(item <- body, into: "", do: "#{item}\n"), conn}
|
||||
end
|
||||
|
||||
def encode_response({:ok, %URL{url: url}, conn}) do
|
||||
{:ok, url, conn}
|
||||
end
|
||||
|
||||
def encode_response({:ok, body, conn}) do
|
||||
{:ok, "#{body}", conn}
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue