Current section
Files
Jump to
Current section
Files
lib/kiln/builders/handler.ex
defmodule Kiln.Builders.Handler do
alias Kiln.Builders.Handler
alias Kiln.Responses.{ErrorResponse, Response}
def get_request_user(conn, auth_kind) do
conn.private[auth_kind]
end
def send_error(conn, error, opts) do
case error do
:forbidden ->
Response.send(conn, 403, ErrorResponse.forbidden(), opts)
:not_found ->
Response.send(conn, 404, ErrorResponse.not_found(), opts)
%Ecto.Changeset{} = changeset ->
payload = ErrorResponse.unprocessable(changeset)
Response.send(conn, 422, payload, opts)
_ ->
Response.send(conn, 500, ErrorResponse.unknown(), opts)
end
end
def new_item(conn, controller, opts) do
user = Handler.get_request_user(conn, opts[:auth_kind])
case controller.new(conn.body_params, user) do
{:ok, item} ->
Response.send(conn, 201, item, opts)
{:error, error} ->
Handler.send_error(conn, error, opts)
end
end
def get_items(conn, controller, opts) do
user = Handler.get_request_user(conn, opts[:auth_kind])
count = controller.get_count(conn.query_params, user)
payload = controller.get(conn.query_params, user)
Response.send(conn, 200, payload, Map.put(opts, :items, count))
end
def show_item(conn, controller, id, opts) do
user = Handler.get_request_user(conn, opts[:auth_kind])
case controller.show(id, user) do
[item] -> Response.send(conn, 200, item, opts)
[] -> Response.send(conn, 404, :not_found, opts)
{:error, error} -> Handler.send_error(conn, error, opts)
end
end
def edit_item(conn, controller, id, opts) do
user = Handler.get_request_user(conn, opts[:auth_kind])
case controller.edit(conn.body_params, id, user) do
{:ok, item} ->
Response.send(conn, 200, item, opts)
{:error, error} ->
Handler.send_error(conn, error, opts)
end
end
def delete_item(conn, controller, id, opts) do
user = Handler.get_request_user(conn, opts[:auth_kind])
case controller.delete(id, user) do
{0, nil} ->
Response.send(conn, 404, :not_found, opts)
{_, nil} ->
Response.send(conn, 204, [], opts)
{:error, error} ->
Handler.send_error(conn, error, opts)
end
end
end