Skip to content

Commit

Permalink
Added user_book model
Browse files Browse the repository at this point in the history
  • Loading branch information
raymondboswel committed Aug 21, 2017
1 parent 93973a9 commit dc73d4e
Show file tree
Hide file tree
Showing 12 changed files with 447 additions and 0 deletions.
96 changes: 96 additions & 0 deletions lib/amnesia_api/amnesia/amnesia.ex
Original file line number Diff line number Diff line change
Expand Up @@ -965,4 +965,100 @@ defmodule AmnesiaApi.Amnesia do
def change_section_questions(%SectionQuestions{} = section_questions) do
SectionQuestions.changeset(section_questions, %{})
end

alias AmnesiaApi.Amnesia.UserBook

@doc """
Returns the list of user_books.
## Examples
iex> list_user_books()
[%UserBook{}, ...]
"""
def list_user_books do
Repo.all(UserBook)
end

@doc """
Gets a single user_book.
Raises `Ecto.NoResultsError` if the User book does not exist.
## Examples
iex> get_user_book!(123)
%UserBook{}
iex> get_user_book!(456)
** (Ecto.NoResultsError)
"""
def get_user_book!(id), do: Repo.get!(UserBook, id)

@doc """
Creates a user_book.
## Examples
iex> create_user_book(%{field: value})
{:ok, %UserBook{}}
iex> create_user_book(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_user_book(attrs \\ %{}) do
%UserBook{}
|> UserBook.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a user_book.
## Examples
iex> update_user_book(user_book, %{field: new_value})
{:ok, %UserBook{}}
iex> update_user_book(user_book, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_user_book(%UserBook{} = user_book, attrs) do
user_book
|> UserBook.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a UserBook.
## Examples
iex> delete_user_book(user_book)
{:ok, %UserBook{}}
iex> delete_user_book(user_book)
{:error, %Ecto.Changeset{}}
"""
def delete_user_book(%UserBook{} = user_book) do
Repo.delete(user_book)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking user_book changes.
## Examples
iex> change_user_book(user_book)
%Ecto.Changeset{source: %UserBook{}}
"""
def change_user_book(%UserBook{} = user_book) do
UserBook.changeset(user_book, %{})
end
end
20 changes: 20 additions & 0 deletions lib/amnesia_api/amnesia/user_book.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
defmodule AmnesiaApi.Amnesia.UserBook do
use Ecto.Schema
import Ecto.Changeset
alias AmnesiaApi.Amnesia.UserBook


schema "user_books" do
field :user_id, :id
field :book_id, :id

timestamps()
end

@doc false
def changeset(%UserBook{} = user_book, attrs) do
user_book
|> cast(attrs, [])
|> validate_required([])
end
end
51 changes: 51 additions & 0 deletions lib/amnesia_api_web/controllers/user_book_controller.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
defmodule AmnesiaApiWeb.UserBookController do
use AmnesiaApiWeb, :controller

alias AmnesiaApi.Amnesia
alias AmnesiaApi.Amnesia.UserBook
alias AmnesiaApi.Repo

action_fallback AmnesiaApiWeb.FallbackController

def index(conn, _params) do
user_books = Amnesia.list_user_books()
render(conn, "index.json", user_books: user_books)
end

def create(conn, %{"user_book" => %{"user_id" => user_id, "book_id" => book_id}}) do
user_book = Repo.get_by(UserBook, [book_id: book_id, user_id: user_id])
if user_book != nil do
conn
|> put_status(:created)
|> put_resp_header("location", user_book_path(conn, :show, user_book))
|> render("show.json", user_book: user_book)
else
with {:ok, %UserBook{} = user_book} <- Amnesia.create_user_book(user_book_params) do
conn
|> put_status(:created)
|> put_resp_header("location", user_book_path(conn, :show, user_book))
|> render("show.json", user_book: user_book)
end
end
end

def show(conn, %{"id" => id}) do
user_book = Amnesia.get_user_book!(id)
render(conn, "show.json", user_book: user_book)
end

def update(conn, %{"id" => id, "user_book" => user_book_params}) do
user_book = Amnesia.get_user_book!(id)

with {:ok, %UserBook{} = user_book} <- Amnesia.update_user_book(user_book, user_book_params) do
render(conn, "show.json", user_book: user_book)
end
end

def delete(conn, %{"id" => id}) do
user_book = Amnesia.get_user_book!(id)
with {:ok, %UserBook{}} <- Amnesia.delete_user_book(user_book) do
send_resp(conn, :no_content, "")
end
end
end
1 change: 1 addition & 0 deletions lib/amnesia_api_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ defmodule AmnesiaApiWeb.Router do
resources "/users", UserController
post "/users/login", UserController, :login
resources "/books", BookController
resources "/user_books", UserBookController
resources "/authors", AuthorController
resources "/questions", QuestionController
resources "/answers", AnswerController
Expand Down
16 changes: 16 additions & 0 deletions lib/amnesia_api_web/views/user_book_view.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
defmodule AmnesiaApiWeb.UserBookView do
use AmnesiaApiWeb, :view
alias AmnesiaApiWeb.UserBookView

def render("index.json", %{user_books: user_books}) do
%{data: render_many(user_books, UserBookView, "user_book.json")}
end

def render("show.json", %{user_book: user_book}) do
%{data: render_one(user_book, UserBookView, "user_book.json")}
end

def render("user_book.json", %{user_book: user_book}) do
%{id: user_book.id}
end
end
15 changes: 15 additions & 0 deletions priv/repo/migrations/20170821171719_create_user_book.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
defmodule AmnesiaApi.Repo.Migrations.CreateUserBook do
use Ecto.Migration

def change do
create table(:user_books) do
add :user_id, references(:users, on_delete: :nothing)
add :book_id, references(:books, on_delete: :nothing)

timestamps()
end

create index(:user_books, [:user_id])
create index(:user_books, [:book_id])
end
end
15 changes: 15 additions & 0 deletions priv/repo/migrations/20170821172007_create_user_books.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
defmodule AmnesiaApi.Repo.Migrations.CreateUserBooks do
use Ecto.Migration

def change do
create table(:user_books) do
add :user_id, references(:users, on_delete: :nothing)
add :book_id, references(:books, on_delete: :nothing)

timestamps()
end

create index(:user_books, [:user_id])
create index(:user_books, [:book_id])
end
end
58 changes: 58 additions & 0 deletions test/amnesia_api/amnesia/amnesia_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -602,4 +602,62 @@ defmodule AmnesiaApi.AmnesiaTest do
assert %Ecto.Changeset{} = Amnesia.change_section_questions(section_questions)
end
end

describe "user_books" do
alias AmnesiaApi.Amnesia.UserBook

@valid_attrs %{}
@update_attrs %{}
@invalid_attrs %{}

def user_book_fixture(attrs \\ %{}) do
{:ok, user_book} =
attrs
|> Enum.into(@valid_attrs)
|> Amnesia.create_user_book()

user_book
end

test "list_user_books/0 returns all user_books" do
user_book = user_book_fixture()
assert Amnesia.list_user_books() == [user_book]
end

test "get_user_book!/1 returns the user_book with given id" do
user_book = user_book_fixture()
assert Amnesia.get_user_book!(user_book.id) == user_book
end

test "create_user_book/1 with valid data creates a user_book" do
assert {:ok, %UserBook{} = user_book} = Amnesia.create_user_book(@valid_attrs)
end

test "create_user_book/1 with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = Amnesia.create_user_book(@invalid_attrs)
end

test "update_user_book/2 with valid data updates the user_book" do
user_book = user_book_fixture()
assert {:ok, user_book} = Amnesia.update_user_book(user_book, @update_attrs)
assert %UserBook{} = user_book
end

test "update_user_book/2 with invalid data returns error changeset" do
user_book = user_book_fixture()
assert {:error, %Ecto.Changeset{}} = Amnesia.update_user_book(user_book, @invalid_attrs)
assert user_book == Amnesia.get_user_book!(user_book.id)
end

test "delete_user_book/1 deletes the user_book" do
user_book = user_book_fixture()
assert {:ok, %UserBook{}} = Amnesia.delete_user_book(user_book)
assert_raise Ecto.NoResultsError, fn -> Amnesia.get_user_book!(user_book.id) end
end

test "change_user_book/1 returns a user_book changeset" do
user_book = user_book_fixture()
assert %Ecto.Changeset{} = Amnesia.change_user_book(user_book)
end
end
end
77 changes: 77 additions & 0 deletions test/amnesia_api_web/controllers/user_book_controller_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
defmodule AmnesiaApiWeb.UserBookControllerTest do
use AmnesiaApiWeb.ConnCase

alias AmnesiaApi.Amnesia
alias AmnesiaApi.Amnesia.UserBook

@create_attrs %{}
@update_attrs %{}
@invalid_attrs %{}

def fixture(:user_book) do
{:ok, user_book} = Amnesia.create_user_book(@create_attrs)
user_book
end

setup %{conn: conn} do
{:ok, conn: put_req_header(conn, "accept", "application/json")}
end

describe "index" do
test "lists all user_books", %{conn: conn} do
conn = get conn, user_book_path(conn, :index)
assert json_response(conn, 200)["data"] == []
end
end

describe "create user_book" do
test "renders user_book when data is valid", %{conn: conn} do
conn = post conn, user_book_path(conn, :create), user_book: @create_attrs
assert %{"id" => id} = json_response(conn, 201)["data"]

conn = get conn, user_book_path(conn, :show, id)
assert json_response(conn, 200)["data"] == %{
"id" => id}
end

test "renders errors when data is invalid", %{conn: conn} do
conn = post conn, user_book_path(conn, :create), user_book: @invalid_attrs
assert json_response(conn, 422)["errors"] != %{}
end
end

describe "update user_book" do
setup [:create_user_book]

test "renders user_book when data is valid", %{conn: conn, user_book: %UserBook{id: id} = user_book} do
conn = put conn, user_book_path(conn, :update, user_book), user_book: @update_attrs
assert %{"id" => ^id} = json_response(conn, 200)["data"]

conn = get conn, user_book_path(conn, :show, id)
assert json_response(conn, 200)["data"] == %{
"id" => id}
end

test "renders errors when data is invalid", %{conn: conn, user_book: user_book} do
conn = put conn, user_book_path(conn, :update, user_book), user_book: @invalid_attrs
assert json_response(conn, 422)["errors"] != %{}
end
end

describe "delete user_book" do
setup [:create_user_book]

test "deletes chosen user_book", %{conn: conn, user_book: user_book} do
conn = delete conn, user_book_path(conn, :delete, user_book)
assert response(conn, 204)
assert_error_sent 404, fn ->
get conn, user_book_path(conn, :show, user_book)
end
end
end

defp create_user_book(_) do
user_book = fixture(:user_book)
{:ok, user_book: user_book}
end
end
Loading

0 comments on commit dc73d4e

Please sign in to comment.