Change Resave Articles job to worker, and add missing specs on the user model when changing the trigger attributes
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::ResaveArticlesWorker.perform_async(user.id)
|
|
end
|
|
end
|
|
|
|
def bust_cache
|
|
Rails.cache.delete("user-#{user.id}/has_pro_membership")
|
|
end
|
|
end
|