mirror of
https://github.com/mastodon/mastodon.git
synced 2025-09-05 17:31:12 +00:00
84 lines
2.5 KiB
Ruby
84 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: terms_of_services
|
|
#
|
|
# id :bigint(8) not null, primary key
|
|
# changelog :text default(""), not null
|
|
# effective_date :date
|
|
# notification_sent_at :datetime
|
|
# published_at :datetime
|
|
# text :text default(""), not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
#
|
|
class TermsOfService < ApplicationRecord
|
|
scope :published, -> { where.not(published_at: nil).order(Arel.sql('coalesce(effective_date, published_at) DESC')) }
|
|
scope :live, -> { published.where('effective_date IS NULL OR effective_date < now()') }
|
|
scope :upcoming, -> { published.reorder(effective_date: :asc).where('effective_date IS NOT NULL AND effective_date > now()') }
|
|
scope :draft, -> { where(published_at: nil).order(id: :desc) }
|
|
|
|
validates :text, presence: true
|
|
validates :changelog, :effective_date, presence: true, if: -> { published? }
|
|
validates :effective_date, uniqueness: true
|
|
|
|
validate :effective_date_cannot_be_in_the_past, if: :effective_date?
|
|
|
|
NOTIFICATION_ACTIVITY_CUTOFF = 1.year.freeze
|
|
|
|
def self.current
|
|
live.first || upcoming.first # For the case when none of the published terms have become effective yet
|
|
end
|
|
|
|
def usable_effective_date
|
|
effective_date || Time.zone.today
|
|
end
|
|
|
|
def published?
|
|
published_at.present?
|
|
end
|
|
|
|
def effective?
|
|
published? && effective_date&.past?
|
|
end
|
|
|
|
def succeeded_by
|
|
TermsOfService.published.where(effective_date: (effective_date..)).where.not(id: id).first
|
|
end
|
|
|
|
def notification_sent?
|
|
notification_sent_at.present?
|
|
end
|
|
|
|
def base_user_scope
|
|
User.confirmed.where(created_at: ..published_at).joins(:account)
|
|
end
|
|
|
|
def email_notification_cutoff
|
|
published_at - NOTIFICATION_ACTIVITY_CUTOFF
|
|
end
|
|
|
|
def scope_for_interstitial
|
|
base_user_scope.merge(Account.suspended).or(base_user_scope.where(current_sign_in_at: [nil, ...email_notification_cutoff]))
|
|
end
|
|
|
|
def scope_for_notification
|
|
base_user_scope.merge(Account.without_suspended).where(current_sign_in_at: email_notification_cutoff...)
|
|
end
|
|
|
|
private
|
|
|
|
def effective_date_cannot_be_in_the_past
|
|
errors.add(:effective_date, :too_soon, date: minimum_allowed_effective_date) if effective_date_too_early?
|
|
end
|
|
|
|
def effective_date_too_early?
|
|
effective_date < minimum_allowed_effective_date
|
|
end
|
|
|
|
def minimum_allowed_effective_date
|
|
self.class.live.pick(:effective_date) || Time.zone.today
|
|
end
|
|
end
|