Remove payment/subscription system and card/storage limits

Fizzy is now free. Remove the entire Stripe billing system,
subscription management, and card/storage limit enforcement.

Removes from saas/: Plan model, Account::Billing, Account::Subscription,
Account::Limited, Account::OverriddenLimits, Account::BillingWaiver,
all subscription/billing controllers and views, Stripe webhook handler,
card creation/publishing limit enforcement, admin account override UI,
usage report rake task, and all related tests.

Removes from main app: Fizzy.saas? guards for subscription panel,
SaaS card footer override, near-limit notices, and saas.css stylesheet.

Adds migration to drop billing tables from the SaaS database.

Non-billing SaaS features (push notifications, signup, authorization,
telemetry, console1984/audits1984) are preserved.
This commit is contained in:
Jorge Manrubia
2026-03-17 09:22:04 +01:00
parent bead275d27
commit 964915bc66
74 changed files with 9 additions and 2221 deletions
-83
View File
@@ -1,83 +0,0 @@
#!/usr/bin/env ruby
#
# 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 23QPQDKZC5BKBIIG7UGT5GR5RM \
--from "Deploy/Fizzy" \
"Development/STRIPE_SECRET_KEY" \
"Development/STRIPE_MONTHLY_V1_PRICE_ID" \
"Development/STRIPE_MONTHLY_EXTRA_STORAGE_V1_PRICE_ID" 2>/dev/null`
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"]
stripe_extra_storage_price_id = secrets["Deploy/Fizzy/Development/STRIPE_MONTHLY_EXTRA_STORAGE_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_MONTHLY_EXTRA_STORAGE_V1_PRICE_ID="#{stripe_extra_storage_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}"