docbrown/app/models/pro_membership.rb

61 lines
1.5 KiB
Ruby

class ProMembership < ApplicationRecord
STATUSES = %w[active expired].freeze
MONTHLY_COST = 5
MONTHLY_COST_USD = 25
belongs_to :user
validates :user, :status, :expiration_notifications_count, presence: true
validates :user, uniqueness: true
validates :expires_at, presence: true, on: :save
validates :status, inclusion: { in: STATUSES }
scope :active, -> { where(status: :active) }
scope :expired, -> { where(status: :expired) }
before_create :set_expiration_date
after_save :resave_user_articles
after_save :bust_cache
def expired?
expires_at <= Time.current
end
def active?
expires_at > Time.current
end
def expire!
update!(expires_at: Time.current, status: :expired)
end
def renew!
update!(
expires_at: 1.month.from_now,
status: :active,
expiration_notification_at: nil,
expiration_notifications_count: 0,
)
end
private
def set_expiration_date
self.expires_at = 1.month.from_now
end
# if the membership is new or the user flips from expired to active and viceversa,
# we need to resave all of the user's articles to make sure that the pro details
# that are cached with them are refreshed
def resave_user_articles
if saved_change_to_created_at? ||
saved_change_to_expires_at? ||
saved_change_to_status?
Users::ResaveArticlesJob.perform_later(user.id)
end
end
def bust_cache
Rails.cache.delete("user-#{user.id}/has_pro_membership")
end
end