diff --git a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb index 18a0ea4519d16df96fc8fd1df654ae80ccd5928c..bd8d61011dbfd4a72f61cf39d1911fda5857f8d6 100644 --- a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb +++ b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb @@ -70,6 +70,7 @@ def assigned_seats def user_already_assigned? add_on_purchase.already_assigned?(user) end + strong_memoize_attr :user_already_assigned? def eligible_for_gitlab_duo_pro_seat? raise NotImplementedError, 'Subclasses must implement the eligible_for_gitlab_duo_pro_seat? method' diff --git a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb index c3987198622891508000d21238e1e8e6ad26225e..4c7601692253cb928451b10c4bce385f2a22a737 100644 --- a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb +++ b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb @@ -6,6 +6,12 @@ module Saas class CreateService < ::GitlabSubscriptions::UserAddOnAssignments::BaseCreateService include Gitlab::Utils::StrongMemoize + def execute + super.tap do |response| + create_iterable_trigger if should_trigger_duo_pro_iterable? response + end + end + private attr_reader :add_on_purchase, :user @@ -22,6 +28,26 @@ def namespace def base_log_params super.merge(namespace: add_on_purchase.namespace.full_path) end + + def should_trigger_duo_pro_iterable?(response) + response.success? && add_on_purchase.add_on.code_suggestions? && !user_already_assigned? + end + + def create_iterable_trigger + ::Onboarding::CreateIterableTriggerWorker.perform_async(iterable_params) + end + + def iterable_params + { + first_name: user.first_name, + last_name: user.last_name, + work_email: user.email, + namespace_id: namespace.id, + product_interaction: "duo_pro_add_on_seat_assigned", + opt_in: user.onboarding_status_email_opt_in, + preferred_language: ::Gitlab::I18n.trimmed_language_name(user.preferred_language) + } + end end end end diff --git a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb index 6f4888005c54de74c169ca6f3710af4a2e3411c2..11c1cb64f4c0fdab8582f2cf2eb755cc86a4e873 100644 --- a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb +++ b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb @@ -43,6 +43,22 @@ expect { subject }.to change { Rails.cache.read(cache_key) }.from(false).to(nil) end + + it 'creates an iterable trigger' do + expect(::Onboarding::CreateIterableTriggerWorker).to receive(:perform_async).with( + hash_including( + first_name: user.first_name, + last_name: user.last_name, + work_email: user.email, + namespace_id: namespace.id, + product_interaction: "duo_pro_add_on_seat_assigned", + preferred_language: 'English', + opt_in: user.onboarding_status_email_opt_in + ) + ) + + subject + end end shared_examples 'error response' do |error| @@ -62,6 +78,14 @@ end end + shared_examples 'does not create an iterable trigger' do + it do + expect(::Onboarding::CreateIterableTriggerWorker).not_to receive(:perform_async) + + subject + end + end + it_behaves_like 'success response' context 'when user is already assigned' do @@ -73,6 +97,8 @@ expect { response }.not_to change { add_on_purchase.assigned_users.count } expect(response).to be_success end + + it_behaves_like 'does not create an iterable trigger' end context 'when seats are not available' do @@ -179,5 +205,12 @@ end end end + + context 'with add_on other than duo_pro' do + let(:add_on) { create(:gitlab_subscription_add_on, :product_analytics) } + let(:add_on_purchase) { create(:gitlab_subscription_add_on_purchase, namespace: namespace, add_on: add_on) } + + it_behaves_like 'does not create an iterable trigger' + end end end