From 08af1da9669be96cca6cc5125376d596f89d57c8 Mon Sep 17 00:00:00 2001 From: Romain LE JEUNE Date: Tue, 27 Jun 2023 20:16:31 +0200 Subject: [PATCH] feat(GODT-2711): Send config_abort event on User removal. --- internal/bridge/user.go | 5 +++ internal/configstatus/configuration_abort.go | 36 +++++++++++++++++++- internal/user/config_status.go | 27 +++++++++++++-- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/internal/bridge/user.go b/internal/bridge/user.go index d6f5bd1b..46df3ba6 100644 --- a/internal/bridge/user.go +++ b/internal/bridge/user.go @@ -608,6 +608,11 @@ func (bridge *Bridge) logoutUser(ctx context.Context, user *user.User, withAPI, logrus.WithError(err).Error("Failed to remove IMAP user") } + // if this is actually a remove account + if withData && withAPI { + user.SendConfigStatusAbort() + } + if err := user.Logout(ctx, withAPI); err != nil { logrus.WithError(err).Error("Failed to logout user") } diff --git a/internal/configstatus/configuration_abort.go b/internal/configstatus/configuration_abort.go index 8d6bd2fc..29e5a147 100644 --- a/internal/configstatus/configuration_abort.go +++ b/internal/configstatus/configuration_abort.go @@ -17,4 +17,38 @@ package configstatus -// GODT-2711 +import "time" + +type ConfigAbortValues struct { + Duration int `json:"duration"` +} + +type ConfigAbortDimensions struct { + ReportClick interface{} `json:"report_click"` + ReportSent interface{} `json:"report_sent"` + ClickedLink uint64 `json:"clicked_link"` +} + +type ConfigAbortData struct { + MeasurementGroup string + Event string + Values ConfigSuccessValues + Dimensions ConfigSuccessDimensions +} + +type ConfigAbortBuilder struct{} + +func (*ConfigAbortBuilder) New(data *ConfigurationStatusData) ConfigAbortData { + return ConfigAbortData{ + MeasurementGroup: "bridge.any.configuration", + Event: "bridge_config_abort", + Values: ConfigSuccessValues{ + Duration: int(time.Since(data.DataV1.PendingSince).Minutes()), + }, + Dimensions: ConfigSuccessDimensions{ + ReportClick: data.DataV1.ReportClick, + ReportSent: data.DataV1.ReportSent, + ClickedLink: data.DataV1.ClickedLink, + }, + } +} diff --git a/internal/user/config_status.go b/internal/user/config_status.go index b1fa53a7..e798d4c5 100644 --- a/internal/user/config_status.go +++ b/internal/user/config_status.go @@ -29,7 +29,6 @@ func (user *User) SendConfigStatusSuccess() { if !user.telemetryManager.IsTelemetryAvailable() { return } - if !user.configStatus.IsPending() { return } @@ -41,11 +40,13 @@ func (user *User) SendConfigStatusSuccess() { if err := user.reporter.ReportMessageWithContext("Cannot parse config_success data.", reporter.Context{ "error": err, }); err != nil { - user.log.WithError(err).Error("Failed to parse config_success data.") + user.log.WithError(err).Error("Failed to report config_success data parsing error.") } + return } if err := user.SendTelemetry(context.Background(), data); err == nil { + user.log.Info("Configuration Status Success event sent.") if err := user.configStatus.ApplySuccess(); err != nil { user.log.WithError(err).Error("Failed to ApplySuccess on config_status.") } @@ -53,6 +54,28 @@ func (user *User) SendConfigStatusSuccess() { } func (user *User) SendConfigStatusAbort() { + if !user.telemetryManager.IsTelemetryAvailable() { + return + } + if !user.configStatus.IsPending() { + return + } + + var builder configstatus.ConfigAbortBuilder + abort := builder.New(user.configStatus.Data) + data, err := json.Marshal(abort) + if err != nil { + if err := user.reporter.ReportMessageWithContext("Cannot parse config_abort data.", reporter.Context{ + "error": err, + }); err != nil { + user.log.WithError(err).Error("Failed to report config_abort data parsing error.") + } + return + } + + if err := user.SendTelemetry(context.Background(), data); err == nil { + user.log.Info("Configuration Status Abort event sent.") + } } func (user *User) SendConfigStatusRecovery() {