Current section

Files

Jump to
blossom lib blossom workers mailer.ex
Raw

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