* Update rubocop-todo.yml with new violations * Fix Layout/EmptyLine* rules * Fix Layout/Indentation* rules * Fix remaining Layout/* rules * Fix Lint/DuplicateMethods by removing unused accessor * Fix Lint/IneffectiveAccessModifier * Fix Lint/MissingCopEnableDirective * Re-run rubocop auto gen config * Fix Layout/RescueEnsureAlignment * Fix Naming/* rules * Fix some RSpec/* rules * Fix typos * Fix RSpec/LetBeforeExamples * Series should only be an attr_writer, not an attr_accessor * Fix RSpec/InstanceVariable * Fix RSpec/InstanceVariable * Fix RSpec/RepeatedDescription and RSpec/RepeatedExample * Fix Style/ClassAndModuleChildren * Fix Style/ConditionalAssignment * Fix some Style/* rules * Trigger Travis CI build because failing tests are not failing locally * Revert "Fix Style/ClassAndModuleChildren" This reverts commit 1686801d8a1516ba1894f79e24401a20dea65f99.
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
|