Skip to content

Commit 9b9f786

Browse files
landongrindheimjoshsmith
authored andcommitted
Remove JaResource from ProjectGithubRepoController
1 parent a80045c commit 9b9f786

4 files changed

Lines changed: 54 additions & 32 deletions

File tree

lib/code_corps/policy/policy.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ defmodule CodeCorps.Policy do
4747
%OrganizationGithubAppInstallation{} = organization_github_app_installation, %{}),
4848
do: Policy.OrganizationGithubAppInstallation.delete?(user, organization_github_app_installation)
4949
defp can?(%User{} = user, :create, %OrganizationGithubAppInstallation{}, %{} = params), do: Policy.OrganizationGithubAppInstallation.create?(user, params)
50+
defp can?(%User{} = current_user, :create, %ProjectGithubRepo{}, %{} = params), do: Policy.ProjectGithubRepo.create?(current_user, params)
51+
defp can?(%User{} = current_user, :delete, %ProjectGithubRepo{} = project_github_repo, %{}),
52+
do: Policy.ProjectGithubRepo.delete?(current_user, project_github_repo)
5053
defp can?(%User{} = current_user, :create, %Role{}, %{}), do: Policy.Role.create?(current_user)
5154
defp can?(%User{} = current_user, :create, %RoleSkill{}, %{}), do: Policy.RoleSkill.create?(current_user)
5255
defp can?(%User{} = current_user, :delete, %RoleSkill{}, %{}), do: Policy.RoleSkill.delete?(current_user)
@@ -106,9 +109,6 @@ defmodule CodeCorps.Policy do
106109
def can?(%User{} = user, :create, %Changeset{data: %ProjectCategory{}} = changeset), do: Policy.ProjectCategory.create?(user, changeset)
107110
def can?(%User{} = user, :delete, %ProjectCategory{} = project_category), do: Policy.ProjectCategory.delete?(user, project_category)
108111

109-
def can?(%User{} = user, :create, %Changeset{data: %ProjectGithubRepo{}} = changeset), do: Policy.ProjectGithubRepo.create?(user, changeset)
110-
def can?(%User{} = user, :delete, %ProjectGithubRepo{} = project_github_repo), do: Policy.ProjectGithubRepo.delete?(user, project_github_repo)
111-
112112
def can?(%User{} = user, :create, Role), do: Policy.Role.create?(user)
113113
end
114114
end

lib/code_corps/policy/project_github_repo.ex

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ defmodule CodeCorps.Policy.ProjectGithubRepo do
22
import CodeCorps.Policy.Helpers, only: [get_project: 1, administered_by?: 2]
33

44
alias CodeCorps.{ProjectGithubRepo, User}
5-
alias Ecto.Changeset
65

7-
def create?(%User{} = user, %Changeset{} = changeset) do
8-
changeset |> get_project |> administered_by?(user)
6+
@spec create?(User.t, map) :: boolean
7+
def create?(%User{} = user, %{} = params) do
8+
params |> get_project |> administered_by?(user)
99
end
1010

11+
@spec delete?(User.t, ProjectGithubRepo.t) :: boolean
1112
def delete?(%User{} = user, %ProjectGithubRepo{} = project_github_repo) do
1213
project_github_repo |> get_project |> administered_by?(user)
1314
end
Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,48 @@
11
defmodule CodeCorpsWeb.ProjectGithubRepoController do
22
use CodeCorpsWeb, :controller
3-
use JaResource
43

5-
import CodeCorps.Helpers.Query, only: [id_filter: 2]
4+
alias CodeCorps.{ProjectGithubRepo, User, Helpers.Query}
65

7-
alias CodeCorps.ProjectGithubRepo
6+
action_fallback CodeCorpsWeb.FallbackController
7+
plug CodeCorpsWeb.Plug.DataToAttributes
8+
plug CodeCorpsWeb.Plug.IdsToIntegers
89

9-
plug :load_resource, model: ProjectGithubRepo, only: [:show], preload: [:github_repo, :project]
10-
plug :load_and_authorize_changeset, model: ProjectGithubRepo, only: [:create]
11-
plug :load_and_authorize_resource, model: ProjectGithubRepo, only: [:delete]
12-
plug JaResource
10+
@spec index(Conn.t, map) :: Conn.t
11+
def index(%Conn{} = conn, %{} = params) do
12+
with organization_installations <- ProjectGithubRepo |> Query.id_filter(params) |> Repo.all do
13+
conn |> render("index.json-api", data: organization_installations)
14+
end
15+
end
16+
17+
@spec show(Conn.t, map) :: Conn.t
18+
def show(%Conn{} = conn, %{"id" => id}) do
19+
with %ProjectGithubRepo{} = project_github_repo <- ProjectGithubRepo |> Repo.get(id) do
20+
conn |> render("show.json-api", data: project_github_repo)
21+
end
22+
end
1323

14-
@spec model :: module
15-
def model, do: CodeCorps.ProjectGithubRepo
24+
@spec create(Plug.Conn.t, map) :: Conn.t
25+
def create(%Conn{} = conn, %{} = params) do
26+
with %User{} = current_user <- conn |> Guardian.Plug.current_resource,
27+
{:ok, :authorized} <- current_user |> Policy.authorize(:create, %ProjectGithubRepo{}, params),
28+
{:ok, %ProjectGithubRepo{} = project_github_repo} <- create_project_repo_changeset(params) |> Repo.insert do
29+
conn |> put_status(:created) |> render("show.json-api", data: project_github_repo)
30+
end
31+
end
1632

17-
def filter(_conn, query, "id", id_list) do
18-
query |> id_filter(id_list)
33+
@spec delete(Plug.Conn.t, map) :: Conn.t
34+
def delete(%Conn{} = conn, %{"id" => id} = params) do
35+
with %ProjectGithubRepo{} = project_github_repo <- ProjectGithubRepo |> Repo.get(id),
36+
%User{} = current_user <- conn |> Guardian.Plug.current_resource,
37+
{:ok, :authorized} <- current_user |> Policy.authorize(:delete, project_github_repo, params),
38+
{:ok, _project_github_repo} <- project_github_repo |> Repo.delete do
39+
conn |> send_resp(:no_content, "")
40+
end
1941
end
2042

21-
def handle_create(_conn, attributes) do
22-
%ProjectGithubRepo{} |> ProjectGithubRepo.create_changeset(attributes)
43+
@spec create_project_repo_changeset(map) :: Ecto.Changeset.t
44+
defp create_project_repo_changeset(params) do
45+
%ProjectGithubRepo{}
46+
|> ProjectGithubRepo.create_changeset(params)
2347
end
2448
end

test/lib/code_corps/policy/project_github_repo_test.exs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,42 @@ defmodule CodeCorps.Policy.ProjectGithubRepoTest do
22
use CodeCorps.PolicyCase
33

44
import CodeCorps.Policy.ProjectGithubRepo, only: [create?: 2, delete?: 2]
5-
import CodeCorps.ProjectGithubRepo, only: [create_changeset: 2]
6-
7-
alias CodeCorps.ProjectGithubRepo
85

96
describe "create?" do
107
test "returns false when user is not a project member" do
118
user = insert(:user)
129
project = insert(:project)
1310

14-
changeset = %ProjectGithubRepo{} |> create_changeset(%{project_id: project.id})
15-
refute create?(user, changeset)
11+
params = %{"project_id" => project.id, "user_id" => user.id}
12+
refute create?(user, params)
1613
end
1714

1815
test "returns false when user is a pending project member" do
1916
%{project: project, user: user} = insert(:project_user, role: "pending")
2017

21-
changeset = %ProjectGithubRepo{} |> create_changeset(%{project_id: project.id})
22-
refute create?(user, changeset)
18+
params = %{"project_id" => project.id, "user_id" => user.id}
19+
refute create?(user, params)
2320
end
2421

2522
test "returns false when user is a project contributor" do
2623
%{project: project, user: user} = insert(:project_user, role: "contributor")
2724

28-
changeset = %ProjectGithubRepo{} |> create_changeset(%{project_id: project.id})
29-
refute create?(user, changeset)
25+
params = %{"project_id" => project.id, "user_id" => user.id}
26+
refute create?(user, params)
3027
end
3128

3229
test "returns true when user is a project admin" do
3330
%{project: project, user: user} = insert(:project_user, role: "admin")
3431

35-
changeset = %ProjectGithubRepo{} |> create_changeset(%{project_id: project.id})
36-
assert create?(user, changeset)
32+
params = %{"project_id" => project.id, "user_id" => user.id}
33+
assert create?(user, params)
3734
end
3835

3936
test "returns true when user is project owner" do
4037
%{project: project, user: user} = insert(:project_user, role: "owner")
4138

42-
changeset = %ProjectGithubRepo{} |> create_changeset(%{project_id: project.id})
43-
assert create?(user, changeset)
39+
params = %{"project_id" => project.id, "user_id" => user.id}
40+
assert create?(user, params)
4441
end
4542
end
4643

0 commit comments

Comments
 (0)