diff --git a/saas/exe/stripe-dev b/saas/exe/stripe-dev index 820264766..c2aea61a4 100755 --- a/saas/exe/stripe-dev +++ b/saas/exe/stripe-dev @@ -1,10 +1,30 @@ #!/usr/bin/env ruby # -# Fetches Stripe development environment variables from 1Password. +# Fetches Stripe development environment variables from 1Password and starts +# the Stripe CLI webhook listener. +# # Usage: eval "$(bundle exec stripe-dev)" require "json" +require "fileutils" +LOG_FILE = "log/stripe.development.log" +PID_FILE = "tmp/stripe.tunnel.pid" + +# Ensure directories exist +FileUtils.mkdir_p("log") +FileUtils.mkdir_p("tmp") + +# Kill any existing stripe tunnel process +if File.exist?(PID_FILE) + old_pid = File.read(PID_FILE).strip.to_i + if old_pid > 0 + Process.kill("TERM", old_pid) rescue nil + end + File.delete(PID_FILE) +end + +# Fetch secrets from 1Password secrets_escaped = `kamal secrets fetch \ --adapter 1password \ --account basecamp \ @@ -12,12 +32,49 @@ secrets_escaped = `kamal secrets fetch \ "Development/STRIPE_SECRET_KEY" \ "Development/STRIPE_MONTHLY_V1_PRICE_ID" 2>/dev/null` -# kamal outputs shell-escaped JSON, unescape it secrets_json = secrets_escaped.gsub(/\\(.)/, '\1') secrets = JSON.parse(secrets_json) stripe_secret_key = secrets["Deploy/Fizzy/Development/STRIPE_SECRET_KEY"] stripe_price_id = secrets["Deploy/Fizzy/Development/STRIPE_MONTHLY_V1_PRICE_ID"] +# Clear previous log file +File.write(LOG_FILE, "") + +# Start stripe listen in background +pid = spawn( + "stripe", "listen", "--forward-to", "localhost:3006/stripe/webhooks", + out: [LOG_FILE, "a"], + err: [LOG_FILE, "a"] +) +Process.detach(pid) + +# Save PID for cleanup +File.write(PID_FILE, pid.to_s) + +# Wait for the webhook secret to appear in logs +webhook_secret = nil +20.times do + sleep 0.5 + if File.exist?(LOG_FILE) + content = File.read(LOG_FILE) + if match = content.match(/webhook signing secret is (whsec_\w+)/) + webhook_secret = match[1] + break + end + end +end + +if webhook_secret.nil? + warn "Warning: Could not capture webhook secret from stripe listen" +end + +# Output export statements puts %Q(export STRIPE_SECRET_KEY="#{stripe_secret_key}") puts %Q(export STRIPE_MONTHLY_V1_PRICE_ID="#{stripe_price_id}") +puts %Q(export STRIPE_WEBHOOK_SECRET="#{webhook_secret}") if webhook_secret + +# Informational message to stderr (won't be eval'd) +warn "" +warn "Stripe CLI listening (PID: #{pid})" +warn "Logs: #{LOG_FILE}"