Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: sending email for registration and password lost #32

Merged
merged 14 commits into from
Feb 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 29 additions & 8 deletions apps/lenra/lib/lenra/services/email_services.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,42 @@ defmodule Lenra.EmailService do
@moduledoc false

import Bamboo.Email
alias Bamboo.SendGridHelper

def welcome_text_email(email_address, code) do
@spec create_welcome_email(String.t(), String.t()) :: Bamboo.Email.t()
def create_welcome_email(email_address, code) do
# base template ID : d-bd160809d9a04b07ac6925a823f8f61c
new_email()
|> to(email_address)
|> from("subscription@lenra.me")
|> subject("Bienvenue!")
|> text_body("Bienvenue chez Lenra " <> email_address <> " ! " <> "Votre code: " <> code)
|> from("no-reply@lenra.io")
|> SendGridHelper.with_template("d-bd160809d9a04b07ac6925a823f8f61c")
|> SendGridHelper.add_dynamic_field("subject", "Bienvenue !")
|> SendGridHelper.add_dynamic_field(
"body_hello",
"Bonjour " <> email_address <> ",<br />Merci pour votre inscription! Vous rejoignez une communauté incroyable"
)
|> SendGridHelper.add_dynamic_field("code", code)
|> SendGridHelper.add_dynamic_field(
"body_help",
"Ce code vous permet de valider votre inscription.<br />Si vous rencontrez un problème contactez-nous à l'adresse mail suivante : <a href=\"mailto:contact@lenra.io?subject=&amp;body=\">contact@lenra.io</a>"
)
end

def recovery_email(email_address, code) do
@spec create_recovery_email(String.t(), String.t()) :: Bamboo.Email.t()
def create_recovery_email(email_address, code) do
new_email()
|> to(email_address)
|> from("verification@lenra.me")
|> subject("Votre code de vérification!")
|> text_body("Bonjour " <> email_address <> " ! " <> "Votre code: " <> code)
|> from("no-reply@lenra.io")
|> SendGridHelper.with_template("d-bd160809d9a04b07ac6925a823f8f61c")
|> SendGridHelper.add_dynamic_field("subject", "Votre code de vérification")
|> SendGridHelper.add_dynamic_field(
"body_hello",
"Bonjour " <> email_address <> ",<br />Modifiez votre mot de passe à l'aide du code suivant"
)
|> SendGridHelper.add_dynamic_field("code", code)
|> SendGridHelper.add_dynamic_field(
"body_help",
"Ce code vous permet de modifier votre mot de passe.<br />Si vous rencontrez un problème contactez-nous à l'adresse mail suivante : <a href=\"mailto:contact@lenra.io?subject=&amp;body=\">contact@lenra.io</a>"
)
end
end
18 changes: 8 additions & 10 deletions apps/lenra/lib/lenra/services/user_services.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Lenra.UserServices do
"""
import Ecto.Query, only: [from: 2]

alias Lenra.{Repo, User, Password, DevCode, RegistrationCodeServices}
alias Lenra.{Repo, User, Password, DevCode, RegistrationCodeServices, EmailWorker}

@doc """
Register a new user, save him to the database. The email must be unique. The password is hashed before inserted to the database.
Expand All @@ -25,22 +25,20 @@ defmodule Lenra.UserServices do
RegistrationCodeServices.registration_code_changeset(user)
end
)
# send verification email disabled
# |> Ecto.Multi.run(:add_event, &add_registration_events/2)
|> Ecto.Multi.run(:add_event, &add_registration_events/2)
ClementGld marked this conversation as resolved.
Show resolved Hide resolved
|> Repo.transaction()
end

def get(id) do
Repo.get(User, id)
end

# send verification email disabled
# defp add_registration_events(_repo, %{
# inserted_registration_code: registration_code,
# inserted_user: user
# }) do
# EmailWorker.add_email_verification_event(user, registration_code.code)
# end
defp add_registration_events(_repo, %{
ClementGld marked this conversation as resolved.
Show resolved Hide resolved
inserted_registration_code: registration_code,
inserted_user: user
}) do
EmailWorker.add_email_verification_event(user, registration_code.code)
end

def update(user, params) do
Ecto.Multi.new()
Expand Down
4 changes: 2 additions & 2 deletions apps/lenra/lib/lenra/workers/email_worker.ex
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ defmodule Lenra.EmailWorker do
%User{} = user,
code
) do
EmailService.welcome_text_email(user.email, code)
EmailService.create_welcome_email(user.email, code)
|> Mailer.deliver_now()
end

def email_password_lost(
%User{} = user,
code
) do
EmailService.recovery_email(user.email, code)
EmailService.create_recovery_email(user.email, code)
|> Mailer.deliver_now()
end
end
20 changes: 18 additions & 2 deletions apps/lenra/test/lenra/services/user_services_test.exs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
defmodule UserServicesTest do
use Lenra.RepoCase, async: true
alias Lenra.{User, DevCode, UserServices}
use Lenra.RepoCase, async: false
alias Lenra.{User, DevCode, UserServices, PasswordServices, EmailService, PasswordCode}
use Bamboo.Test, shared: true

test "register user should succeed" do
{:ok, %{inserted_user: user, inserted_registration_code: registration_code}} = register_john_doe()
Expand All @@ -13,6 +14,21 @@ defmodule UserServicesTest do
assert String.length(registration_code.code) == 8
end

test "send email after registration" do
{:ok, %{inserted_user: user, inserted_registration_code: registration_code}} = register_john_doe()

email = EmailService.create_welcome_email(user.email, registration_code.code)

assert_delivered_email(email)
end

test "send email for a password recovery" do
{:ok, %{inserted_user: user}} = register_john_doe()
{:ok, %{password_code: %PasswordCode{} = password_code}} = PasswordServices.send_password_code(user)
email = EmailService.create_recovery_email(user.email, password_code.code)
assert_delivered_email(email)
end

test "register should fail if email already exists" do
{:ok, _} = register_john_doe()

Expand Down
1 change: 1 addition & 0 deletions config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ config :guardian, Guardian.DB,

# Configure bamboo
config :lenra, Lenra.Mailer,
adapter: Bamboo.SendGridAdapter,
hackney_opts: [
recv_timeout: :timer.minutes(1),
connect_timeout: :timer.minutes(1)
Expand Down
2 changes: 0 additions & 2 deletions config/prod.exs
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,3 @@ config :lenra,
# Edit to allow only wanted sources
config :cors_plug,
origin: []

config :lenra, Lenra.Mailer, adapter: Bamboo.SendGridAdapter