Delayed & Scheduled Execution
Sleep, schedule for specific times, and wait for events.
trial_reminderPending
trial_reminder.ex
defmodule MyApp.TrialReminder do
use Durable
use Durable.Helpers
use Durable.Wait
workflow "trial_reminder" do
step :welcome, fn ctx ->
Mailer.send_welcome(ctx["user_id"])
{:ok, %{user_id: ctx["user_id"], trial_started_at: ctx["trial_started_at"]}}
end
step :wait_3_days, fn ctx ->
sleep(days(3))
{:ok, ctx}
end
step :check_in, fn ctx ->
Mailer.send_tips(ctx.user_id)
{:ok, ctx}
end
step :wait_until_trial_ends, fn ctx ->
trial_end = DateTime.add(ctx.trial_started_at, 14, :day)
schedule_at(trial_end)
{:ok, ctx}
end
step :convert_or_remind, fn ctx ->
if Subscriptions.active?(ctx.user_id) do
{:ok, assign(ctx, :converted, true)}
else
Mailer.send_upgrade_reminder(ctx.user_id)
{:ok, assign(ctx, :converted, false)}
end
end
end
endThe code is the README example. The run is simulated in your browser, with time sped up. For the details, read the waiting guide.