Przeglądaj źródła

analytics on project deletion (#3347)

Feroze Mohideen 2 lat temu
rodzic
commit
12712112f6

+ 2 - 2
api/server/handlers/project/create.go

@@ -45,7 +45,7 @@ func (p *ProjectCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
 		SimplifiedViewEnabled:  true,
 		HelmValuesEnabled:      false,
 		EnvGroupEnabled:        true,
-		MultiCluster: 			false,
+		MultiCluster:           false,
 	}
 
 	var err error
@@ -92,7 +92,7 @@ func (p *ProjectCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
 		p.HandleAPIErrorNoWrite(w, r, apierrors.NewErrInternal(err))
 	}
 
-	p.Config().AnalyticsClient.Track(analytics.ProjectCreateTrack(&analytics.ProjectCreateTrackOpts{
+	p.Config().AnalyticsClient.Track(analytics.ProjectCreateTrack(&analytics.ProjectCreateDeleteTrackOpts{
 		ProjectScopedTrackOpts: analytics.GetProjectScopedTrackOpts(user.ID, proj.ID),
 	}))
 }

+ 10 - 0
api/server/handlers/project/update_onboarding_step.go

@@ -34,6 +34,16 @@ func (v *UpdateOnboardingStepHandler) ServeHTTP(w http.ResponseWriter, r *http.R
 		return
 	}
 
+	if request.Step == "project-delete" {
+		v.Config().AnalyticsClient.Track(analytics.ProjectDeleteTrack(&analytics.ProjectCreateDeleteTrackOpts{
+			ProjectScopedTrackOpts: analytics.GetProjectScopedTrackOpts(user.ID, project.ID),
+			Email:                  user.Email,
+			FirstName:              user.FirstName,
+			LastName:               user.LastName,
+			CompanyName:            user.CompanyName,
+		}))
+	}
+
 	if request.Step == "cost-consent-opened" {
 		v.Config().AnalyticsClient.Track(analytics.CostConsentOpenedTrack(&analytics.CostConsentOpenedTrackOpts{
 			UserScopedTrackOpts: analytics.GetUserScopedTrackOpts(user.ID),

+ 6 - 1
dashboard/src/main/home/Home.tsx

@@ -328,9 +328,14 @@ const Home: React.FC<Props> = (props) => {
   };
 
   const handleDelete = async () => {
+    if (currentProject?.id == null) {
+      return;
+    }
+
     localStorage.removeItem(currentProject.id + "-cluster");
     try {
-      await api.deleteProject("<token>", {}, { id: currentProject?.id });
+      await api.updateOnboardingStep("<token>", { step: "project-delete" }, { project_id: currentProject.id });
+      await api.deleteProject("<token>", {}, { id: currentProject.id });
       projectOverlayCall();
     } catch (error) {
       console.log(error);

+ 1 - 0
internal/analytics/track_events.go

@@ -7,6 +7,7 @@ const (
 	UserCreate      SegmentEvent = "New User"
 	UserVerifyEmail SegmentEvent = "User Verified Email"
 	ProjectCreate   SegmentEvent = "New Project Event"
+	ProjectDelete   SegmentEvent = "Project Deleted"
 
 	CostConsentOpened           SegmentEvent = "Cost Consent Opened"
 	CostConsentComplete         SegmentEvent = "Cost Consent Complete"

+ 25 - 3
internal/analytics/tracks.go

@@ -119,21 +119,43 @@ func UserVerifyEmailTrack(opts *UserVerifyEmailTrackOpts) segmentTrack {
 	)
 }
 
-// ProjectCreateTrackOpts are the options for creating a track when a project is created
-type ProjectCreateTrackOpts struct {
+// ProjectCreateDeleteTrackOpts are the options for creating a track when a project is created or deleted
+type ProjectCreateDeleteTrackOpts struct {
 	*ProjectScopedTrackOpts
+
+	Email       string
+	FirstName   string
+	LastName    string
+	CompanyName string
 }
 
 // ProjectCreateTrack returns a track for when a project is created
-func ProjectCreateTrack(opts *ProjectCreateTrackOpts) segmentTrack {
+func ProjectCreateTrack(opts *ProjectCreateDeleteTrackOpts) segmentTrack {
 	additionalProps := make(map[string]interface{})
 
+	additionalProps["email"] = opts.Email
+	additionalProps["name"] = opts.FirstName + " " + opts.LastName
+	additionalProps["company"] = opts.CompanyName
+
 	return getSegmentProjectTrack(
 		opts.ProjectScopedTrackOpts,
 		getDefaultSegmentTrack(additionalProps, ProjectCreate),
 	)
 }
 
+// ProjectDeleteTrack returns a track for when a project is deleted
+func ProjectDeleteTrack(opts *ProjectCreateDeleteTrackOpts) segmentTrack {
+	additionalProps := make(map[string]interface{})
+	additionalProps["email"] = opts.Email
+	additionalProps["name"] = opts.FirstName + " " + opts.LastName
+	additionalProps["company"] = opts.CompanyName
+
+	return getSegmentProjectTrack(
+		opts.ProjectScopedTrackOpts,
+		getDefaultSegmentTrack(additionalProps, ProjectDelete),
+	)
+}
+
 // CostConsentOpenedTrackOpts are the options for creating a track when a user opens the cost consent
 type CostConsentOpenedTrackOpts struct {
 	*UserScopedTrackOpts