Ensuring per user workflow uniqueness

Sure! The trick is to put a single job with uniqueness in front of the workflow creation. Here’s an example:

defmodule MyApp.Flow do
  # The worker doesn't normally have unique enabled
  use Oban.Pro.Worker

  alias Oban.Pro.Workflow

  # Gate the workflow behind a job that's unique by the user id
  def invoke(user) do
    %{user_id: user.id}
    |> new(unique: [period: {3, :hours}])
    |> Oban.insert()
  end

  @impl Oban.Pro.Worker
  def process(job) do
    user = MyApp.Repo.get(MyApp.User, job.args["user_id"])

    # Build up the workflow within the invoked job. Using context and cascade purely as an example.
    Workflow.new()
    |> Workflow.put_context(%{user: user})
    |> Workflow.add_cascade(:a, ...)
    |> Workflow.add_cascade(:b, ...)
    |> Workflow.add_cascade(:c, ...)
    |> Oban.insert_all()
  end
end