Skip to content

Commit 93e3c00

Browse files
committed
Switch project user acceptance email to SparkPost
1 parent bcfca0d commit 93e3c00

File tree

8 files changed

+89
-70
lines changed

8 files changed

+89
-70
lines changed

lib/code_corps/emails/project_user_acceptance_email.ex

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

lib/code_corps/sparkpost/emails/emails.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ defmodule CodeCorps.SparkPost.Emails do
2323
project |> Emails.ProjectApproved.build |> API.send_transmission
2424
end
2525

26+
def send_project_user_acceptance_email(project_user) do
27+
project_user |> Emails.ProjectUserAcceptance.build |> API.send_transmission
28+
end
29+
2630
def send_receipt_email(charge, invoice) do
2731
case charge |> Emails.Receipt.build(invoice) do
2832
%SparkPost.Transmission{} = transmission ->
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
defmodule CodeCorps.SparkPost.Emails.ProjectUserAcceptance do
2+
alias SparkPost.{Content, Transmission}
3+
4+
alias CodeCorps.{
5+
Presenters.ImagePresenter,
6+
Project,
7+
ProjectUser,
8+
Repo,
9+
SparkPost.Emails.Recipient,
10+
User,
11+
WebClient
12+
}
13+
14+
@spec build(ProjectUser.t) :: %Transmission{}
15+
def build(%ProjectUser{project: project, user: user}) do
16+
%Transmission{
17+
content: %Content.TemplateRef{template_id: "project-user-acceptance"},
18+
options: %Transmission.Options{inline_css: true},
19+
recipients: [user |> Recipient.build],
20+
substitution_data: %{
21+
from_name: "Code Corps",
22+
from_email: "team@codecorps.org",
23+
project_logo_url: ImagePresenter.large(project),
24+
project_title: project.title,
25+
project_url: project |> preload() |> url(),
26+
subject: "#{project.title} just added you as a contributor",
27+
user_first_name: user.first_name,
28+
user_image_url: ImagePresenter.large(user)
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 url(Project.t) :: String.t
37+
defp url(project) do
38+
WebClient.url()
39+
|> URI.merge(project.organization.slug <> "/" <> project.slug)
40+
|> URI.to_string
41+
end
42+
end

lib/code_corps/sparkpost/sparkpost.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ defmodule CodeCorps.SparkPost do
99
defdelegate send_organization_invite_email(invite), to: Emails
1010
defdelegate send_project_approval_request_email(project), to: Emails
1111
defdelegate send_project_approved_email(project), to: Emails
12+
defdelegate send_project_user_acceptance_email(project_user), to: Emails
1213
defdelegate send_receipt_email(charge, invoice), to: Emails
1314
defdelegate send_reply_to_conversation_email(part, user), to: Emails
1415
end

lib/code_corps_web/controllers/project_user_controller.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ defmodule CodeCorpsWeb.ProjectUserController do
22
@moduledoc false
33
use CodeCorpsWeb, :controller
44

5-
alias CodeCorps.{Emails, Helpers.Query, Mailer, ProjectUser, User}
5+
alias CodeCorps.{Emails, Helpers.Query, Mailer, ProjectUser, SparkPost, User}
66

77
action_fallback CodeCorpsWeb.FallbackController
88
plug CodeCorpsWeb.Plug.DataToAttributes
@@ -85,7 +85,6 @@ defmodule CodeCorpsWeb.ProjectUserController do
8585
defp send_acceptance_email(project_user) do
8686
project_user
8787
|> Repo.preload(@preloads)
88-
|> Emails.ProjectUserAcceptanceEmail.create()
89-
|> Mailer.deliver_now()
88+
|> SparkPost.send_project_user_acceptance_email()
9089
end
9190
end

test/lib/code_corps/emails/project_user_acceptance_email_test.exs

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
defmodule CodeCorps.SparkPost.Emails.ProjectUserAcceptanceTest do
2+
use CodeCorps.DbAccessCase
3+
4+
alias CodeCorps.SparkPost.Emails.ProjectUserAcceptance
5+
6+
describe "build/1" do
7+
test "provides substitution data for all keys used by template" do
8+
project_user = insert(:project_user)
9+
10+
%{substitution_data: data} = ProjectUserAcceptance.build(project_user)
11+
12+
expected_keys =
13+
"project-user-acceptance"
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: project, user: user} = project_user = insert(:project_user)
20+
21+
%{substitution_data: data, recipients: [recipient]} =
22+
ProjectUserAcceptance.build(project_user)
23+
24+
assert data.from_name == "Code Corps"
25+
assert data.from_email == "team@codecorps.org"
26+
27+
assert data.project_title == project.title
28+
assert data.project_url == "http://localhost:4200/#{project.organization.slug}/#{project.slug}"
29+
assert data.project_logo_url == "#{Application.get_env(:code_corps, :asset_host)}/icons/project_default_large_.png"
30+
assert data.user_image_url == "#{Application.get_env(:code_corps, :asset_host)}/icons/user_default_large_.png"
31+
assert data.user_first_name == user.first_name
32+
assert data.subject == "#{project.title} just added you as a contributor"
33+
34+
assert recipient.address.email == user.email
35+
assert recipient.address.name == user.first_name
36+
end
37+
end
38+
end

test/lib/code_corps_web/controllers/project_user_controller_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ defmodule CodeCorpsWeb.ProjectUserControllerTest do
119119
CodeCorps.ProjectUser
120120
|> CodeCorps.Repo.get_by(role: "contributor")
121121
|> CodeCorps.Repo.preload([:project, :user])
122-
|> CodeCorps.Emails.ProjectUserAcceptanceEmail.create()
122+
|> CodeCorps.SparkPost.Emails.ProjectUserAcceptance.build()
123123

124-
assert_delivered_email(email)
124+
assert_received ^email
125125
end
126126

127127
test "doesn't update and renders 401 when unauthenticated", %{conn: conn} do

0 commit comments

Comments
 (0)