Skip to content

Commit fde52e1

Browse files
committed
Switch ProjectApprovedEmail to SparkPost
1 parent 2a5dcb3 commit fde52e1

File tree

8 files changed

+96
-89
lines changed

8 files changed

+96
-89
lines changed

lib/code_corps/emails/project_approved_email.ex

Lines changed: 0 additions & 55 deletions
This file was deleted.

lib/code_corps/projects/projects.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ defmodule CodeCorps.Projects do
66
import CodeCorpsWeb.ProjectController, only: [preload: 1]
77

88
alias CodeCorps.{
9-
Analytics.SegmentTracker, Emails, Mailer, Project, Repo, SparkPost, User
9+
Analytics.SegmentTracker, Project, Repo, SparkPost, User
1010
}
1111
alias Ecto.Changeset
1212

@@ -100,7 +100,6 @@ defmodule CodeCorps.Projects do
100100
defp send_approved_email(project) do
101101
project
102102
|> preload()
103-
|> Emails.ProjectApprovedEmail.create()
104-
|> Mailer.deliver_now()
103+
|> SparkPost.send_project_approved_email()
105104
end
106105
end

lib/code_corps/sparkpost/emails/emails.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ defmodule CodeCorps.SparkPost.Emails do
1919
project |> Emails.ProjectApprovalRequest.build |> API.send_transmission
2020
end
2121

22+
def send_project_approved_email(project) do
23+
project |> Emails.ProjectApproved.build |> API.send_transmission
24+
end
25+
2226
def send_receipt_email(charge, invoice) do
2327
case charge |> Emails.Receipt.build(invoice) do
2428
%SparkPost.Transmission{} = transmission ->
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
defmodule CodeCorps.SparkPost.Emails.ProjectApproved do
2+
import Ecto.Query
3+
4+
alias SparkPost.{Content, Transmission}
5+
alias CodeCorps.{
6+
Project, ProjectUser, Repo, SparkPost.Emails.Recipient, User, WebClient
7+
}
8+
9+
@spec build(Project.t) :: %Transmission{}
10+
def build(%Project{} = project) do
11+
%Transmission{
12+
content: %Content.TemplateRef{template_id: "project-approval-request"},
13+
options: %Transmission.Options{inline_css: true},
14+
recipients: project |> get_owners() |> Enum.map(&Recipient.build/1),
15+
substitution_data: %{
16+
from_name: "Code Corps",
17+
from_email: "team@codecorps.org",
18+
project_title: project.title,
19+
project_url: project |> preload() |> project_url(),
20+
subject: "#{project.title} is approved!"
21+
}
22+
}
23+
end
24+
25+
@spec preload(Project.t) :: Project.t
26+
defp preload(%Project{} = project), do: project |> Repo.preload(:organization)
27+
28+
@spec project_url(Project.t) :: String.t
29+
defp project_url(project) do
30+
WebClient.url()
31+
|> URI.merge(project.organization.slug <> "/" <> project.slug)
32+
|> URI.to_string()
33+
end
34+
35+
@spec get_owners(Project.t) :: list(User.t)
36+
defp get_owners(%Project{id: project_id}) do
37+
query = from u in User,
38+
join: pu in ProjectUser, on: u.id == pu.user_id,
39+
where: pu.project_id == ^project_id,
40+
where: pu.role == "owner"
41+
42+
query |> Repo.all()
43+
end
44+
end

lib/code_corps/sparkpost/sparkpost.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule CodeCorps.SparkPost do
88
defdelegate send_message_initiated_by_project_email(message, conversation), to: Emails
99
defdelegate send_organization_invite_email(invite), to: Emails
1010
defdelegate send_project_approval_request_email(project), to: Emails
11+
defdelegate send_project_approved_email(project), to: Emails
1112
defdelegate send_receipt_email(charge, invoice), to: Emails
1213
defdelegate send_reply_to_conversation_email(part, user), to: Emails
1314
end

test/lib/code_corps/emails/project_approved_email_test.exs

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
defmodule CodeCorps.SparkPost.Emails.ProjectApprovedTest do
2+
use CodeCorps.DbAccessCase
3+
4+
alias CodeCorps.SparkPost.Emails.ProjectApproved
5+
6+
describe "build/1" do
7+
test "provides substitution data for all keys used by template" do
8+
project = insert(:project)
9+
10+
%{substitution_data: data} = ProjectApproved.build(project)
11+
12+
expected_keys =
13+
"project-approved"
14+
|> CodeCorps.SparkPostHelpers.get_keys_used_by_template
15+
assert data |> Map.keys == expected_keys
16+
end
17+
18+
test "builds correct transmission model" do
19+
project = insert(:project)
20+
%{user: owner_1} = insert(:project_user, project: project, role: "owner")
21+
%{user: owner_2} = insert(:project_user, project: project, role: "owner")
22+
23+
%{substitution_data: data, recipients: [recipient_1, recipient_2]} =
24+
ProjectApproved.build(project)
25+
26+
assert data.from_name == "Code Corps"
27+
assert data.from_email == "team@codecorps.org"
28+
29+
assert data.project_title == project.title
30+
assert data.project_url == "http://localhost:4200/#{project.organization.slug}/#{project.slug}"
31+
assert data.subject == "#{project.title} is approved!"
32+
33+
assert recipient_1.address.email == owner_1.email
34+
assert recipient_1.address.name == owner_1.first_name
35+
assert recipient_2.address.email == owner_2.email
36+
assert recipient_2.address.name == owner_2.first_name
37+
end
38+
end
39+
end

test/lib/code_corps_web/controllers/project_controller_test.exs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ defmodule CodeCorpsWeb.ProjectControllerTest do
22
@moduledoc false
33

44
use CodeCorpsWeb.ApiCase, resource_name: :project
5-
use Bamboo.Test
65

7-
alias CodeCorps.{Analytics.SegmentTraitsBuilder, Emails, Project, Repo}
6+
alias CodeCorps.{
7+
Analytics.SegmentTraitsBuilder, SparkPost.Emails, Project, Repo
8+
}
89

910
@valid_attrs %{
1011
cloudinary_public_id: "foo123",
@@ -148,7 +149,7 @@ defmodule CodeCorpsWeb.ProjectControllerTest do
148149

149150
email =
150151
project
151-
|> CodeCorps.SparkPost.Emails.ProjectApprovalRequest.build()
152+
|> Emails.ProjectApprovalRequest.build()
152153

153154
assert_received ^email
154155

@@ -172,9 +173,9 @@ defmodule CodeCorpsWeb.ProjectControllerTest do
172173

173174
email =
174175
project
175-
|> Emails.ProjectApprovedEmail.create()
176+
|> Emails.ProjectApproved.build()
176177

177-
assert_delivered_email(email)
178+
assert_received ^email
178179

179180
user_id = current_user.id
180181
traits = project |> SegmentTraitsBuilder.build

0 commit comments

Comments
 (0)