Skip to content

Commit 2a5dcb3

Browse files
committed
Switch ProjectApprovalRequest email to SparkPost
1 parent 484194b commit 2a5dcb3

File tree

8 files changed

+109
-98
lines changed

8 files changed

+109
-98
lines changed

lib/code_corps/emails/project_approval_request_email.ex

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

lib/code_corps/projects/projects.ex

Lines changed: 3 additions & 4 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, User
9+
Analytics.SegmentTracker, Emails, Mailer, Project, Repo, SparkPost, User
1010
}
1111
alias Ecto.Changeset
1212

@@ -81,12 +81,11 @@ defmodule CodeCorps.Projects do
8181
end
8282
defp maybe_send_approval_request_email(%Project{}, %Project{}), do: :nothing
8383

84-
@spec send_approval_request_email(Project.t) :: Bamboo.Email.t
84+
@spec send_approval_request_email(Project.t) :: tuple
8585
defp send_approval_request_email(project) do
8686
project
8787
|> preload()
88-
|> Emails.ProjectApprovalRequestEmail.create()
89-
|> Mailer.deliver_now()
88+
|> SparkPost.send_project_approval_request_email()
9089
end
9190

9291
@spec maybe_send_approved_email(Project.t, Project.t) :: any

lib/code_corps/sparkpost/emails/emails.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ defmodule CodeCorps.SparkPost.Emails do
1515
invite |> Emails.OrganizationInvite.build |> API.send_transmission
1616
end
1717

18+
def send_project_approval_request_email(project) do
19+
project |> Emails.ProjectApprovalRequest.build |> API.send_transmission
20+
end
21+
1822
def send_receipt_email(charge, invoice) do
1923
case charge |> Emails.Receipt.build(invoice) do
2024
%SparkPost.Transmission{} = transmission ->
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
defmodule CodeCorps.SparkPost.Emails.ProjectApprovalRequest do
2+
import Ecto.Query, only: [where: 3]
3+
4+
alias SparkPost.{Content, Transmission}
5+
alias CodeCorps.{
6+
Presenters.ImagePresenter,
7+
Project,
8+
Repo,
9+
SparkPost.Emails.Recipient,
10+
User,
11+
WebClient
12+
}
13+
14+
@spec build(Project.t) :: %Transmission{}
15+
def build(%Project{} = project) do
16+
%Transmission{
17+
content: %Content.TemplateRef{template_id: "project-approval-request"},
18+
options: %Transmission.Options{inline_css: true},
19+
recipients: get_site_admins() |> Enum.map(&Recipient.build/1),
20+
substitution_data: %{
21+
admin_project_show_url: project |> admin_url(),
22+
from_name: "Code Corps",
23+
from_email: "team@codecorps.org",
24+
project_description: project.description,
25+
project_logo_url: ImagePresenter.large(project),
26+
project_title: project.title,
27+
project_url: project |> preload() |> project_url(),
28+
subject: "#{project.title} is asking to be approved"
29+
}
30+
}
31+
end
32+
33+
@spec preload(Project.t) :: Project.t
34+
defp preload(%Project{} = project), do: project |> Repo.preload(:organization)
35+
36+
@spec admin_url(Project.t) :: String.t
37+
defp admin_url(project) do
38+
WebClient.url()
39+
|> URI.merge("/admin/projects/" <> Integer.to_string(project.id))
40+
|> URI.to_string()
41+
end
42+
43+
@spec project_url(Project.t) :: String.t
44+
defp project_url(project) do
45+
WebClient.url()
46+
|> URI.merge(project.organization.slug <> "/" <> project.slug)
47+
|> URI.to_string()
48+
end
49+
50+
@spec get_site_admins() :: list(User.t)
51+
defp get_site_admins() do
52+
User
53+
|> where([object], object.admin == true)
54+
|> Repo.all()
55+
end
56+
end

lib/code_corps/sparkpost/sparkpost.ex

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

test/lib/code_corps/emails/project_approval_request_email_test.exs

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
defmodule CodeCorps.SparkPost.Emails.ProjectApprovalRequestTest do
2+
use CodeCorps.DbAccessCase
3+
4+
alias CodeCorps.SparkPost.Emails.ProjectApprovalRequest
5+
6+
describe "build/1" do
7+
test "provides substitution data for all keys used by template" do
8+
project = insert(:project)
9+
insert(:user, admin: true)
10+
11+
%{substitution_data: data} = ProjectApprovalRequest.build(project)
12+
13+
expected_keys =
14+
"project-approval-request"
15+
|> CodeCorps.SparkPostHelpers.get_keys_used_by_template
16+
assert data |> Map.keys == expected_keys
17+
end
18+
19+
test "builds correct transmission model" do
20+
project = insert(:project)
21+
admin_1 = insert(:user, admin: true)
22+
admin_2 = insert(:user, admin: true)
23+
24+
%{substitution_data: data, recipients: [recipient_1, recipient_2]} =
25+
ProjectApprovalRequest.build(project)
26+
27+
assert data.from_name == "Code Corps"
28+
assert data.from_email == "team@codecorps.org"
29+
30+
assert data.admin_project_show_url == "http://localhost:4200/admin/projects/#{project.id}"
31+
assert data.project_description == project.description
32+
assert data.project_logo_url == "#{Application.get_env(:code_corps, :asset_host)}/icons/project_default_large_.png"
33+
assert data.project_title == project.title
34+
assert data.project_url == "http://localhost:4200/#{project.organization.slug}/#{project.slug}"
35+
assert data.subject == "#{project.title} is asking to be approved"
36+
37+
assert recipient_1.address.email == admin_1.email
38+
assert recipient_1.address.name == admin_1.first_name
39+
assert recipient_2.address.email == admin_2.email
40+
assert recipient_2.address.name == admin_2.first_name
41+
end
42+
end
43+
end

test/lib/code_corps_web/controllers/project_controller_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,9 @@ defmodule CodeCorpsWeb.ProjectControllerTest do
148148

149149
email =
150150
project
151-
|> Emails.ProjectApprovalRequestEmail.create()
151+
|> CodeCorps.SparkPost.Emails.ProjectApprovalRequest.build()
152152

153-
assert_delivered_email(email)
153+
assert_received ^email
154154

155155
user_id = current_user.id
156156
traits = project |> SegmentTraitsBuilder.build

0 commit comments

Comments
 (0)