2016-04-15 13:59:01 +08:00
|
|
|
require_dependency 'distributed_mutex'
|
|
|
|
|
2013-05-24 10:48:32 +08:00
|
|
|
class EmailLog < ActiveRecord::Base
|
2018-07-18 16:28:44 +08:00
|
|
|
self.ignored_columns = %w{
|
|
|
|
topic_id
|
|
|
|
reply_key
|
|
|
|
}
|
2018-07-18 10:21:54 +08:00
|
|
|
|
2017-05-03 19:36:01 +08:00
|
|
|
CRITICAL_EMAIL_TYPES ||= Set.new %w{
|
|
|
|
account_created
|
|
|
|
admin_login
|
|
|
|
confirm_new_email
|
|
|
|
confirm_old_email
|
|
|
|
forgot_password
|
|
|
|
notify_old_email
|
|
|
|
signup
|
|
|
|
signup_after_approval
|
|
|
|
}
|
|
|
|
|
2013-05-24 10:48:32 +08:00
|
|
|
belongs_to :user
|
2013-06-14 06:11:10 +08:00
|
|
|
belongs_to :post
|
2018-07-18 10:21:54 +08:00
|
|
|
has_one :topic, through: :post
|
2013-06-14 06:11:10 +08:00
|
|
|
|
2014-10-04 11:07:20 +08:00
|
|
|
validates :email_type, :to_address, presence: true
|
|
|
|
|
2014-02-15 02:06:21 +08:00
|
|
|
scope :sent, -> { where(skipped: false) }
|
|
|
|
scope :skipped, -> { where(skipped: true) }
|
2016-05-03 05:15:32 +08:00
|
|
|
scope :bounced, -> { sent.where(bounced: true) }
|
2014-02-15 02:06:21 +08:00
|
|
|
|
2013-05-24 10:48:32 +08:00
|
|
|
after_create do
|
2014-02-15 02:06:21 +08:00
|
|
|
# Update last_emailed_at if the user_id is present and email was sent
|
2015-12-11 06:49:16 +08:00
|
|
|
User.where(id: user_id).update_all("last_emailed_at = CURRENT_TIMESTAMP") if user_id.present? && !skipped
|
2013-05-24 10:48:32 +08:00
|
|
|
end
|
|
|
|
|
2016-04-15 13:59:01 +08:00
|
|
|
def self.unique_email_per_post(post, user)
|
|
|
|
return yield unless post && user
|
|
|
|
|
|
|
|
DistributedMutex.synchronize("email_log_#{post.id}_#{user.id}") do
|
|
|
|
if where(post_id: post.id, user_id: user.id, skipped: false).exists?
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
yield
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-07-28 09:20:09 +08:00
|
|
|
def self.reached_max_emails?(user, email_type = nil)
|
2017-05-03 19:36:01 +08:00
|
|
|
return false if SiteSetting.max_emails_per_day_per_user == 0 || CRITICAL_EMAIL_TYPES.include?(email_type)
|
2016-03-23 12:08:34 +08:00
|
|
|
|
|
|
|
count = sent.where('created_at > ?', 1.day.ago)
|
2017-07-28 09:20:09 +08:00
|
|
|
.where(user_id: user.id)
|
|
|
|
.count
|
2016-03-23 12:08:34 +08:00
|
|
|
|
|
|
|
count >= SiteSetting.max_emails_per_day_per_user
|
|
|
|
end
|
|
|
|
|
2014-11-06 02:11:23 +08:00
|
|
|
def self.count_per_day(start_date, end_date)
|
2015-12-11 06:49:16 +08:00
|
|
|
sent.where("created_at BETWEEN ? AND ?", start_date, end_date)
|
2017-07-28 09:20:09 +08:00
|
|
|
.group("DATE(created_at)")
|
|
|
|
.order("DATE(created_at)")
|
|
|
|
.count
|
2013-05-24 10:48:32 +08:00
|
|
|
end
|
2013-06-14 06:11:10 +08:00
|
|
|
|
|
|
|
def self.for(reply_key)
|
2015-12-11 06:49:16 +08:00
|
|
|
self.find_by(reply_key: reply_key)
|
2013-06-14 06:11:10 +08:00
|
|
|
end
|
|
|
|
|
2013-11-15 23:27:43 +08:00
|
|
|
def self.last_sent_email_address
|
2015-12-11 06:49:16 +08:00
|
|
|
self.where(email_type: "signup")
|
2017-07-28 09:20:09 +08:00
|
|
|
.order(created_at: :desc)
|
2018-07-18 11:25:16 +08:00
|
|
|
.limit(1)
|
|
|
|
.pluck(:to_address)
|
2017-07-28 09:20:09 +08:00
|
|
|
.first
|
2013-11-15 23:27:43 +08:00
|
|
|
end
|
|
|
|
|
2018-07-16 20:05:54 +08:00
|
|
|
def bounce_key
|
|
|
|
super&.delete('-')
|
|
|
|
end
|
|
|
|
|
2013-05-24 10:48:32 +08:00
|
|
|
end
|
|
|
|
|
2013-05-24 10:35:14 +08:00
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: email_logs
|
|
|
|
#
|
2014-03-20 12:35:51 +08:00
|
|
|
# id :integer not null, primary key
|
2018-02-20 14:28:58 +08:00
|
|
|
# to_address :string not null
|
|
|
|
# email_type :string not null
|
2014-03-20 12:35:51 +08:00
|
|
|
# user_id :integer
|
2014-08-27 13:19:25 +08:00
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
2014-03-20 12:35:51 +08:00
|
|
|
# post_id :integer
|
|
|
|
# skipped :boolean default(FALSE)
|
2018-02-20 14:28:58 +08:00
|
|
|
# skipped_reason :string
|
2018-07-17 13:08:13 +08:00
|
|
|
# bounce_key :uuid
|
2016-05-30 08:45:32 +08:00
|
|
|
# bounced :boolean default(FALSE), not null
|
2016-06-17 09:28:30 +08:00
|
|
|
# message_id :string
|
2013-05-24 10:35:14 +08:00
|
|
|
#
|
|
|
|
# Indexes
|
|
|
|
#
|
2018-07-24 11:14:19 +08:00
|
|
|
# idx_email_logs_user_created_filtered (user_id,created_at) WHERE (skipped = false)
|
|
|
|
# index_email_logs_on_created_at (created_at)
|
|
|
|
# index_email_logs_on_message_id (message_id)
|
|
|
|
# index_email_logs_on_post_id (post_id)
|
|
|
|
# index_email_logs_on_reply_key (reply_key)
|
|
|
|
# index_email_logs_on_skipped_and_bounced_and_created_at (skipped,bounced,created_at)
|
|
|
|
# index_email_logs_on_user_id (user_id)
|
2013-05-24 10:35:14 +08:00
|
|
|
#
|