Current section

Files

Jump to
udia lib udia_web controllers post_controller.ex
Raw

lib/udia_web/controllers/post_controller.ex

defmodule UdiaWeb.PostController do
use UdiaWeb, :controller
import Ecto.Query
alias Udia.Logs
alias Udia.Logs.Post
plug Guardian.Plug.EnsureAuthenticated, [handler: UdiaWeb.SessionController] when action in [:create, :update, :delete]
action_fallback UdiaWeb.FallbackController
def index(conn, params) do
page =
Post
|> order_by(desc: :updated_at)
|> Udia.Repo.paginate(params)
posts = page.entries
|> Udia.Repo.preload(:author)
render(conn, "index.json", posts: posts, pagination: UdiaWeb.PaginationHelpers.pagination(page))
end
def create(conn, post_params) do
cur_user = Guardian.Plug.current_resource(conn)
case Logs.create_post(cur_user, post_params) do
{:ok, post_versioned} ->
post = Map.get(post_versioned, :model)
post = Udia.Repo.preload(post, :author)
conn
|> put_status(:created)
|> put_resp_header("location", post_path(conn, :show, post))
|> render("show.json", post: post)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(UdiaWeb.ChangesetView, "error.json", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
post = Logs.get_post!(id)
post = Udia.Repo.preload(post, :author)
render(conn, "show.json", post: post)
end
def update(conn, %{"id" => id, "post" => post_params}) do
post = Logs.get_post!(id)
post = Udia.Repo.preload(post, :author)
cur_user = Guardian.Plug.current_resource(conn)
if cur_user.id != post.author_id do
conn
|> put_status(:forbidden)
|> render(UdiaWeb.SessionView, "forbidden.json", error: "Invalid user")
else
case Logs.update_post(cur_user, post, post_params) do
{:ok, post_versioned} ->
post = Map.get(post_versioned, :model)
post = Udia.Repo.preload(post, :author)
conn
|> put_status(:accepted)
|> render("show.json", post: post)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(UdiaWeb.ChangesetView, "error.json", changeset: changeset)
end
end
end
def delete(conn, %{"id" => id}) do
cur_user = Guardian.Plug.current_resource(conn)
post = Logs.get_post!(id)
if cur_user.id != post.author_id do
conn
|> put_status(:forbidden)
|> render(UdiaWeb.SessionView, "forbidden.json", error: "Invalid user")
else
Logs.delete_post(post)
send_resp(conn, :no_content, "")
end
end
end