54 lines
1.5 KiB
Ruby
54 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Users
|
|
class InProductMarketingEmail < ApplicationRecord
|
|
include BulkInsertSafe
|
|
|
|
belongs_to :user
|
|
|
|
validates :user, presence: true
|
|
validates :track, presence: true
|
|
validates :series, presence: true
|
|
validates :user_id, uniqueness: {
|
|
scope: [:track, :series],
|
|
message: 'has already been sent'
|
|
}
|
|
|
|
enum track: {
|
|
create: 0,
|
|
verify: 1,
|
|
trial: 2,
|
|
team: 3,
|
|
experience: 4,
|
|
team_short: 5,
|
|
trial_short: 6,
|
|
admin_verify: 7
|
|
}, _suffix: true
|
|
|
|
scope :without_track_and_series, -> (track, series) do
|
|
users = User.arel_table
|
|
product_emails = arel_table
|
|
|
|
join_condition = users[:id].eq(product_emails[:user_id])
|
|
.and(product_emails[:track]).eq(tracks[track])
|
|
.and(product_emails[:series]).eq(series)
|
|
|
|
arel_join = users.join(product_emails, Arel::Nodes::OuterJoin).on(join_condition)
|
|
|
|
joins(arel_join.join_sources)
|
|
.where(in_product_marketing_emails: { id: nil })
|
|
.select(Arel.sql("DISTINCT ON(#{users.table_name}.id) #{users.table_name}.*"))
|
|
end
|
|
|
|
scope :for_user_with_track_and_series, -> (user, track, series) do
|
|
where(user: user, track: track, series: series)
|
|
end
|
|
|
|
def self.save_cta_click(user, track, series)
|
|
email = for_user_with_track_and_series(user, track, series).take
|
|
|
|
email.update(cta_clicked_at: Time.zone.now) if email && email.cta_clicked_at.blank?
|
|
end
|
|
end
|
|
end
|