From 299c079895c636e70f6cbd1156fa2c96c43179a8 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 22 Dec 2022 16:06:00 -0500 Subject: [PATCH] ensure true up review status is updated when a review is requested. --- api4/license.go | 3 +++ store/opentracinglayer/opentracinglayer.go | 18 +++++++++++++++++ store/retrylayer/retrylayer.go | 21 ++++++++++++++++++++ store/store.go | 1 + store/storetest/mocks/TrueUpReviewStore.go | 23 ++++++++++++++++++++++ store/storetest/store.go | 4 +--- store/timerlayer/timerlayer.go | 16 +++++++++++++++ 7 files changed, 83 insertions(+), 3 deletions(-) diff --git a/api4/license.go b/api4/license.go index 2409a05071..2339c3afab 100644 --- a/api4/license.go +++ b/api4/license.go @@ -424,6 +424,9 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) { telemetryService := c.App.Srv().GetTelemetryService() telemetryService.SendTelemetry(model.TrueUpReviewTelemetryName, telemetryProperties) + + status.Completed = true + c.App.Srv().Store().TrueUpReview().Update(status) } w.Write(reviewProfileJson) diff --git a/store/opentracinglayer/opentracinglayer.go b/store/opentracinglayer/opentracinglayer.go index 7537ab276f..a8c63c1bbd 100644 --- a/store/opentracinglayer/opentracinglayer.go +++ b/store/opentracinglayer/opentracinglayer.go @@ -10658,6 +10658,24 @@ func (s *OpenTracingLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.T return result, err } +func (s *OpenTracingLayerTrueUpReviewStore) Update(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) { + origCtx := s.Root.Store.Context() + span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "TrueUpReviewStore.Update") + s.Root.Store.SetContext(newCtx) + defer func() { + s.Root.Store.SetContext(origCtx) + }() + + defer span.Finish() + result, err := s.TrueUpReviewStore.Update(reviewStatus) + if err != nil { + span.LogFields(spanlog.Error(err)) + ext.Error.Set(span, true) + } + + return result, err +} + func (s *OpenTracingLayerUploadSessionStore) Delete(id string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UploadSessionStore.Delete") diff --git a/store/retrylayer/retrylayer.go b/store/retrylayer/retrylayer.go index 44777919e2..1900d0122b 100644 --- a/store/retrylayer/retrylayer.go +++ b/store/retrylayer/retrylayer.go @@ -12178,6 +12178,27 @@ func (s *RetryLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) ( } +func (s *RetryLayerTrueUpReviewStore) Update(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) { + + tries := 0 + for { + result, err := s.TrueUpReviewStore.Update(reviewStatus) + if err == nil { + return result, nil + } + if !isRepeatableError(err) { + return result, err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return result, err + } + timepkg.Sleep(100 * timepkg.Millisecond) + } + +} + func (s *RetryLayerUploadSessionStore) Delete(id string) error { tries := 0 diff --git a/store/store.go b/store/store.go index fbc28e6d7d..19349f2663 100644 --- a/store/store.go +++ b/store/store.go @@ -1002,6 +1002,7 @@ type PostAcknowledgementStore interface { type TrueUpReviewStore interface { GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) CreateTrueUpReviewStatusRecord(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) + Update(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) } // ChannelSearchOpts contains options for searching channels. diff --git a/store/storetest/mocks/TrueUpReviewStore.go b/store/storetest/mocks/TrueUpReviewStore.go index 6eb602ea75..0b5fdd8095 100644 --- a/store/storetest/mocks/TrueUpReviewStore.go +++ b/store/storetest/mocks/TrueUpReviewStore.go @@ -61,3 +61,26 @@ func (_m *TrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.Tr return r0, r1 } + +// Update provides a mock function with given fields: reviewStatus +func (_m *TrueUpReviewStore) Update(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) { + ret := _m.Called(reviewStatus) + + var r0 *model.TrueUpReviewStatus + if rf, ok := ret.Get(0).(func(*model.TrueUpReviewStatus) *model.TrueUpReviewStatus); ok { + r0 = rf(reviewStatus) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.TrueUpReviewStatus) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*model.TrueUpReviewStatus) error); ok { + r1 = rf(reviewStatus) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/store/storetest/store.go b/store/storetest/store.go index 9e07f2217f..683ea3fbf8 100644 --- a/store/storetest/store.go +++ b/store/storetest/store.go @@ -101,9 +101,7 @@ func (s *Store) Draft() store.DraftStore { return &s.D func (s *Store) ChannelMemberHistory() store.ChannelMemberHistoryStore { return &s.ChannelMemberHistoryStore } -func (s *Store) TrueUpReview() store.TrueUpReviewStore { - return &s.TrueUpReviewStore -} +func (s *Store) TrueUpReview() store.TrueUpReviewStore { return &s.TrueUpReviewStore } func (s *Store) NotifyAdmin() store.NotifyAdminStore { return &s.NotifyAdminStore } func (s *Store) Group() store.GroupStore { return &s.GroupStore } func (s *Store) LinkMetadata() store.LinkMetadataStore { return &s.LinkMetadataStore } diff --git a/store/timerlayer/timerlayer.go b/store/timerlayer/timerlayer.go index eee6613062..2ca093d9b4 100644 --- a/store/timerlayer/timerlayer.go +++ b/store/timerlayer/timerlayer.go @@ -9591,6 +9591,22 @@ func (s *TimerLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) ( return result, err } +func (s *TimerLayerTrueUpReviewStore) Update(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) { + start := time.Now() + + result, err := s.TrueUpReviewStore.Update(reviewStatus) + + elapsed := float64(time.Since(start)) / float64(time.Second) + if s.Root.Metrics != nil { + success := "false" + if err == nil { + success = "true" + } + s.Root.Metrics.ObserveStoreMethodDuration("TrueUpReviewStore.Update", success, elapsed) + } + return result, err +} + func (s *TimerLayerUploadSessionStore) Delete(id string) error { start := time.Now()