Skip to content

Commit 5a3c297

Browse files
authored
Merge pull request #1260 from vishaldeepak/1230-organization-policy-modify
Add ability to create Organization for users other than admin
2 parents 705feba + ecd6dd5 commit 5a3c297

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-9
lines changed

lib/code_corps/policy/helpers.ex

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule CodeCorps.Policy.Helpers do
66

77
alias CodeCorps.{
88
Organization,
9+
OrganizationInvite,
910
ProjectUser,
1011
Project,
1112
ProjectUser,
@@ -66,6 +67,15 @@ defmodule CodeCorps.Policy.Helpers do
6667

6768
def get_organization(_), do: nil
6869

70+
@doc """
71+
Retrieves an organiation invite from a struct, containing a `code` field
72+
Returns `CodeCorps.OrganizationInvite` or nil
73+
"""
74+
@spec get_organization_invite(struct) :: OrganizationInvite.t() | nil
75+
def get_organization_invite(%{"code" => code}),
76+
do: OrganizationInvite |> Repo.get_by(code: code, fulfilled: false)
77+
def get_organization_invite(%{}), do: nil
78+
6979
@doc """
7080
Retrieves a project record, from a model struct, or an `Ecto.Changeset`
7181
containing a `project_id` field

lib/code_corps/policy/organization.ex

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
defmodule CodeCorps.Policy.Organization do
22
@moduledoc ~S"""
33
Authorization policies for performing actions on `Organization` records
4-
"""
4+
"""
55
import CodeCorps.Policy.Helpers,
6-
only: [owned_by?: 2]
6+
only: [owned_by?: 2, get_organization_invite: 1]
77

88
alias CodeCorps.{Organization, User}
99

10-
def create?(%User{admin: true}), do: true
11-
def create?(%User{admin: false}), do: false
10+
def create?(%User{admin: true}, %{}), do: true
11+
def create?(%User{}, %{} = params) do
12+
case get_organization_invite(params) do
13+
nil -> false
14+
_ -> true
15+
end
16+
end
17+
def create?(%{}, %{}), do: false
1218

1319
def update?(%User{admin: true}, %Organization{}), do: true
1420
def update?(%User{} = user, %Organization{} = organization), do: organization |> owned_by?(user)

lib/code_corps/policy/policy.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ defmodule CodeCorps.Policy do
4949
defp can?(%User{} = current_user, :update, %GithubRepo{} = github_repo, %{} = params), do: Policy.GithubRepo.update?(current_user, github_repo, params)
5050

5151
# Organization
52-
defp can?(%User{} = current_user, :create, %Organization{}, %{}), do: Policy.Organization.create?(current_user)
52+
defp can?(%User{} = current_user, :create, %Organization{}, %{} = params), do: Policy.Organization.create?(current_user, params)
5353
defp can?(%User{} = current_user, :update, %Organization{} = organization, %{}), do: Policy.Organization.update?(current_user, organization)
5454

5555
# OrganizationGithubAppInstallation

test/lib/code_corps/policy/organization_test.exs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,33 @@
11
defmodule CodeCorps.Policy.OrganizationTest do
22
use CodeCorps.PolicyCase
33

4-
import CodeCorps.Policy.Organization, only: [create?: 1, update?: 2]
4+
import CodeCorps.Policy.Organization, only: [create?: 2, update?: 2]
55

66
describe "create" do
77
test "returns true when user is an admin" do
88
user = build(:user, admin: true)
9-
assert create?(user)
9+
assert create?(user, %{})
1010
end
1111

12-
test "returns false when user is not an admin" do
12+
test "returns true when there is correct code" do
1313
user = build(:user, admin: false)
14-
refute create?(user)
14+
organization_invite = insert(:organization_invite)
15+
params = %{"code" => organization_invite.code}
16+
assert create?(user, params)
17+
end
18+
19+
test "returns false when code is incorrect" do
20+
user = build(:user, admin: false)
21+
insert(:organization_invite)
22+
params = %{"code" => "incorrect"}
23+
refute create?(user, params)
24+
end
25+
26+
test "returns false when code is correct but OrganizationInvite is fulfilled" do
27+
user = build(:user, admin: false)
28+
organization_invite = insert(:organization_invite, fulfilled: true)
29+
params = %{"code" => organization_invite.code}
30+
refute create?(user, params)
1531
end
1632
end
1733

0 commit comments

Comments
 (0)