mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-24 23:59:40 +02:00
Subscription tests and domain (#2209)
* Save work * Subscriptions and trials domain * Store family ID on customer * Remove indirection of stripe calls * Test simplifications * Update brakeman * Fix stripe tests in CI * Update billing page to show subscription details * Remove legacy columns * Complete billing settings page * Fix hardcoded plan name * Handle subscriptions for self hosting mode * Lint fixes
This commit is contained in:
parent
8c10e87387
commit
5da4bb6dc3
40 changed files with 1041 additions and 233 deletions
|
@ -4,49 +4,40 @@ class SubscriptionsController < ApplicationController
|
|||
|
||||
# Upgrade page for unsubscribed users
|
||||
def upgrade
|
||||
render layout: "onboardings"
|
||||
end
|
||||
|
||||
def start_trial
|
||||
unless Current.family.trialing?
|
||||
ActiveRecord::Base.transaction do
|
||||
Current.user.update!(onboarded_at: Time.current)
|
||||
Current.family.update!(trial_started_at: Time.current)
|
||||
end
|
||||
if Current.family.subscription&.active?
|
||||
redirect_to root_path, notice: "You are already subscribed."
|
||||
else
|
||||
@plan = params[:plan] || "annual"
|
||||
render layout: "onboardings"
|
||||
end
|
||||
|
||||
redirect_to root_path, notice: "Welcome to Maybe!"
|
||||
end
|
||||
|
||||
def new
|
||||
price_map = {
|
||||
monthly: ENV["STRIPE_MONTHLY_PRICE_ID"],
|
||||
annual: ENV["STRIPE_ANNUAL_PRICE_ID"]
|
||||
}
|
||||
|
||||
price_id = price_map[(params[:plan] || :monthly).to_sym]
|
||||
|
||||
unless Current.family.existing_customer?
|
||||
customer = stripe.create_customer(
|
||||
email: Current.family.primary_user.email,
|
||||
metadata: { family_id: Current.family.id }
|
||||
)
|
||||
|
||||
Current.family.update(stripe_customer_id: customer.id)
|
||||
end
|
||||
|
||||
checkout_session_url = stripe.get_checkout_session_url(
|
||||
price_id: price_id,
|
||||
customer_id: Current.family.stripe_customer_id,
|
||||
checkout_session = stripe.create_checkout_session(
|
||||
plan: params[:plan],
|
||||
family_id: Current.family.id,
|
||||
family_email: Current.family.billing_email,
|
||||
success_url: success_subscription_url + "?session_id={CHECKOUT_SESSION_ID}",
|
||||
cancel_url: upgrade_subscription_url(plan: params[:plan])
|
||||
cancel_url: upgrade_subscription_url
|
||||
)
|
||||
|
||||
redirect_to checkout_session_url, allow_other_host: true, status: :see_other
|
||||
Current.family.update!(stripe_customer_id: checkout_session.customer_id)
|
||||
|
||||
redirect_to checkout_session.url, allow_other_host: true, status: :see_other
|
||||
end
|
||||
|
||||
# Only used for managing our "offline" trials. Paid subscriptions are handled in success callback of checkout session
|
||||
def create
|
||||
if Current.family.can_start_trial?
|
||||
Current.family.start_trial_subscription!
|
||||
redirect_to root_path, notice: "Welcome to Maybe!"
|
||||
else
|
||||
redirect_to root_path, alert: "You have already started or completed a trial. Please upgrade to continue."
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
portal_session_url = stripe.get_billing_portal_session_url(
|
||||
portal_session_url = stripe.create_billing_portal_session_url(
|
||||
customer_id: Current.family.stripe_customer_id,
|
||||
return_url: settings_billing_url
|
||||
)
|
||||
|
@ -54,12 +45,16 @@ class SubscriptionsController < ApplicationController
|
|||
redirect_to portal_session_url, allow_other_host: true, status: :see_other
|
||||
end
|
||||
|
||||
# Stripe redirects here after a successful checkout session and passes the session ID in the URL
|
||||
def success
|
||||
checkout_session = stripe.retrieve_checkout_session(params[:session_id])
|
||||
Current.session.update(subscribed_at: Time.at(checkout_session.created))
|
||||
redirect_to root_path, notice: "You have successfully subscribed to Maybe+."
|
||||
rescue Stripe::InvalidRequestError
|
||||
redirect_to settings_billing_path, alert: "Something went wrong processing your subscription. Please contact us to get this fixed."
|
||||
checkout_result = stripe.get_checkout_result(params[:session_id])
|
||||
|
||||
if checkout_result.success?
|
||||
Current.family.start_subscription!(checkout_result.subscription_id)
|
||||
redirect_to root_path, notice: "Welcome to Maybe! Your subscription has been created."
|
||||
else
|
||||
redirect_to root_path, alert: "Something went wrong processing your subscription. Please contact us to get this fixed."
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue