Skip to content

Commit fcc3f5d

Browse files
committed
Refactor helpers from UserTask and TaskSkill into Helpers.Policy
1 parent f007df2 commit fcc3f5d

File tree

3 files changed

+50
-19
lines changed

3 files changed

+50
-19
lines changed

lib/code_corps/helpers/policy.ex

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ defmodule CodeCorps.Helpers.Policy do
66

77
import Ecto.Query
88

9-
alias CodeCorps.{Organization, OrganizationMembership, Project, Repo, StripeConnectAccount, User}
9+
alias CodeCorps.{
10+
Organization, OrganizationMembership,
11+
Project, Repo, StripeConnectAccount,
12+
TaskSkill, Task, User, UserTask
13+
}
1014
alias Ecto.Changeset
1115

1216
@doc """
@@ -15,6 +19,7 @@ defmodule CodeCorps.Helpers.Policy do
1519
1620
Returns `CodeCorps.OrganizationMembership`
1721
"""
22+
@spec get_membership(nil | Changeset.t | Project.t | Organization.t | StripeConnectAccount.t, User.t) :: nil | OrganizationMembership.t
1823
def get_membership(nil, %User{}), do: nil
1924
def get_membership(%Changeset{changes: %{organization_id: organization_id}}, %User{id: user_id}), do: do_get_membership(organization_id, user_id)
2025
def get_membership(%Project{organization_id: organization_id}, %User{id: user_id}), do: do_get_membership(organization_id, user_id)
@@ -31,6 +36,7 @@ defmodule CodeCorps.Helpers.Policy do
3136
3237
Returns `CodeCorps.Project`
3338
"""
39+
@spec get_project(struct | Changeset.t | any) :: Project.t
3440
def get_project(%{project_id: project_id}), do: Project |> Repo.get(project_id)
3541
def get_project(%Changeset{changes: %{project_id: project_id}}), do: Project |> Repo.get(project_id)
3642
def get_project(_), do: nil
@@ -40,25 +46,45 @@ defmodule CodeCorps.Helpers.Policy do
4046
4147
Returns `:string`
4248
"""
49+
@spec get_role(nil | OrganizationMembership.t | Changeset.t) :: String.t
4350
def get_role(nil), do: nil
4451
def get_role(%OrganizationMembership{role: role}), do: role
4552
def get_role(%Changeset{} = changeset), do: changeset |> Changeset.get_field(:role)
4653

4754
@doc """
4855
Determines if provided string is equal to "owner"
4956
"""
57+
@spec owner?(String.t) :: boolean
5058
def owner?("owner"), do: true
5159
def owner?(_), do: false
5260

5361
@doc """
5462
Determines if provided string is equal to one of `["admin", "owner"]`
5563
"""
64+
@spec admin_or_higher?(String.t) :: boolean
5665
def admin_or_higher?(role) when role in ["admin", "owner"], do: true
5766
def admin_or_higher?(_), do: false
5867

5968
@doc """
6069
Determines if provided string is equal to one of `["contributor", "admin", "owner"]`
6170
"""
71+
@spec contributor_or_higher?(String.t) :: boolean
6272
def contributor_or_higher?(role) when role in ["contributor", "admin", "owner"], do: true
6373
def contributor_or_higher?(_), do: false
74+
75+
@doc """
76+
Retrieves task from associated record
77+
"""
78+
@spec get_task(Changeset.t | TaskSkill.t | UserTask.t) :: Task.t
79+
def get_task(%TaskSkill{task_id: task_id}), do: Repo.get(Task, task_id)
80+
def get_task(%UserTask{task_id: task_id}), do: Repo.get(Task, task_id)
81+
def get_task(%Changeset{changes: %{task_id: task_id}}), do: Repo.get(Task, task_id)
82+
83+
@doc """
84+
Determines if the provided task was authored by the provided user
85+
"""
86+
@spec task_authored_by?(Task.t, User.t) :: boolean
87+
def task_authored_by?(%Task{user_id: author_id}, %User{id: user_id}), do: user_id == author_id
88+
89+
6490
end

web/policies/task_skill_policy.ex

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,25 @@ defmodule CodeCorps.TaskSkillPolicy do
33
Represents an authorization policy for performing actions on TaskSkill records.
44
Used to authorize a controller action.
55
"""
6+
67
import CodeCorps.Helpers.Policy,
7-
only: [get_project: 1, get_membership: 2, get_role: 1, contributor_or_higher?: 1]
8+
only: [
9+
contributor_or_higher?: 1,
10+
get_membership: 2,
11+
get_project: 1,
12+
get_role: 1,
13+
get_task: 1,
14+
task_authored_by?: 2
15+
]
816

9-
alias CodeCorps.{Repo, Task, TaskSkill, User}
17+
alias CodeCorps.{TaskSkill, User}
1018
alias Ecto.Changeset
1119

1220
@spec create?(User.t, Changeset.t) :: boolean
1321
def create?(%User{} = user, %Changeset{} = changeset) do
1422
cond do
1523
changeset |> get_task |> get_project |> get_membership(user) |> get_role |> contributor_or_higher? -> true
16-
changeset |> get_task |> authored_by?(user) -> true
24+
changeset |> get_task |> task_authored_by?(user) -> true
1725
true -> false
1826
end
1927
end
@@ -22,13 +30,8 @@ defmodule CodeCorps.TaskSkillPolicy do
2230
def delete?(%User{} = user, %TaskSkill{} = task_skill) do
2331
cond do
2432
task_skill |> get_task |> get_project |> get_membership(user) |> get_role |> contributor_or_higher? -> true
25-
task_skill |> get_task |> authored_by?(user) -> true
33+
task_skill |> get_task |> task_authored_by?(user) -> true
2634
true -> false
2735
end
2836
end
29-
30-
defp get_task(%TaskSkill{task_id: task_id}), do: Repo.get(Task, task_id)
31-
defp get_task(%Changeset{changes: %{task_id: task_id}}), do: Repo.get(Task, task_id)
32-
33-
defp authored_by?(%Task{user_id: author_id}, %User{id: user_id}), do: user_id == author_id
3437
end

web/policies/user_task_policy.ex

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,23 @@ defmodule CodeCorps.UserTaskPolicy do
44
Used to authorize a controller action.
55
"""
66
import CodeCorps.Helpers.Policy,
7-
only: [get_project: 1, get_membership: 2, get_role: 1, contributor_or_higher?: 1]
7+
only: [
8+
contributor_or_higher?: 1,
9+
get_membership: 2,
10+
get_project: 1,
11+
get_role: 1,
12+
get_task: 1,
13+
task_authored_by?: 2
14+
]
815

9-
alias CodeCorps.{Repo, Task, UserTask, User}
16+
alias CodeCorps.{User, UserTask}
1017
alias Ecto.Changeset
1118

1219
@spec create?(User.t, Changeset.t) :: boolean
1320
def create?(%User{} = user, %Changeset{} = changeset) do
1421
cond do
1522
changeset |> get_task |> get_project |> get_membership(user) |> get_role |> contributor_or_higher? -> true
16-
changeset |> get_task |> authored_by?(user) -> true
23+
changeset |> get_task |> task_authored_by?(user) -> true
1724
true -> false
1825
end
1926
end
@@ -22,13 +29,8 @@ defmodule CodeCorps.UserTaskPolicy do
2229
def delete?(%User{} = user, %UserTask{} = user_task) do
2330
cond do
2431
user_task |> get_task |> get_project |> get_membership(user) |> get_role |> contributor_or_higher? -> true
25-
user_task |> get_task |> authored_by?(user) -> true
32+
user_task |> get_task |> task_authored_by?(user) -> true
2633
true -> false
2734
end
2835
end
29-
30-
defp get_task(%UserTask{task_id: task_id}), do: Repo.get(Task, task_id)
31-
defp get_task(%Changeset{changes: %{task_id: task_id}}), do: Repo.get(Task, task_id)
32-
33-
defp authored_by?(%Task{user_id: author_id}, %User{id: user_id}), do: user_id == author_id
3436
end

0 commit comments

Comments
 (0)