Packages
blossom
0.27.2
0.29.3
0.29.2
0.29.1
0.29.0
0.28.0
0.27.3
0.27.2
0.27.1
0.27.0
0.26.3
0.26.2
0.26.1
0.26.0
0.25.3
0.25.2
0.25.1
0.25.0
0.24.1
0.24.0
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.8
0.21.7
0.21.6
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.2
0.12.1
0.12.0
0.11.0
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Easy identity for easy authentication
Current section
Files
Jump to
Current section
Files
lib/blossom/workers/mailer.ex
defmodule Blossom.Workers.Mailer do
alias Blossom.Workers.Mailer
alias KilnCore.Utils
def queue(caller, user, kind) do
%{user: user, kind: kind}
|> caller.new()
|> Oban.insert()
end
def get_user(args, ctx) do
%{"id" => args["user"]}
|> ctx[:users].get(:system)
|> List.first()
end
def get_realm(id, ctx) do
id
|> ctx[:realms].show(:system)
|> List.first()
end
def make_code(user, kind, ctx) do
%{"user" => user.id, "kind" => kind, "realm" => user.realm}
|> ctx[:codes].new(:system, [])
end
def send_mail(args, func_args, user, ctx) do
case Mailer.make_code(user, args["kind"], ctx) do
{:ok, code} ->
func = String.to_atom(args["kind"])
apply(ctx[:mail], func, [code | func_args])
{:error, _e} = e ->
e
end
end
def prepare_mail(args, ctx) do
user = Mailer.get_user(args, ctx)
settings = ctx[:settings].get(%{}, :system)
realm = Mailer.get_realm(user.realm, ctx)
Mailer.send_mail(args, [user, realm, settings], user, ctx)
end
def perform(args, ctx) do
cond do
args["kind"] == "email_verification" ->
Mailer.prepare_mail(args, ctx)
args["kind"] == "password_reset" ->
Mailer.prepare_mail(args, ctx)
true ->
:ok
end
end
defmacro __using__(opts \\ []) do
quote do
@caller unquote(__CALLER__.module)
@mail Utils.option_or_mod_replace(
@caller,
unquote(opts),
:mail,
Mail,
1,
0..1
)
controllers =
Utils.option_or_mod_replace(
@caller,
unquote(opts),
:controllers,
Controllers,
1
)
@realms Utils.option_or_mod_replace(
controllers,
unquote(opts),
:realms,
Realms,
2
)
@settings Utils.option_or_mod_replace(
controllers,
unquote(opts),
:settings,
Settings,
2
)
@users Utils.option_or_mod_replace(
controllers,
unquote(opts),
:users,
Users,
2
)
@codes Utils.option_or_mod_replace(
controllers,
unquote(opts),
:otp_codes,
OtpCodes,
2
)
@ctx [
mail: @mail,
realms: @realms,
settings: @settings,
users: @users,
codes: @codes
]
use Oban.Worker
require Logger
alias Blossom.Workers.Mailer
def queue(user, kind) do
Mailer.queue(@caller, user, kind)
end
@impl Oban.Worker
def perform(%Oban.Job{args: args}) do
Logger.info("Processing #{args["kind"]} for user #{args["user"]}")
Mailer.perform(args, @ctx)
end
end
end
end