Packages

phoenix_kit

1.7.77
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules billing web provider_settings.ex
Raw

lib/modules/billing/web/provider_settings.ex

defmodule PhoenixKit.Modules.Billing.Web.ProviderSettings do
@moduledoc """
Payment provider settings LiveView for the billing module.
Provides configuration interface for Stripe, PayPal, and Razorpay payment providers.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.Billing
alias PhoenixKit.Modules.Billing.Providers
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
@impl true
def mount(_params, _session, socket) do
if Billing.enabled?() do
project_title = Settings.get_project_title()
socket =
socket
|> assign(:page_title, "Payment Providers")
|> assign(:project_title, project_title)
|> assign(:url_path, Routes.path("/admin/settings/billing/providers"))
|> load_provider_settings()
{:ok, socket}
else
{:ok,
socket
|> put_flash(:error, "Billing module is not enabled")
|> push_navigate(to: Routes.path("/admin/billing/settings"))}
end
end
@impl true
def handle_params(_params, _url, socket) do
{:noreply, socket}
end
defp load_provider_settings(socket) do
socket
# Stripe settings
|> assign(:stripe_enabled, Settings.get_setting("billing_stripe_enabled", "false") == "true")
|> assign(:stripe_secret_key, Settings.get_setting("billing_stripe_secret_key", ""))
|> assign(:stripe_publishable_key, Settings.get_setting("billing_stripe_publishable_key", ""))
|> assign(:stripe_webhook_secret, Settings.get_setting("billing_stripe_webhook_secret", ""))
|> assign(:stripe_webhook_url, Routes.url("/webhooks/billing/stripe"))
# PayPal settings
|> assign(:paypal_enabled, Settings.get_setting("billing_paypal_enabled", "false") == "true")
|> assign(:paypal_client_id, Settings.get_setting("billing_paypal_client_id", ""))
|> assign(:paypal_client_secret, Settings.get_setting("billing_paypal_client_secret", ""))
|> assign(:paypal_webhook_id, Settings.get_setting("billing_paypal_webhook_id", ""))
|> assign(:paypal_mode, Settings.get_setting("billing_paypal_mode", "sandbox"))
|> assign(:paypal_webhook_url, Routes.url("/webhooks/billing/paypal"))
# Razorpay settings
|> assign(
:razorpay_enabled,
Settings.get_setting("billing_razorpay_enabled", "false") == "true"
)
|> assign(:razorpay_key_id, Settings.get_setting("billing_razorpay_key_id", ""))
|> assign(:razorpay_key_secret, Settings.get_setting("billing_razorpay_key_secret", ""))
|> assign(
:razorpay_webhook_secret,
Settings.get_setting("billing_razorpay_webhook_secret", "")
)
|> assign(:razorpay_webhook_url, Routes.url("/webhooks/billing/razorpay"))
# Provider availability
|> assign(:available_providers, Providers.list_available_providers())
end
@impl true
def handle_event("toggle_stripe", _params, socket) do
new_enabled = !socket.assigns.stripe_enabled
Settings.update_setting("billing_stripe_enabled", to_string(new_enabled))
{:noreply,
socket
|> assign(:stripe_enabled, new_enabled)
|> assign(:available_providers, Providers.list_available_providers())
|> put_flash(:info, if(new_enabled, do: "Stripe enabled", else: "Stripe disabled"))}
end
@impl true
def handle_event("save_stripe", params, socket) do
settings = [
{"billing_stripe_secret_key", params["secret_key"] || ""},
{"billing_stripe_publishable_key", params["publishable_key"] || ""},
{"billing_stripe_webhook_secret", params["webhook_secret"] || ""}
]
Enum.each(settings, fn {key, value} ->
Settings.update_setting(key, value)
end)
{:noreply,
socket
|> load_provider_settings()
|> put_flash(:info, "Stripe settings saved")}
end
@impl true
def handle_event("toggle_paypal", _params, socket) do
new_enabled = !socket.assigns.paypal_enabled
Settings.update_setting("billing_paypal_enabled", to_string(new_enabled))
{:noreply,
socket
|> assign(:paypal_enabled, new_enabled)
|> assign(:available_providers, Providers.list_available_providers())
|> put_flash(:info, if(new_enabled, do: "PayPal enabled", else: "PayPal disabled"))}
end
@impl true
def handle_event("save_paypal", params, socket) do
settings = [
{"billing_paypal_client_id", params["client_id"] || ""},
{"billing_paypal_client_secret", params["client_secret"] || ""},
{"billing_paypal_webhook_id", params["webhook_id"] || ""},
{"billing_paypal_mode", params["mode"] || "sandbox"}
]
Enum.each(settings, fn {key, value} ->
Settings.update_setting(key, value)
end)
{:noreply,
socket
|> load_provider_settings()
|> put_flash(:info, "PayPal settings saved")}
end
@impl true
def handle_event("toggle_razorpay", _params, socket) do
new_enabled = !socket.assigns.razorpay_enabled
Settings.update_setting("billing_razorpay_enabled", to_string(new_enabled))
{:noreply,
socket
|> assign(:razorpay_enabled, new_enabled)
|> assign(:available_providers, Providers.list_available_providers())
|> put_flash(:info, if(new_enabled, do: "Razorpay enabled", else: "Razorpay disabled"))}
end
@impl true
def handle_event("save_razorpay", params, socket) do
settings = [
{"billing_razorpay_key_id", params["key_id"] || ""},
{"billing_razorpay_key_secret", params["key_secret"] || ""},
{"billing_razorpay_webhook_secret", params["webhook_secret"] || ""}
]
Enum.each(settings, fn {key, value} ->
Settings.update_setting(key, value)
end)
{:noreply,
socket
|> load_provider_settings()
|> put_flash(:info, "Razorpay settings saved")}
end
# Helper to mask sensitive keys
def mask_key(nil), do: ""
def mask_key(""), do: ""
def mask_key(key) when is_binary(key) do
len = String.length(key)
if len > 8 do
String.slice(key, 0, 4) <> String.duplicate("•", len - 8) <> String.slice(key, -4, 4)
else
String.duplicate("•", len)
end
end
def has_credentials?(key) when is_binary(key), do: key != ""
def has_credentials?(_), do: false
end