diff options
Diffstat (limited to 'app/services/namespaces')
3 files changed, 96 insertions, 23 deletions
diff --git a/app/services/namespaces/in_product_marketing_email_records.rb b/app/services/namespaces/in_product_marketing_email_records.rb new file mode 100644 index 00000000000..1237a05ea13 --- /dev/null +++ b/app/services/namespaces/in_product_marketing_email_records.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Namespaces + class InProductMarketingEmailRecords + attr_reader :records + + def initialize + @records = [] + end + + def save! + Users::InProductMarketingEmail.bulk_insert!(@records) + @records = [] + end + + def add(user, track, series) + @records << Users::InProductMarketingEmail.new( + user: user, + track: track, + series: series, + created_at: Time.zone.now, + updated_at: Time.zone.now + ) + end + end +end diff --git a/app/services/namespaces/in_product_marketing_emails_service.rb b/app/services/namespaces/in_product_marketing_emails_service.rb index 0401653cf3c..90900698e1a 100644 --- a/app/services/namespaces/in_product_marketing_emails_service.rb +++ b/app/services/namespaces/in_product_marketing_emails_service.rb @@ -56,7 +56,7 @@ module Namespaces def initialize(track, interval) @track = track @interval = interval - @in_product_marketing_email_records = [] + @sent_email_records = InProductMarketingEmailRecords.new end def execute @@ -71,17 +71,21 @@ module Namespaces private - attr_reader :track, :interval, :in_product_marketing_email_records + attr_reader :track, :interval, :sent_email_records + + def send_email(user, group) + NotificationService.new.in_product_marketing(user.id, group.id, track, series) + end def send_email_for_group(group) users_for_group(group).each do |user| if can_perform_action?(user, group) send_email(user, group) - track_sent_email(user, track, series) + sent_email_records.add(user, track, series) end end - save_tracked_emails! + sent_email_records.save! end def groups_for_track @@ -126,10 +130,6 @@ module Namespaces end end - def send_email(user, group) - NotificationService.new.in_product_marketing(user.id, group.id, track, series) - end - def completed_actions TRACKS[track][:completed_actions] end @@ -146,21 +146,6 @@ module Namespaces def series TRACKS[track][:interval_days].index(interval) end - - def save_tracked_emails! - Users::InProductMarketingEmail.bulk_insert!(in_product_marketing_email_records) - @in_product_marketing_email_records = [] - end - - def track_sent_email(user, track, series) - in_product_marketing_email_records << Users::InProductMarketingEmail.new( - user: user, - track: track, - series: series, - created_at: Time.zone.now, - updated_at: Time.zone.now - ) - end end end diff --git a/app/services/namespaces/invite_team_email_service.rb b/app/services/namespaces/invite_team_email_service.rb new file mode 100644 index 00000000000..45975d1953a --- /dev/null +++ b/app/services/namespaces/invite_team_email_service.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module Namespaces + class InviteTeamEmailService + include Gitlab::Experiment::Dsl + + TRACK = :invite_team + DELIVERY_DELAY_IN_MINUTES = 20.minutes + + def self.send_email(user, group) + new(user, group).execute + end + + def initialize(user, group) + @group = group + @user = user + @sent_email_records = InProductMarketingEmailRecords.new + end + + def execute + return unless user.email_opted_in? + return unless group.root? + return unless group.setup_for_company + + # Exclude group if users other than the creator have already been + # added/invited + return unless group.member_count == 1 + + return if email_for_track_sent_to_user? + + experiment(:invite_team_email, group: group) do |e| + e.candidate do + send_email(user, group) + sent_email_records.add(user, track, series) + sent_email_records.save! + end + + e.record! + end + end + + private + + attr_reader :user, :group, :sent_email_records + + def send_email(user, group) + NotificationService.new.in_product_marketing(user.id, group.id, track, series) + end + + def track + TRACK + end + + def series + 0 + end + + def email_for_track_sent_to_user? + Users::InProductMarketingEmail.for_user_with_track_and_series(user, track, series).present? + end + end +end |