Current section

Files

Jump to
project lib mix tasks project add oban_web.ex
Raw

lib/mix/tasks/project/add/oban_web.ex

defmodule Mix.Tasks.Project.Add.ObanWeb do
@shortdoc "Adds Oban Web UI"
@moduledoc "Adds `oban_web` for monitoring background jobs."
use Igniter.Mix.Task
alias Mix.Tasks.Project.Helpers
@impl Igniter.Mix.Task
def igniter(igniter) do
igniter
|> add_dep()
|> add_app_logger()
|> edit_router()
|> Igniter.add_task("project.gen.oban_web_format")
end
defp add_dep(igniter) do
{package, version} = Igniter.Project.Deps.determine_dep_type_and_version!("oban_web")
Igniter.Project.Deps.add_dep(igniter, {package, version})
end
defp add_app_logger(igniter) do
app_name = Igniter.Project.Application.app_name(igniter)
app_module = Helpers.app_module(igniter)
app_supervisor = Igniter.Project.Application.app_module(igniter)
app_path = Igniter.Project.Module.proper_location(igniter, app_supervisor)
Helpers.update_file_content(igniter, app_path, fn content ->
cond do
String.contains?(content, "Oban.Web.Telemetry") ->
content
String.contains?(content, "Oban.Telemetry.attach_default_logger") ->
# Replace basic Oban telemetry with Oban Web telemetry
Regex.replace(
~r/ *opts = if Application\.fetch_env!\(:#{app_name}, :env\)[^\n]*\n *Oban\.Telemetry\.attach_default_logger\(opts\)\n/,
content,
" Oban.Web.Telemetry.attach_default_logger()\n"
)
true ->
# No existing logger, add before supervisor opts
pattern = " opts = [strategy: :one_for_one, name: #{app_module}.Supervisor]"
String.replace(
content,
pattern,
" Oban.Web.Telemetry.attach_default_logger()\n\n" <> pattern
)
end
end)
end
defp edit_router(igniter) do
{igniter, router} = Igniter.Libs.Phoenix.select_router(igniter)
igniter
|> add_router_import(router)
|> Igniter.Libs.Phoenix.add_scope(
"/admin",
"""
pipe_through :browser
oban_dashboard "/oban"
""", router: router)
end
defp add_router_import(igniter, router) do
code = "import Oban.Web.Router"
Igniter.Project.Module.find_and_update_module!(igniter, router, fn zipper ->
case Igniter.Libs.Phoenix.move_to_router_use(igniter, zipper) do
{:ok, zipper} -> {:ok, Igniter.Code.Common.add_code(zipper, code)}
:error -> Igniter.Code.Common.add_code(zipper, code, placement: :after)
end
end)
end
end