1# frozen_string_literal: true
2
3module TtlExpirable
4  extend ActiveSupport::Concern
5
6  included do
7    validates :status, presence: true
8    default_value_for :read_at, Time.zone.now
9
10    enum status: { default: 0, expired: 1, processing: 2, error: 3 }
11
12    scope :read_before, ->(number_of_days) { where("read_at <= ?", Time.zone.now - number_of_days.days) }
13    scope :active, -> { where(status: :default) }
14
15    scope :lock_next_by, ->(sort) do
16      order(sort)
17        .limit(1)
18        .lock('FOR UPDATE SKIP LOCKED')
19    end
20  end
21
22  def read!
23    self.update(read_at: Time.zone.now)
24  end
25end
26