96504fd1ec
All the migrations have been updated to use BIGINTs for ID fields in the DB, but ActiveRecord needs to be told to treat those values as BIGINT as well. This PR does that.
62 lines
1.6 KiB
Ruby
62 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
# == Schema Information
|
|
#
|
|
# Table name: subscriptions
|
|
#
|
|
# callback_url :string default(""), not null
|
|
# secret :string
|
|
# expires_at :datetime
|
|
# confirmed :boolean default(FALSE), not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# last_successful_delivery_at :datetime
|
|
# domain :string
|
|
# account_id :bigint not null
|
|
# id :bigint not null, primary key
|
|
#
|
|
|
|
class Subscription < ApplicationRecord
|
|
MIN_EXPIRATION = 1.day.to_i
|
|
MAX_EXPIRATION = 30.days.to_i
|
|
|
|
belongs_to :account, required: true
|
|
|
|
validates :callback_url, presence: true
|
|
validates :callback_url, uniqueness: { scope: :account_id }
|
|
|
|
scope :confirmed, -> { where(confirmed: true) }
|
|
scope :future_expiration, -> { where(arel_table[:expires_at].gt(Time.now.utc)) }
|
|
scope :expired, -> { where(arel_table[:expires_at].lt(Time.now.utc)) }
|
|
scope :active, -> { confirmed.future_expiration }
|
|
|
|
def lease_seconds=(value)
|
|
self.expires_at = future_expiration(value)
|
|
end
|
|
|
|
def lease_seconds
|
|
(expires_at - Time.now.utc).to_i
|
|
end
|
|
|
|
def expired?
|
|
Time.now.utc > expires_at
|
|
end
|
|
|
|
before_validation :set_min_expiration
|
|
|
|
private
|
|
|
|
def future_expiration(value)
|
|
Time.now.utc + future_offset(value).seconds
|
|
end
|
|
|
|
def future_offset(seconds)
|
|
[
|
|
[MIN_EXPIRATION, seconds.to_i].max,
|
|
MAX_EXPIRATION,
|
|
].min
|
|
end
|
|
|
|
def set_min_expiration
|
|
self.lease_seconds = 0 unless expires_at
|
|
end
|
|
end
|