2024-10-08 14:37:47 -05:00
|
|
|
class SubscriptionsController < ApplicationController
|
2025-05-01 16:47:14 -04:00
|
|
|
# Disables subscriptions for self hosted instances
|
|
|
|
guard_feature if: -> { self_hosted? }
|
|
|
|
|
|
|
|
# Upgrade page for unsubscribed users
|
|
|
|
def upgrade
|
|
|
|
render layout: "onboardings"
|
|
|
|
end
|
|
|
|
|
|
|
|
def start_trial
|
2025-05-02 15:21:46 -04:00
|
|
|
unless Current.family.trialing?
|
|
|
|
ActiveRecord::Base.transaction do
|
|
|
|
Current.user.update!(onboarded_at: Time.current)
|
|
|
|
Current.family.update!(trial_started_at: Time.current)
|
2025-05-01 16:47:14 -04:00
|
|
|
end
|
|
|
|
end
|
2025-05-02 15:21:46 -04:00
|
|
|
|
|
|
|
redirect_to root_path, notice: "Welcome to Maybe!"
|
2025-05-01 16:47:14 -04:00
|
|
|
end
|
2025-02-28 15:35:00 +01:00
|
|
|
|
2024-10-08 14:37:47 -05:00
|
|
|
def new
|
2025-05-01 16:47:14 -04:00
|
|
|
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(
|
2024-10-08 14:37:47 -05:00
|
|
|
email: Current.family.primary_user.email,
|
|
|
|
metadata: { family_id: Current.family.id }
|
|
|
|
)
|
2025-05-01 16:47:14 -04:00
|
|
|
|
2024-10-08 14:37:47 -05:00
|
|
|
Current.family.update(stripe_customer_id: customer.id)
|
|
|
|
end
|
|
|
|
|
2025-05-01 16:47:14 -04:00
|
|
|
checkout_session_url = stripe.get_checkout_session_url(
|
|
|
|
price_id: price_id,
|
|
|
|
customer_id: Current.family.stripe_customer_id,
|
2024-10-24 11:02:27 -04:00
|
|
|
success_url: success_subscription_url + "?session_id={CHECKOUT_SESSION_ID}",
|
2025-05-01 16:47:14 -04:00
|
|
|
cancel_url: upgrade_subscription_url(plan: params[:plan])
|
|
|
|
)
|
2024-10-08 14:37:47 -05:00
|
|
|
|
2025-05-01 16:47:14 -04:00
|
|
|
redirect_to checkout_session_url, allow_other_host: true, status: :see_other
|
2024-10-08 14:37:47 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def show
|
2025-05-01 16:47:14 -04:00
|
|
|
portal_session_url = stripe.get_billing_portal_session_url(
|
|
|
|
customer_id: Current.family.stripe_customer_id,
|
2024-10-08 14:37:47 -05:00
|
|
|
return_url: settings_billing_url
|
|
|
|
)
|
2024-10-24 11:02:27 -04:00
|
|
|
|
2025-05-01 16:47:14 -04:00
|
|
|
redirect_to portal_session_url, allow_other_host: true, status: :see_other
|
2024-10-08 14:37:47 -05:00
|
|
|
end
|
2024-10-24 11:02:27 -04:00
|
|
|
|
|
|
|
def success
|
2025-05-01 16:47:14 -04:00
|
|
|
checkout_session = stripe.retrieve_checkout_session(params[:session_id])
|
2024-10-24 11:02:27 -04:00
|
|
|
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."
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
2025-05-01 16:47:14 -04:00
|
|
|
def stripe
|
|
|
|
@stripe ||= Provider::Registry.get_provider(:stripe)
|
2025-02-28 15:35:00 +01:00
|
|
|
end
|
2024-10-08 14:37:47 -05:00
|
|
|
end
|