discourse/app/models/email_log.rb

106 lines
2.9 KiB
Ruby
Raw Normal View History

require_dependency 'distributed_mutex'
class EmailLog < ActiveRecord::Base
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
}
belongs_to :user
belongs_to :post
belongs_to :topic
validates :email_type, :to_address, presence: true
scope :sent, -> { where(skipped: false) }
scope :skipped, -> { where(skipped: true) }
2016-05-02 17:15:32 -04:00
scope :bounced, -> { sent.where(bounced: true) }
after_create do
# Update last_emailed_at if the user_id is present and email was sent
User.where(id: user_id).update_all("last_emailed_at = CURRENT_TIMESTAMP") if user_id.present? && !skipped
end
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-27 21:20:09 -04:00
def self.reached_max_emails?(user, email_type = nil)
return false if SiteSetting.max_emails_per_day_per_user == 0 || CRITICAL_EMAIL_TYPES.include?(email_type)
count = sent.where('created_at > ?', 1.day.ago)
2017-07-27 21:20:09 -04:00
.where(user_id: user.id)
.count
count >= SiteSetting.max_emails_per_day_per_user
end
def self.count_per_day(start_date, end_date)
sent.where("created_at BETWEEN ? AND ?", start_date, end_date)
2017-07-27 21:20:09 -04:00
.group("DATE(created_at)")
.order("DATE(created_at)")
.count
end
def self.for(reply_key)
self.find_by(reply_key: reply_key)
end
def self.last_sent_email_address
self.where(email_type: "signup")
2017-07-27 21:20:09 -04:00
.order(created_at: :desc)
.first
.try(:to_address)
end
def bounce_key
super&.delete('-')
end
end
2013-05-23 22:35:14 -04:00
# == Schema Information
#
# Table name: email_logs
#
2014-03-20 00:35:51 -04:00
# id :integer not null, primary key
2018-02-20 01:28:58 -05:00
# to_address :string not null
# email_type :string not null
2014-03-20 00:35:51 -04:00
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
2014-03-20 00:35:51 -04:00
# reply_key :string(32)
# post_id :integer
# topic_id :integer
# skipped :boolean default(FALSE)
2018-02-20 01:28:58 -05:00
# skipped_reason :string
# bounce_key :string
# bounced :boolean default(FALSE), not null
2016-06-16 21:28:30 -04:00
# message_id :string
2013-05-23 22:35:14 -04:00
#
# Indexes
#
2018-07-16 02:18:07 -04:00
# idx_email_logs_user_created_filtered (user_id,created_at) WHERE (skipped = false)
2013-05-23 22:35:14 -04:00
# index_email_logs_on_created_at (created_at)
2016-06-16 21:28:30 -04:00
# index_email_logs_on_message_id (message_id)
2018-02-20 01:28:58 -05:00
# index_email_logs_on_post_id (post_id)
2013-06-16 20:48:58 -04:00
# index_email_logs_on_reply_key (reply_key)
2014-03-20 00:35:51 -04:00
# index_email_logs_on_skipped_and_created_at (skipped,created_at)
2018-02-20 01:28:58 -05:00
# index_email_logs_on_topic_id (topic_id)
2018-07-16 02:18:07 -04:00
# index_email_logs_on_user_id_and_created_at (user_id,created_at DESC)
2013-05-23 22:35:14 -04:00
#