Skip to content

Instantly share code, notes, and snippets.

@hassox
Created October 22, 2014 00:53

Revisions

  1. Daniel Neighman created this gist Oct 22, 2014.
    10 changes: 10 additions & 0 deletions application_controller.ex
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,10 @@
    defmodule CloseBy.ApplicationController do

    defmacro __using__(_opts) do
    quote do
    use Phoenix.Controller
    import CloseBy.ApplicationController
    alias CloseBy.Router
    end
    end
    end
    53 changes: 53 additions & 0 deletions user_controller.ex
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    defmodule CloseBy.UserController do
    use CloseBy.ApplicationController
    plug :action

    def call(conn, opts) do
    conn = Phoenix.Plugs.ContentTypeFetcher.fetch(conn)
    try do
    super(conn, opts)
    rescue
    Ecto.NotSingleResult -> conn |> put_status(404) |> render("show", errors: %{message: "Not Found"})
    end
    end

    def new(conn, params) do
    user_params = params["user"] || %{}
    user = %User{ email: user_params["email"] }
    render conn, "new", user: user
    end

    def edit(conn, params) do
    user = fetch_user(params["id"])
    render conn, "show", user: user
    end

    def create(conn, params) do
    user_params = params["user"] || %{}
    user = %User{ email: user_params["email"] }
    |> User.set_password(user_params["password"], user_params["confirm_password"])

    case User.validate(user) do
    [] ->
    user = CloseBy.Repo.insert(user)
    redirect conn, CloseBy.Router.Helpers.users_path(:show, user.id)
    errors ->
    conn |> put_status(422) |> render "new", user: user, errors: errors
    end
    end

    def index(conn, _params) do
    users = User.Query.all
    render conn, "index", users: users
    end

    def show(conn, %{"id" => the_id }) do
    user = fetch_user(the_id)
    render conn, "show", user: user
    end

    defp fetch_user(the_id) do
    { id, _ } = Integer.parse(the_id)
    CloseBy.Repo.get! User, id
    end
    end
    9 changes: 9 additions & 0 deletions user_query.ex
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    defmodule User.Query do
    import Ecto.Query

    def all do
    query = from user in User,
    select: user
    CloseBy.Repo.all(query)
    end
    end
    5 changes: 5 additions & 0 deletions user_serializer.ex
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    defmodule Serializers.User do
    def basic(user) do
    Map.take(user, [:email, :id])
    end
    end
    11 changes: 11 additions & 0 deletions user_view.ex
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    defmodule CloseBy.UserView do
    use CloseBy.Views
    use Jazz

    def render("index.json", %{users: users}) do
    JSON.encode! users |> Enum.map &Serializers.User.basic(&1)
    end

    def render("show.json", %{conn: conn, errors: errors}), do: JSON.encode!(errors)
    def render("show.json", %{user: user}), do: JSON.encode!(Serializers.User.basic(user))
    end