2019-12-11 12:04:02 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class Bookmark < ActiveRecord::Base
|
|
|
|
belongs_to :user
|
|
|
|
belongs_to :post
|
|
|
|
belongs_to :topic
|
|
|
|
|
|
|
|
validates :reminder_at, presence: {
|
|
|
|
message: I18n.t("bookmarks.errors.time_must_be_provided", reminder_type: I18n.t("bookmarks.reminders.at_desktop")),
|
|
|
|
if: -> { reminder_type.present? && reminder_type != Bookmark.reminder_types[:at_desktop] }
|
|
|
|
}
|
|
|
|
|
2020-03-12 08:16:00 +08:00
|
|
|
validate :unique_per_post_for_user
|
|
|
|
validate :ensure_sane_reminder_at_time
|
|
|
|
|
2020-03-12 14:00:45 +08:00
|
|
|
# we don't care whether the post or topic is deleted,
|
|
|
|
# they hold important information about the bookmark
|
|
|
|
def post
|
|
|
|
Post.unscoped { super }
|
|
|
|
end
|
|
|
|
|
|
|
|
def topic
|
|
|
|
Topic.unscoped { super }
|
|
|
|
end
|
|
|
|
|
2020-03-12 08:16:00 +08:00
|
|
|
def unique_per_post_for_user
|
|
|
|
existing_bookmark = Bookmark.find_by(user_id: user_id, post_id: post_id)
|
|
|
|
return if existing_bookmark.blank? || existing_bookmark.id == id
|
|
|
|
self.errors.add(:base, I18n.t("bookmarks.errors.already_bookmarked_post"))
|
|
|
|
end
|
|
|
|
|
|
|
|
def ensure_sane_reminder_at_time
|
|
|
|
return if reminder_at.blank?
|
|
|
|
if reminder_at < Time.zone.now
|
|
|
|
self.errors.add(:base, I18n.t("bookmarks.errors.cannot_set_past_reminder"))
|
|
|
|
end
|
|
|
|
if reminder_at > 10.years.from_now.utc
|
|
|
|
self.errors.add(:base, I18n.t("bookmarks.errors.cannot_set_reminder_in_distant_future"))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-03-13 08:44:39 +08:00
|
|
|
def no_reminder?
|
|
|
|
self.reminder_at.blank? && self.reminder_type.blank?
|
|
|
|
end
|
|
|
|
|
2020-03-12 08:16:00 +08:00
|
|
|
scope :pending_reminders, ->(before_time = Time.now.utc) do
|
|
|
|
where("reminder_at IS NOT NULL AND reminder_at <= :before_time", before_time: before_time)
|
|
|
|
end
|
|
|
|
|
|
|
|
scope :pending_at_desktop_reminders, ->(before_time = Time.now.utc) do
|
|
|
|
where("reminder_at IS NULL AND reminder_type = :at_desktop", at_desktop: reminder_types[:at_desktop])
|
|
|
|
end
|
|
|
|
|
|
|
|
scope :pending_reminders_for_user, ->(user) do
|
|
|
|
pending_reminders.where(user: user)
|
|
|
|
end
|
|
|
|
|
|
|
|
scope :at_desktop_reminders_for_user, ->(user) do
|
|
|
|
where("reminder_type = :at_desktop AND user_id = :user_id", at_desktop: reminder_types[:at_desktop], user_id: user.id)
|
|
|
|
end
|
|
|
|
|
2019-12-11 12:04:02 +08:00
|
|
|
def self.reminder_types
|
|
|
|
@reminder_type = Enum.new(
|
|
|
|
at_desktop: 0,
|
|
|
|
later_today: 1,
|
|
|
|
next_business_day: 2,
|
|
|
|
tomorrow: 3,
|
|
|
|
next_week: 4,
|
|
|
|
next_month: 5,
|
2020-04-02 07:57:48 +08:00
|
|
|
custom: 6,
|
|
|
|
start_of_next_business_week: 7,
|
|
|
|
later_this_week: 8
|
2019-12-11 12:04:02 +08:00
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: bookmarks
|
|
|
|
#
|
2020-03-12 08:16:00 +08:00
|
|
|
# id :bigint not null, primary key
|
|
|
|
# user_id :bigint not null
|
|
|
|
# topic_id :bigint not null
|
|
|
|
# post_id :bigint not null
|
|
|
|
# name :string
|
|
|
|
# reminder_type :integer
|
|
|
|
# reminder_at :datetime
|
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
|
|
|
# reminder_last_sent_at :datetime
|
|
|
|
# reminder_set_at :datetime
|
2019-12-11 12:04:02 +08:00
|
|
|
#
|
|
|
|
# Indexes
|
|
|
|
#
|
|
|
|
# index_bookmarks_on_post_id (post_id)
|
|
|
|
# index_bookmarks_on_reminder_at (reminder_at)
|
2020-03-12 08:16:00 +08:00
|
|
|
# index_bookmarks_on_reminder_set_at (reminder_set_at)
|
2019-12-11 12:04:02 +08:00
|
|
|
# index_bookmarks_on_reminder_type (reminder_type)
|
|
|
|
# index_bookmarks_on_topic_id (topic_id)
|
|
|
|
# index_bookmarks_on_user_id (user_id)
|
|
|
|
# index_bookmarks_on_user_id_and_post_id (user_id,post_id) UNIQUE
|
|
|
|
#
|
|
|
|
# Foreign Keys
|
|
|
|
#
|
|
|
|
# fk_rails_... (post_id => posts.id)
|
|
|
|
# fk_rails_... (topic_id => topics.id)
|
|
|
|
# fk_rails_... (user_id => users.id)
|
|
|
|
#
|