Skip to content

Commit 2128da9

Browse files
committed
Add repository model
1 parent becaef2 commit 2128da9

13 files changed

+252
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
defmodule Beanie.Repo.Migrations.CreateRepository do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:repositories) do
6+
add :name, :string
7+
8+
timestamps()
9+
end
10+
11+
end
12+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
defmodule Beanie.RepositoryControllerTest do
2+
use Beanie.ConnCase
3+
4+
alias Beanie.Repository
5+
@valid_attrs %{name: "some content"}
6+
@invalid_attrs %{}
7+
8+
test "lists all entries on index", %{conn: conn} do
9+
conn = get conn, repository_path(conn, :index)
10+
assert html_response(conn, 200) =~ "Listing repositories"
11+
end
12+
13+
test "renders form for new resources", %{conn: conn} do
14+
conn = get conn, repository_path(conn, :new)
15+
assert html_response(conn, 200) =~ "New repository"
16+
end
17+
18+
test "creates resource and redirects when data is valid", %{conn: conn} do
19+
conn = post conn, repository_path(conn, :create), repository: @valid_attrs
20+
assert redirected_to(conn) == repository_path(conn, :index)
21+
assert Repo.get_by(Repository, @valid_attrs)
22+
end
23+
24+
test "does not create resource and renders errors when data is invalid", %{conn: conn} do
25+
conn = post conn, repository_path(conn, :create), repository: @invalid_attrs
26+
assert html_response(conn, 200) =~ "New repository"
27+
end
28+
29+
test "shows chosen resource", %{conn: conn} do
30+
repository = Repo.insert! %Repository{}
31+
conn = get conn, repository_path(conn, :show, repository)
32+
assert html_response(conn, 200) =~ "Show repository"
33+
end
34+
35+
test "renders page not found when id is nonexistent", %{conn: conn} do
36+
assert_error_sent 404, fn ->
37+
get conn, repository_path(conn, :show, -1)
38+
end
39+
end
40+
41+
test "renders form for editing chosen resource", %{conn: conn} do
42+
repository = Repo.insert! %Repository{}
43+
conn = get conn, repository_path(conn, :edit, repository)
44+
assert html_response(conn, 200) =~ "Edit repository"
45+
end
46+
47+
test "updates chosen resource and redirects when data is valid", %{conn: conn} do
48+
repository = Repo.insert! %Repository{}
49+
conn = put conn, repository_path(conn, :update, repository), repository: @valid_attrs
50+
assert redirected_to(conn) == repository_path(conn, :show, repository)
51+
assert Repo.get_by(Repository, @valid_attrs)
52+
end
53+
54+
test "does not update chosen resource and renders errors when data is invalid", %{conn: conn} do
55+
repository = Repo.insert! %Repository{}
56+
conn = put conn, repository_path(conn, :update, repository), repository: @invalid_attrs
57+
assert html_response(conn, 200) =~ "Edit repository"
58+
end
59+
60+
test "deletes chosen resource", %{conn: conn} do
61+
repository = Repo.insert! %Repository{}
62+
conn = delete conn, repository_path(conn, :delete, repository)
63+
assert redirected_to(conn) == repository_path(conn, :index)
64+
refute Repo.get(Repository, repository.id)
65+
end
66+
end

test/models/repository_test.exs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
defmodule Beanie.RepositoryTest do
2+
use Beanie.ModelCase
3+
4+
alias Beanie.Repository
5+
6+
@valid_attrs %{name: "some content"}
7+
@invalid_attrs %{}
8+
9+
test "changeset with valid attributes" do
10+
changeset = Repository.changeset(%Repository{}, @valid_attrs)
11+
assert changeset.valid?
12+
end
13+
14+
test "changeset with invalid attributes" do
15+
changeset = Repository.changeset(%Repository{}, @invalid_attrs)
16+
refute changeset.valid?
17+
end
18+
end
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
defmodule Beanie.RepositoryController do
2+
use Beanie.Web, :controller
3+
4+
alias Beanie.Repository
5+
6+
def index(conn, _params) do
7+
repositories = Repo.all(Repository)
8+
render(conn, "index.html", repositories: repositories)
9+
end
10+
11+
def new(conn, _params) do
12+
changeset = Repository.changeset(%Repository{})
13+
render(conn, "new.html", changeset: changeset)
14+
end
15+
16+
def create(conn, %{"repository" => repository_params}) do
17+
changeset = Repository.changeset(%Repository{}, repository_params)
18+
19+
case Repo.insert(changeset) do
20+
{:ok, _repository} ->
21+
conn
22+
|> put_flash(:info, "Repository created successfully.")
23+
|> redirect(to: repository_path(conn, :index))
24+
{:error, changeset} ->
25+
render(conn, "new.html", changeset: changeset)
26+
end
27+
end
28+
29+
def show(conn, %{"id" => id}) do
30+
repository = Repo.get!(Repository, id)
31+
render(conn, "show.html", repository: repository)
32+
end
33+
34+
def edit(conn, %{"id" => id}) do
35+
repository = Repo.get!(Repository, id)
36+
changeset = Repository.changeset(repository)
37+
render(conn, "edit.html", repository: repository, changeset: changeset)
38+
end
39+
40+
def update(conn, %{"id" => id, "repository" => repository_params}) do
41+
repository = Repo.get!(Repository, id)
42+
changeset = Repository.changeset(repository, repository_params)
43+
44+
case Repo.update(changeset) do
45+
{:ok, repository} ->
46+
conn
47+
|> put_flash(:info, "Repository updated successfully.")
48+
|> redirect(to: repository_path(conn, :show, repository))
49+
{:error, changeset} ->
50+
render(conn, "edit.html", repository: repository, changeset: changeset)
51+
end
52+
end
53+
54+
def delete(conn, %{"id" => id}) do
55+
repository = Repo.get!(Repository, id)
56+
57+
# Here we use delete! (with a bang) because we expect
58+
# it to always work (and if it does not, it will raise).
59+
Repo.delete!(repository)
60+
61+
conn
62+
|> put_flash(:info, "Repository deleted successfully.")
63+
|> redirect(to: repository_path(conn, :index))
64+
end
65+
end

web/models/repository.ex

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
defmodule Beanie.Repository do
2+
use Beanie.Web, :model
3+
4+
schema "repositories" do
5+
field :name, :string
6+
7+
timestamps()
8+
end
9+
10+
@doc """
11+
Builds a changeset based on the `struct` and `params`.
12+
"""
13+
def changeset(struct, params \\ %{}) do
14+
struct
15+
|> cast(params, [:name])
16+
|> validate_required([:name])
17+
end
18+
end

web/router.ex

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ defmodule Beanie.Router do
1717
pipe_through :browser # Use the default browser stack
1818

1919
get "/", PageController, :index
20+
resources "/repositories", RepositoryController
2021
end
2122

2223
# Other scopes may use custom stacks.

web/templates/layout/app.html.eex

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<header class="header">
1717
<nav role="navigation">
1818
<ul class="nav nav-pills pull-right">
19-
<li><a href="http://www.phoenixframework.org/docs">A link</a></li>
19+
<li><a href="<%= repository_path(@conn, :index) %>">Repositories</a></li>
2020
</ul>
2121
</nav>
2222
<span class="logo"></span>
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<h2>Edit repository</h2>
2+
3+
<%= render "form.html", changeset: @changeset,
4+
action: repository_path(@conn, :update, @repository) %>
5+
6+
<%= link "Back", to: repository_path(@conn, :index) %>
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<%= form_for @changeset, @action, fn f -> %>
2+
<%= if @changeset.action do %>
3+
<div class="alert alert-danger">
4+
<p>Oops, something went wrong! Please check the errors below.</p>
5+
</div>
6+
<% end %>
7+
8+
<div class="form-group">
9+
<%= label f, :name, class: "control-label" %>
10+
<%= text_input f, :name, class: "form-control" %>
11+
<%= error_tag f, :name %>
12+
</div>
13+
14+
<div class="form-group">
15+
<%= submit "Submit", class: "btn btn-primary" %>
16+
</div>
17+
<% end %>
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<h2>Listing repositories</h2>
2+
3+
<table class="table">
4+
<thead>
5+
<tr>
6+
<th>Name</th>
7+
8+
<th></th>
9+
</tr>
10+
</thead>
11+
<tbody>
12+
<%= for repository <- @repositories do %>
13+
<tr>
14+
<td><%= repository.name %></td>
15+
16+
<td class="text-right">
17+
<%= link "Show", to: repository_path(@conn, :show, repository), class: "btn btn-default btn-xs" %>
18+
<%= link "Edit", to: repository_path(@conn, :edit, repository), class: "btn btn-default btn-xs" %>
19+
<%= link "Delete", to: repository_path(@conn, :delete, repository), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>
20+
</td>
21+
</tr>
22+
<% end %>
23+
</tbody>
24+
</table>
25+
26+
<%= link "New repository", to: repository_path(@conn, :new) %>

web/templates/repository/new.html.eex

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<h2>New repository</h2>
2+
3+
<%= render "form.html", changeset: @changeset,
4+
action: repository_path(@conn, :create) %>
5+
6+
<%= link "Back", to: repository_path(@conn, :index) %>
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<h2>Show repository</h2>
2+
3+
<ul>
4+
5+
<li>
6+
<strong>Name:</strong>
7+
<%= @repository.name %>
8+
</li>
9+
10+
</ul>
11+
12+
<%= link "Edit", to: repository_path(@conn, :edit, @repository) %>
13+
<%= link "Back", to: repository_path(@conn, :index) %>

web/views/repository_view.ex

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
defmodule Beanie.RepositoryView do
2+
use Beanie.Web, :view
3+
end

0 commit comments

Comments
 (0)