61 lines
1.5 KiB
Ruby
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
|