Skip to content
Snippets Groups Projects

Experiment: "Build iOS app guide" email campaign

Merged Eugie Limpin requested to merge experiment/publish-ios-apps-with-fastlane into master
4 files
+ 44
7
Compare changes
  • Side-by-side
  • Inline
Files
4
  • Currently, Users::InProductMarketingEmail is used to track delivery of
    track+series emails. Here, we update the model to either track delivery
    of a single campaign email (e.g. Build iOS app guide email) or an series
    email for a specific track.
    
    Changes:
    1. Remove NOT NULL constraints for track and series columns
    2. Update validations to require track only when series has a value and
    vice-versa
    3. Add validation to require campaign if track and series are both nil
    4. Add validation to ensure model instance is either a "campaign" or
    a "track series"
@@ -7,12 +7,22 @@ class InProductMarketingEmail < ApplicationRecord
belongs_to :user
validates :user, presence: true
validates :track, presence: true
validates :series, presence: true
validates :track, presence: true, if: -> { series.present? }
validates :series, presence: true, if: -> { track.present? }
validates :campaign, presence: true, if: -> { track.nil? && series.nil? }
validates :user_id, uniqueness: {
scope: [:track, :series],
message: 'has already been sent'
}
message: 'track series email has already been sent'
}, if: :track_series?
validates :user_id, uniqueness: {
scope: :campaign,
message: 'campaign email has already been sent'
}, if: :campaign?
validate :campaign_or_track_series
enum track: {
create: 0,
@@ -31,7+41,7 @@
INACTIVE_TRACK_NAMES = %w(invite_team).freeze
ACTIVE_TRACKS = tracks.except(*INACTIVE_TRACK_NAMES)
scope :without_track_and_series, -> (track, series) do
users = User.arel_table
product_emails = arel_table
@@ -55,7+65,7 @@
email.update(cta_clicked_at: Time.zone.now) if email && email.cta_clicked_at.blank?
end
private
def campaign_or_track_series
if campaign.present? && (track.present? || series.present?)
errors.add(:campaign, 'Email should be a campaign or a track series but not both')
end
end
def track_series?
track.present? && series.present?
end
def campaign?
campaign.present? && track.nil? && series.nil?
end
end
end
Loading