Skip to content

Instantly share code, notes, and snippets.

@Bodacious
Created March 7, 2025 16:40
Show Gist options
  • Save Bodacious/b6c9ea3f1344555ba19cd96123de563e to your computer and use it in GitHub Desktop.
Save Bodacious/b6c9ea3f1344555ba19cd96123de563e to your computer and use it in GitHub Desktop.
An example of a terrible service object
class UserSubscriberService < ServiceBase
def call(user:, subscription_plan_name:, discount_code:, cadence_months: 1)
@user = user
@subscription_plan = SubscriptionPlan.active.where(name: subscription_plan_name).take
@discount = Discount.find_by(code: discount_code)
if @subscription_plan.name == 'free'
@user.subscriptions.create!(
plan: @subscription_plan,
cadence_months: cadence_months,
payment_amount: 0.0
)
5.times { @user.free_credits.create! }
WelcomeEmailMailer.welcome_to_free_plan(user).deliver_later
@user.enter_ab_test('starter-upsell')
elsif @subscription_plan.name == 'starter'
@user.subscriptions.create!(
plan: @subscription_plan,
cadence_months: cadence_months,
payment_amount: calculate_discount(@subscription_plan.amount, @discount)
)
50.times { @user.free_credits.create! }
WelcomeEmailMailer.welcome_to_starter_plan(user).deliver_later
@user.enter_ab_test('premium-upsell')
elsif @subscription_plan.name == 'premium'
@user.subscriptions.create!(
plan: @subscription_plan,
cadence_months: cadence_months,
payment_amount: calculate_discount(@subscription_plan.amount, @discount)
)
250.times { @user.free_credits.create! }
WelcomeEmailMailer.welcome_to_premium_plan(user).deliver_later
end
EventPublishing.event(
name: 'subscription_created',
user_id: @user.id,
discount_code: discount_code
)
end
private
def calculate_discount(amount, discount)
amount * Rational(discount.percentage, 100)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment