-
Notifications
You must be signed in to change notification settings - Fork 82
Expand file tree
/
Copy pathprojects.ex
More file actions
107 lines (88 loc) · 3.48 KB
/
projects.ex
File metadata and controls
107 lines (88 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
defmodule CodeCorps.Projects do
@moduledoc """
Work with `CodeCorps.Projects`.
"""
import CodeCorpsWeb.ProjectController, only: [preload: 1]
alias CodeCorps.{
Analytics.SegmentTracker, Emails, Mailer, Project, Repo, User
}
alias Ecto.Changeset
@doc """
Create a project.
"""
@spec create(map, User.t) :: {:ok, Project.t} | {:error, Changeset.t}
def create(%{} = params, %User{} = user) do
with {:ok, %Project{} = project} <- %Project{} |> Project.create_changeset(params) |> Repo.insert(),
project <- preload(project) do
user |> track_created(project)
{:ok, project}
end
end
@doc """
Update a project.
"""
@spec update(Project.t, map, User.t) :: {:ok, Project.t} | {:error, Changeset.t}
def update(%Project{} = project, %{} = params, %User{} = user) do
with {:ok, %Project{} = updated_project} <- project |> Project.update_changeset(params) |> Repo.update(),
updated_project <- preload(updated_project) do
maybe_send_approval_request_email(updated_project, project)
maybe_send_approved_email(updated_project, project)
user |> track_updated(updated_project)
user |> maybe_track_approved(updated_project, project)
user |> maybe_track_approval_requested(updated_project, project)
{:ok, updated_project}
end
end
@spec track_created(User.t, Project.t) :: any
defp track_created(%User{id: user_id}, %Project{} = project) do
user_id |> SegmentTracker.track("Created Project", project)
end
@spec track_updated(User.t, Project.t) :: any
defp track_updated(%User{id: user_id}, %Project{} = project) do
user_id |> SegmentTracker.track("Updated Project", project)
end
@spec maybe_track_approval_requested(User.t, Project.t, Project.t) :: any
defp maybe_track_approval_requested(
%User{id: user_id},
%Project{approval_requested: true} = updated_project,
%Project{approval_requested: false}) do
user_id |> SegmentTracker.track("Requested Project Approval", updated_project)
end
defp maybe_track_approval_requested(%User{}, %Project{}, %Project{}), do: :nothing
@spec maybe_track_approved(User.t, Project.t, Project.t) :: any
defp maybe_track_approved(
%User{id: user_id},
%Project{approved: true} = updated_project,
%Project{approved: false}) do
user_id |> SegmentTracker.track("Approved Project", updated_project)
end
defp maybe_track_approved(%User{}, %Project{}, %Project{}), do: :nothing
@spec maybe_send_approval_request_email(Project.t, Project.t) :: any
defp maybe_send_approval_request_email(
%Project{approval_requested: true} = updated_project,
%Project{approval_requested: false}) do
send_approval_request_email(updated_project)
end
defp maybe_send_approval_request_email(%Project{}, %Project{}), do: :nothing
@spec send_approval_request_email(Project.t) :: Bamboo.Email.t
defp send_approval_request_email(project) do
project
|> preload()
|> Emails.ProjectApprovalRequestEmail.create()
|> Mailer.deliver_now()
end
@spec maybe_send_approved_email(Project.t, Project.t) :: any
defp maybe_send_approved_email(
%Project{approved: true} = updated_project,
%Project{approved: false}) do
send_approved_email(updated_project)
end
defp maybe_send_approved_email(%Project{}, %Project{}), do: :nothing
@spec send_approved_email(Project.t) :: Bamboo.Email.t
defp send_approved_email(project) do
project
|> preload()
|> Emails.ProjectApprovedEmail.create()
|> Mailer.deliver_now()
end
end