From 40a2a567e64740d165fd73ae8493230dc2b1d094 Mon Sep 17 00:00:00 2001 From: Alex Morask <144709477+amorask-bitwarden@users.noreply.github.com> Date: Mon, 26 Feb 2024 11:50:24 -0500 Subject: [PATCH] Sent initiation path for organization and user signups (#3723) --- .../OrganizationCreateRequestModel.cs | 3 +++ .../Implementations/OrganizationService.cs | 1 + .../Models/Business/OrganizationSignup.cs | 1 + .../Services/Implementations/UserService.cs | 23 ++++++++++++++++++- .../Tools/Models/Business/ReferenceEvent.cs | 9 ++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/Api/AdminConsole/Models/Request/Organizations/OrganizationCreateRequestModel.cs b/src/Api/AdminConsole/Models/Request/Organizations/OrganizationCreateRequestModel.cs index 304978eb13..5cf31460fd 100644 --- a/src/Api/AdminConsole/Models/Request/Organizations/OrganizationCreateRequestModel.cs +++ b/src/Api/AdminConsole/Models/Request/Organizations/OrganizationCreateRequestModel.cs @@ -48,6 +48,8 @@ public class OrganizationCreateRequestModel : IValidatableObject public bool UseSecretsManager { get; set; } public bool IsFromSecretsManagerTrial { get; set; } + public string InitiationPath { get; set; } + public virtual OrganizationSignup ToOrganizationSignup(User user) { var orgSignup = new OrganizationSignup @@ -79,6 +81,7 @@ public class OrganizationCreateRequestModel : IValidatableObject BillingAddressPostalCode = BillingAddressPostalCode, BillingAddressCountry = BillingAddressCountry, }, + InitiationPath = InitiationPath, }; Keys?.ToOrganizationSignup(orgSignup); diff --git a/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs b/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs index 264962dca7..cb68c21557 100644 --- a/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs +++ b/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs @@ -533,6 +533,7 @@ public class OrganizationService : IOrganizationService PlanName = plan.Name, PlanType = plan.Type, Seats = returnValue.Item1.Seats, + SignupInitiationPath = signup.InitiationPath, Storage = returnValue.Item1.MaxStorageGb, // TODO: add reference events for SmSeats and Service Accounts - see AC-1481 }); diff --git a/src/Core/Models/Business/OrganizationSignup.cs b/src/Core/Models/Business/OrganizationSignup.cs index 970ede9afc..89168b2747 100644 --- a/src/Core/Models/Business/OrganizationSignup.cs +++ b/src/Core/Models/Business/OrganizationSignup.cs @@ -13,4 +13,5 @@ public class OrganizationSignup : OrganizationUpgrade public PaymentMethodType? PaymentMethodType { get; set; } public string PaymentToken { get; set; } public int? MaxAutoscaleSeats { get; set; } = null; + public string InitiationPath { get; set; } } diff --git a/src/Core/Services/Implementations/UserService.cs b/src/Core/Services/Implementations/UserService.cs index 977e8afd39..a40d4bf302 100644 --- a/src/Core/Services/Implementations/UserService.cs +++ b/src/Core/Services/Implementations/UserService.cs @@ -1,5 +1,4 @@ using System.Security.Claims; -using System.Text.Json; using Bit.Core.AdminConsole.Enums; using Bit.Core.AdminConsole.Repositories; using Bit.Core.AdminConsole.Services; @@ -28,7 +27,9 @@ using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Newtonsoft.Json; using File = System.IO.File; +using JsonSerializer = System.Text.Json.JsonSerializer; namespace Bit.Core.Services; @@ -338,6 +339,26 @@ public class UserService : UserManager, IUserService, IDisposable if (result == IdentityResult.Success) { await _mailService.SendWelcomeEmailAsync(user); + + if (!string.IsNullOrEmpty(user.ReferenceData)) + { + var referenceData = JsonConvert.DeserializeObject>(user.ReferenceData); + if (referenceData.TryGetValue("initiationPath", out var value)) + { + var initiationPath = value.ToString(); + if (!string.IsNullOrEmpty(initiationPath)) + { + await _referenceEventService.RaiseEventAsync( + new ReferenceEvent(ReferenceEventType.Signup, user, _currentContext) + { + SignupInitiationPath = initiationPath + }); + + return result; + } + } + } + await _referenceEventService.RaiseEventAsync(new ReferenceEvent(ReferenceEventType.Signup, user, _currentContext)); } diff --git a/src/Core/Tools/Models/Business/ReferenceEvent.cs b/src/Core/Tools/Models/Business/ReferenceEvent.cs index ac21c92e44..03a0b3e1da 100644 --- a/src/Core/Tools/Models/Business/ReferenceEvent.cs +++ b/src/Core/Tools/Models/Business/ReferenceEvent.cs @@ -234,4 +234,13 @@ public class ReferenceEvent /// when the event was not originated by an application. /// public Version? ClientVersion { get; set; } + + /// + /// The initiation path of a user who signed up for a paid version of Bitwarden. For example, "Trial from marketing website". + /// + /// + /// This value should only be populated when the is . Otherwise, + /// the value should be . + /// + public string SignupInitiationPath { get; set; } }