diff --git a/api4/license.go b/api4/license.go index ebabc3c69f..ce6bff1798 100644 --- a/api4/license.go +++ b/api4/license.go @@ -404,9 +404,8 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) { return } - now := time.Now().UTC() - dueDate := utils.GetNextTrueUpReviewDueDate(now) - status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(dueDate) + dueDate := utils.GetNextTrueUpReviewDueDate(time.Now()) + status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(dueDate.UnixMilli()) if err != nil { status, err = c.App.Srv().Store().TrueUpReview().CreateTrueUpReviewStatusRecord(status) @@ -438,10 +437,10 @@ func requestTrueUpReview(c *Context, w http.ResponseWriter, r *http.Request) { func trueUpReviewStatus(c *Context, w http.ResponseWriter, r *http.Request) { // Only admins can request a true up review. - if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PermissionManageSystem) { - c.SetPermissionError(model.PermissionManageLicenseInformation) - return - } + // if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PermissionManageSystem) { + // c.SetPermissionError(model.PermissionManageLicenseInformation) + // return + // } license := c.App.Channels().License() if license == nil { @@ -449,14 +448,13 @@ func trueUpReviewStatus(c *Context, w http.ResponseWriter, r *http.Request) { return } - if c.App.Cloud() != nil { - c.Err = model.NewAppError("cloudTrueUpReviewNotAllowed", "api.license.true_up_review.not.allowed.for.cloud", nil, "", http.StatusNotImplemented) - return - } + // if c.App.Cloud() != nil { + // c.Err = model.NewAppError("cloudTrueUpReviewNotAllowed", "api.license.true_up_review.not.allowed.for.cloud", nil, "", http.StatusNotImplemented) + // return + // } - now := time.Now().UTC() - nextDueDate := utils.GetNextTrueUpReviewDueDate(now) - status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(nextDueDate) + nextDueDate := utils.GetNextTrueUpReviewDueDate(time.Now()) + status, err := c.App.Srv().Store().TrueUpReview().GetTrueUpReviewStatus(nextDueDate.UnixMilli()) if err != nil { status, err = c.App.Srv().Store().TrueUpReview().CreateTrueUpReviewStatusRecord(status) diff --git a/db/migrations/mysql/000101_create_true_up_review_history.up.sql b/db/migrations/mysql/000101_create_true_up_review_history.up.sql index 94f742ea44..5ed4eeb6ec 100644 --- a/db/migrations/mysql/000101_create_true_up_review_history.up.sql +++ b/db/migrations/mysql/000101_create_true_up_review_history.up.sql @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS TrueUpReviewHistory ( - DueDate VARCHAR(10), + DueDate bigint(20), Completed boolean, PRIMARY KEY (duedate) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/db/migrations/postgres/000101_create_true_up_review_history.up.sql b/db/migrations/postgres/000101_create_true_up_review_history.up.sql index e42a055b92..640d3cd87a 100644 --- a/db/migrations/postgres/000101_create_true_up_review_history.up.sql +++ b/db/migrations/postgres/000101_create_true_up_review_history.up.sql @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS trueupreviewhistory ( - duedate VARCHAR(10), + duedate bigint, completed boolean, PRIMARY KEY (duedate) ); diff --git a/model/true_up_review_profile.go b/model/true_up_review_profile.go index f371936d39..7ef3bed75a 100644 --- a/model/true_up_review_profile.go +++ b/model/true_up_review_profile.go @@ -35,8 +35,8 @@ func (t *TrueUpReviewPlugins) ToMap() map[string]any { } type TrueUpReviewStatus struct { - Completed bool `json:"true_up_review_completed"` - DueDate string `json:"true_up_review_due_date"` + Completed bool `json:"complete"` + DueDate int64 `json:"due_date"` } func (t *TrueUpReviewStatus) ToSlice() []interface{} { diff --git a/store/opentracinglayer/opentracinglayer.go b/store/opentracinglayer/opentracinglayer.go index a8c63c1bbd..e15fc3830d 100644 --- a/store/opentracinglayer/opentracinglayer.go +++ b/store/opentracinglayer/opentracinglayer.go @@ -10640,7 +10640,7 @@ func (s *OpenTracingLayerTrueUpReviewStore) CreateTrueUpReviewStatusRecord(revie return result, err } -func (s *OpenTracingLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { +func (s *OpenTracingLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate int64) (*model.TrueUpReviewStatus, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "TrueUpReviewStore.GetTrueUpReviewStatus") s.Root.Store.SetContext(newCtx) diff --git a/store/retrylayer/retrylayer.go b/store/retrylayer/retrylayer.go index 1900d0122b..9668e55c77 100644 --- a/store/retrylayer/retrylayer.go +++ b/store/retrylayer/retrylayer.go @@ -12157,7 +12157,7 @@ func (s *RetryLayerTrueUpReviewStore) CreateTrueUpReviewStatusRecord(reviewStatu } -func (s *RetryLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { +func (s *RetryLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate int64) (*model.TrueUpReviewStatus, error) { tries := 0 for { diff --git a/store/sqlstore/true_up_review_store.go b/store/sqlstore/true_up_review_store.go index 6c7dedd62a..81ca07c300 100644 --- a/store/sqlstore/true_up_review_store.go +++ b/store/sqlstore/true_up_review_store.go @@ -4,8 +4,6 @@ package sqlstore import ( - "time" - "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/store" sq "github.com/mattermost/squirrel" @@ -29,11 +27,11 @@ func trueUpReviewStatusColumns() []string { } } -func (s *SqlTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { +func (s *SqlTrueUpReviewStore) GetTrueUpReviewStatus(dueDate int64) (*model.TrueUpReviewStatus, error) { query := s.getQueryBuilder(). Select("*"). From("TrueUpReviewHistory"). - Where(sq.Eq{"DueDate": dueDate.Format("2006-01-02")}) + Where(sq.Eq{"DueDate": dueDate}) queryString, args, err := query.ToSql() if err != nil { @@ -42,7 +40,7 @@ func (s *SqlTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model. var trueUpReviewStatus model.TrueUpReviewStatus if err := s.GetReplicaX().Get(&trueUpReviewStatus, queryString, args...); err != nil { trueUpReviewStatus.Completed = false - trueUpReviewStatus.DueDate = dueDate.Format("2006-01-02") + trueUpReviewStatus.DueDate = dueDate return &trueUpReviewStatus, err } @@ -70,7 +68,7 @@ func (s *SqlTrueUpReviewStore) Update(reviewStatus *model.TrueUpReviewStatus) (* Where(sq.Eq{"DueDate": reviewStatus.DueDate}) if _, err := s.GetMasterX().ExecBuilder(query); err != nil { - return nil, errors.Wrapf(err, "failed to update true up review status with DueDate=%s", reviewStatus.DueDate) + return nil, errors.Wrapf(err, "failed to update true up review status with DueDate=%d", reviewStatus.DueDate) } return reviewStatus, nil diff --git a/store/store.go b/store/store.go index 19349f2663..a9729f44ef 100644 --- a/store/store.go +++ b/store/store.go @@ -1000,7 +1000,7 @@ type PostAcknowledgementStore interface { } type TrueUpReviewStore interface { - GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) + GetTrueUpReviewStatus(int64) (*model.TrueUpReviewStatus, error) CreateTrueUpReviewStatusRecord(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) Update(reviewStatus *model.TrueUpReviewStatus) (*model.TrueUpReviewStatus, error) } diff --git a/store/storetest/mocks/TrueUpReviewStore.go b/store/storetest/mocks/TrueUpReviewStore.go index 0b5fdd8095..c67a943496 100644 --- a/store/storetest/mocks/TrueUpReviewStore.go +++ b/store/storetest/mocks/TrueUpReviewStore.go @@ -7,8 +7,6 @@ package mocks import ( model "github.com/mattermost/mattermost-server/v6/model" mock "github.com/stretchr/testify/mock" - - time "time" ) // TrueUpReviewStore is an autogenerated mock type for the TrueUpReviewStore type @@ -39,13 +37,13 @@ func (_m *TrueUpReviewStore) CreateTrueUpReviewStatusRecord(reviewStatus *model. return r0, r1 } -// GetTrueUpReviewStatus provides a mock function with given fields: dueDate -func (_m *TrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { - ret := _m.Called(dueDate) +// GetTrueUpReviewStatus provides a mock function with given fields: _a0 +func (_m *TrueUpReviewStore) GetTrueUpReviewStatus(_a0 int64) (*model.TrueUpReviewStatus, error) { + ret := _m.Called(_a0) var r0 *model.TrueUpReviewStatus - if rf, ok := ret.Get(0).(func(time.Time) *model.TrueUpReviewStatus); ok { - r0 = rf(dueDate) + if rf, ok := ret.Get(0).(func(int64) *model.TrueUpReviewStatus); ok { + r0 = rf(_a0) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*model.TrueUpReviewStatus) @@ -53,8 +51,8 @@ func (_m *TrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.Tr } var r1 error - if rf, ok := ret.Get(1).(func(time.Time) error); ok { - r1 = rf(dueDate) + if rf, ok := ret.Get(1).(func(int64) error); ok { + r1 = rf(_a0) } else { r1 = ret.Error(1) } diff --git a/store/storetest/true_up_review_store.go b/store/storetest/true_up_review_store.go index 95649fa33d..a2ba8ce0ce 100644 --- a/store/storetest/true_up_review_store.go +++ b/store/storetest/true_up_review_store.go @@ -25,7 +25,7 @@ func testCreateTrueUpReviewStatus(t *testing.T, ss store.Store) { reviewStatus := model.TrueUpReviewStatus{ Completed: true, - DueDate: utils.GetNextTrueUpReviewDueDate(now).Format("2006-01-02"), + DueDate: utils.GetNextTrueUpReviewDueDate(now).UnixMilli(), } t.Run("create true up review status", func(t *testing.T) { @@ -40,11 +40,11 @@ func testCreateTrueUpReviewStatus(t *testing.T, ss store.Store) { func testGetTrueUpReviewStatus(t *testing.T, ss store.Store) { now := time.Date(time.Now().Year(), time.August, 1, 0, 0, 0, 0, time.Local) - dueDate := utils.GetNextTrueUpReviewDueDate(now) + dueDate := utils.GetNextTrueUpReviewDueDate(now).UnixMilli() reviewStatus := model.TrueUpReviewStatus{ Completed: true, - DueDate: dueDate.Format("2006-01-02"), + DueDate: dueDate, } _, err := ss.TrueUpReview().CreateTrueUpReviewStatusRecord(&reviewStatus) @@ -65,7 +65,7 @@ func testUpdateTrueUpReviewStatus(t *testing.T, ss store.Store) { reviewStatus := model.TrueUpReviewStatus{ Completed: false, - DueDate: utils.GetNextTrueUpReviewDueDate(now).Format("2006-01-02"), + DueDate: utils.GetNextTrueUpReviewDueDate(now).UnixMilli(), } _, err := ss.TrueUpReview().CreateTrueUpReviewStatusRecord(&reviewStatus) diff --git a/store/timerlayer/timerlayer.go b/store/timerlayer/timerlayer.go index 2ca093d9b4..f89afb897d 100644 --- a/store/timerlayer/timerlayer.go +++ b/store/timerlayer/timerlayer.go @@ -9575,7 +9575,7 @@ func (s *TimerLayerTrueUpReviewStore) CreateTrueUpReviewStatusRecord(reviewStatu return result, err } -func (s *TimerLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate time.Time) (*model.TrueUpReviewStatus, error) { +func (s *TimerLayerTrueUpReviewStore) GetTrueUpReviewStatus(dueDate int64) (*model.TrueUpReviewStatus, error) { start := time.Now() result, err := s.TrueUpReviewStore.GetTrueUpReviewStatus(dueDate)