if Code.ensure_loaded?(Igniter) do defmodule Mix.Tasks.ExPaymob.Install do @moduledoc """ Installs ExPaymob configuration into your Phoenix project. mix ex_paymob.install ## What it does 1. Adds base configuration to `config/config.exs` 2. Adds runtime configuration to `config/runtime.exs` 3. Adds test configuration to `config/test.exs` 4. Adds `:ex_paymob` to formatter's `import_deps` 5. Prints setup instructions for webhook routes """ use Igniter.Mix.Task @impl true def info(_argv, _composing_task) do %Igniter.Mix.Task.Info{ group: :ex_paymob, adds_deps: [], installs: [], example: "mix ex_paymob.install" } end @impl true def igniter(igniter) do app_name = Igniter.Project.Application.app_name(igniter) igniter |> setup_config(app_name) |> setup_runtime_config() |> setup_test_config() |> setup_formatter() |> add_notices() end defp setup_config(igniter, _app_name) do Igniter.Project.Config.configure( igniter, "config.exs", :ex_paymob, [:region], {:code, Sourceror.parse_string!(":egypt")} ) end defp setup_runtime_config(igniter) do igniter |> Igniter.Project.Config.configure( "runtime.exs", :ex_paymob, [:secret_key], {:code, Sourceror.parse_string!( ~s[System.get_env("PAYMOB_SECRET_KEY") || raise "PAYMOB_SECRET_KEY not set"] )} ) |> Igniter.Project.Config.configure( "runtime.exs", :ex_paymob, [:public_key], {:code, Sourceror.parse_string!(~s[System.get_env("PAYMOB_PUBLIC_KEY")])} ) |> Igniter.Project.Config.configure( "runtime.exs", :ex_paymob, [:hmac_secret], {:code, Sourceror.parse_string!( ~s[System.get_env("PAYMOB_HMAC_SECRET") || raise "PAYMOB_HMAC_SECRET not set"] )} ) end defp setup_test_config(igniter) do igniter |> Igniter.Project.Config.configure( "test.exs", :ex_paymob, [:secret_key], "test_secret_key" ) |> Igniter.Project.Config.configure( "test.exs", :ex_paymob, [:public_key], "test_public_key" ) |> Igniter.Project.Config.configure( "test.exs", :ex_paymob, [:hmac_secret], "test_hmac_secret" ) end defp setup_formatter(igniter) do Igniter.Project.Formatter.import_dep(igniter, :ex_paymob) end defp add_notices(igniter) do Igniter.add_notice(igniter, """ ExPaymob installed successfully! Next steps: 1. Set environment variables: - PAYMOB_SECRET_KEY (required) - PAYMOB_PUBLIC_KEY (for checkout URLs) - PAYMOB_HMAC_SECRET (for webhook verification) 2. Add webhook route to your router: # In your endpoint.ex, before Plug.Parsers: plug Plug.Parsers, parsers: [:json], pass: ["application/json"], json_decoder: Jason, body_reader: {ExPaymob.Plug.RawBodyReader, :read_body, []} # In your router.ex: scope "/webhooks" do pipe_through :api forward "/paymob", ExPaymob.Plug.WebhookPlug, handler: MyApp.PaymobWebhookHandler end 3. Create your webhook handler: defmodule MyApp.PaymobWebhookHandler do def handle_event(conn, event) do # Process the Paymob event... conn end end 4. For UAE region, add to config: config :ex_paymob, region: :uae """) end end end