* Use timezone aware datetime methods * Use timezone aware date parse for GitHub issue tag * Introduce a bit of chaos programming using Zonebie Zonebie uses a random timezone to run tests, it's a really good way to see if the code is timezone dependent or not. * Convert GitHub issue date as UTC
104 lines
2.9 KiB
Ruby
104 lines
2.9 KiB
Ruby
class MembershipService
|
|
attr_reader :customer, :user, :monthly_dues, :subscription, :plan
|
|
|
|
def initialize(customer, user, monthly_dues)
|
|
@customer = customer
|
|
@user = user
|
|
@monthly_dues = monthly_dues || @user.monthly_dues
|
|
@plan = find_or_create_plan
|
|
@subscription = find_subscription
|
|
end
|
|
|
|
def subscribe_customer
|
|
true if create_subscription &&
|
|
assign_membership_role &&
|
|
user.update(monthly_dues: monthly_dues,
|
|
membership_started_at: Time.current,
|
|
email_membership_newsletter: true,
|
|
stripe_id_code: customer.id) &&
|
|
send_welcome_email
|
|
end
|
|
|
|
def update_subscription
|
|
true if update_stripe_plan_for_subscription &&
|
|
assign_membership_role &&
|
|
user.update(monthly_dues: monthly_dues) &&
|
|
send_update_email
|
|
end
|
|
|
|
def unsubscribe_customer
|
|
true if cancel_subscription &&
|
|
remove_all_membership_roles &&
|
|
user.update(monthly_dues: 0, email_membership_newsletter: false) &&
|
|
send_cancellation_email
|
|
end
|
|
|
|
def find_subscription
|
|
customer.subscriptions.first || nil
|
|
end
|
|
|
|
def create_subscription
|
|
customer.subscriptions.create(plan: plan.id)
|
|
end
|
|
|
|
def cancel_subscription
|
|
subscription.delete
|
|
end
|
|
|
|
def update_stripe_plan_for_subscription
|
|
subscription.items = [{
|
|
id: subscription.items.data[0].id,
|
|
plan: plan.id
|
|
}]
|
|
subscription.save
|
|
end
|
|
|
|
def find_or_create_plan
|
|
Stripe::Plan.retrieve("membership-#{monthly_dues}")
|
|
# Using rescue because not finding a plan errors out instead returning of nil
|
|
rescue Stripe::InvalidRequestError
|
|
Stripe::Plan.create(
|
|
id: "membership-#{monthly_dues}",
|
|
currency: "usd",
|
|
interval: "month",
|
|
name: "Monthly DEV Membership",
|
|
amount: monthly_dues,
|
|
statement_descriptor: "DEV membership",
|
|
)
|
|
end
|
|
|
|
def assign_membership_role
|
|
# change role names here, in role.rb, users_controller#handle_settings_tab => @membership_names
|
|
remove_all_membership_roles
|
|
user.add_role :analytics_beta_tester
|
|
if monthly_dues >= 100000
|
|
user.add_role :triple_unicorn_member
|
|
elsif monthly_dues > 2500
|
|
user.add_role :level_4_member
|
|
elsif monthly_dues == 2500
|
|
user.add_role :level_3_member
|
|
elsif monthly_dues.between?(1000, 2499)
|
|
user.add_role :level_2_member
|
|
else
|
|
user.add_role :level_1_member
|
|
end
|
|
end
|
|
|
|
def remove_all_membership_roles
|
|
tiers = %i[ triple_unicorn_member level_4_member level_3_member level_2_member level_1_member
|
|
analytics_beta_tester]
|
|
tiers.each { |t| user.remove_role(t) }
|
|
end
|
|
|
|
def send_welcome_email
|
|
MembershipMailer.delay.new_membership_subscription_email(user, user.roles.last.name)
|
|
end
|
|
|
|
def send_update_email
|
|
MembershipMailer.delay.subscription_update_confirm_email(user)
|
|
end
|
|
|
|
def send_cancellation_email
|
|
MembershipMailer.delay.subscription_cancellation_email(user)
|
|
end
|
|
end
|