From 96f1739f8f9d9a934c815bdf11f06a7e1eaacd09 Mon Sep 17 00:00:00 2001 From: Rodrigo Villablanca Date: Mon, 26 Oct 2020 06:41:27 -0300 Subject: [PATCH] UserStore migration (#15563) * Migration completed * Fix tests * Fix tests * Fix tests * Suggestions * Trigger CI * Suggestions * Merge with master * Trigger CI Co-authored-by: Mattermod Co-authored-by: Agniva De Sarker --- api4/user_test.go | 32 +- api4/user_viewmembers_test.go | 10 +- api4/websocket_test.go | 8 +- app/analytics.go | 34 +- app/authentication.go | 10 +- app/bot.go | 86 +- app/bot_test.go | 6 +- app/channel.go | 107 +- app/channel_test.go | 2 +- app/command.go | 31 +- app/config.go | 4 +- app/constants.go | 2 + app/export.go | 7 +- app/import_functions.go | 28 +- app/integration_action.go | 12 +- app/license.go | 2 +- app/login.go | 2 +- app/notification.go | 12 +- app/notification_push.go | 6 +- app/oauth.go | 39 +- app/permissions.go | 2 +- app/post.go | 24 +- app/product_notices.go | 11 +- app/session.go | 28 +- app/slashcommands/auto_users.go | 2 +- app/slashcommands/command_groupmsg.go | 4 +- app/slashcommands/command_invite.go | 7 +- app/slashcommands/command_msg.go | 6 +- app/slashcommands/command_remove.go | 6 +- app/team.go | 88 +- app/user.go | 306 +++-- app/user_test.go | 8 +- app/webhook.go | 8 +- cmd/mattermost/commands/userargs.go | 2 +- i18n/en.json | 372 ++---- jobs/active_users/worker.go | 4 +- services/mfa/mfa.go | 2 +- services/mfa/mfa_test.go | 32 +- .../bleveengine/indexer/indexing_job.go | 2 +- services/slackimport/slackimport.go | 10 +- services/telemetry/telemetry.go | 8 +- store/constants.go | 3 - store/localcachelayer/user_layer.go | 6 +- store/opentracinglayer/opentracinglayer.go | 120 +- store/retrylayer/retrylayer.go | 1080 +++++++++++++++-- store/searchlayer/user_layer.go | 28 +- store/sqlstore/user_store.go | 428 ++++--- store/store.go | 120 +- store/storetest/channel_store.go | 12 +- store/storetest/group_store.go | 100 +- store/storetest/mocks/UserStore.go | 600 ++++----- store/storetest/team_store.go | 18 +- store/storetest/user_store.go | 44 +- store/timerlayer/timerlayer.go | 120 +- web/oauth_test.go | 4 +- 55 files changed, 2487 insertions(+), 1568 deletions(-) diff --git a/api4/user_test.go b/api4/user_test.go index 16975109b7..78717c3ef3 100644 --- a/api4/user_test.go +++ b/api4/user_test.go @@ -44,13 +44,13 @@ func TestCreateUser(t *testing.T) { ruser.Username = GenerateTestUsername() ruser.Password = "passwd1" _, resp = th.Client.CreateUser(ruser) - CheckErrorMessage(t, resp, "store.sql_user.save.email_exists.app_error") + CheckErrorMessage(t, resp, "app.user.save.existing.app_error") CheckBadRequestStatus(t, resp) ruser.Email = th.GenerateTestEmail() ruser.Username = user.Username _, resp = th.Client.CreateUser(ruser) - CheckErrorMessage(t, resp, "store.sql_user.save.username_exists.app_error") + CheckErrorMessage(t, resp, "app.user.save.existing.app_error") CheckBadRequestStatus(t, resp) ruser.Email = "" @@ -1996,8 +1996,8 @@ func TestPermanentDeleteAllUsers(t *testing.T) { require.Nil(t, err) // Check that we have users and posts in the database - users, err := th.App.Srv().Store.User().GetAll() - require.Nil(t, err) + users, nErr := th.App.Srv().Store.User().GetAll() + require.Nil(t, nErr) require.Greater(t, len(users), 0) postCount, nErr := th.App.Srv().Store.Post().AnalyticsPostCount("", false, false) @@ -2009,8 +2009,8 @@ func TestPermanentDeleteAllUsers(t *testing.T) { require.Nil(t, resp.Error) // Check that both user and post tables are empty - users, err = th.App.Srv().Store.User().GetAll() - require.Nil(t, err) + users, nErr = th.App.Srv().Store.User().GetAll() + require.Nil(t, nErr) require.Len(t, users, 0) postCount, nErr = th.App.Srv().Store.Post().AnalyticsPostCount("", false, false) @@ -2673,14 +2673,14 @@ func TestUserLoginMFAFlow(t *testing.T) { assert.Nil(t, err) // Fake user has MFA enabled - err = th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) - require.Nil(t, err) + nErr := th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) + require.Nil(t, nErr) - err = th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) - require.Nil(t, err) + nErr = th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) + require.Nil(t, nErr) - err = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) - require.Nil(t, err) + nErr = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) + require.Nil(t, nErr) user, resp := th.Client.Login(th.BasicUser.Email, th.BasicUser.Password) CheckErrorMessage(t, resp, "mfa.validate_token.authenticate.app_error") @@ -2706,11 +2706,11 @@ func TestUserLoginMFAFlow(t *testing.T) { assert.Nil(t, err) // Fake user has MFA enabled - err = th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) - require.Nil(t, err) + nErr := th.Server.Store.User().UpdateMfaActive(th.BasicUser.Id, true) + require.Nil(t, nErr) - err = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) - require.Nil(t, err) + nErr = th.Server.Store.User().UpdateMfaSecret(th.BasicUser.Id, secret.Secret) + require.Nil(t, nErr) code := dgoogauth.ComputeCode(secret.Secret, time.Now().UTC().Unix()/30) diff --git a/api4/user_viewmembers_test.go b/api4/user_viewmembers_test.go index ad2ccd2289..aac51eacbd 100644 --- a/api4/user_viewmembers_test.go +++ b/api4/user_viewmembers_test.go @@ -79,7 +79,7 @@ func TestApiResctrictedViewMembers(t *testing.T) { "Get not existing user without restrictions", "", model.NewId(), - "store.sql_user.missing_account.const", + "app.user.missing_account.const", }, { "Get not existing user with restrictions to teams", @@ -161,7 +161,7 @@ func TestApiResctrictedViewMembers(t *testing.T) { "Get not existing user without restrictions", "", model.NewId(), - "store.sql_user.get_by_username.app_error", + "app.user.get_by_username.app_error", }, { "Get not existing user with restrictions to teams", @@ -243,7 +243,7 @@ func TestApiResctrictedViewMembers(t *testing.T) { "Get not existing user without restrictions", "", th.GenerateTestEmail(), - "store.sql_user.missing_account.const", + "app.user.missing_account.const", }, { "Get not existing user with restrictions to teams", @@ -325,7 +325,7 @@ func TestApiResctrictedViewMembers(t *testing.T) { "Get not existing user without restrictions", "", model.NewId(), - "store.sql_user.missing_account.const", + "app.user.missing_account.const", }, { "Get not existing user with restrictions to teams", @@ -407,7 +407,7 @@ func TestApiResctrictedViewMembers(t *testing.T) { "Get not existing user without restrictions", "", model.NewId(), - "store.sql_user.missing_account.const", + "app.user.missing_account.const", }, { "Get not existing user with restrictions to teams", diff --git a/api4/websocket_test.go b/api4/websocket_test.go index e24e9e1fb9..4c7f992a75 100644 --- a/api4/websocket_test.go +++ b/api4/websocket_test.go @@ -264,14 +264,14 @@ func TestWebSocketStatuses(t *testing.T) { user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"} ruser := Client.Must(Client.CreateUser(&user)).(*model.User) th.LinkUserToTeam(ruser, rteam) - _, err = th.App.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) - require.Nil(t, err) + _, nErr := th.App.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) + require.Nil(t, nErr) user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@simulator.amazonses.com", Nickname: "Corey Hulen", Password: "passwd1"} ruser2 := Client.Must(Client.CreateUser(&user2)).(*model.User) th.LinkUserToTeam(ruser2, rteam) - _, err = th.App.Srv().Store.User().VerifyEmail(ruser2.Id, ruser2.Email) - require.Nil(t, err) + _, nErr = th.App.Srv().Store.User().VerifyEmail(ruser2.Id, ruser2.Email) + require.Nil(t, nErr) Client.Login(user.Email, user.Password) diff --git a/app/analytics.go b/app/analytics.go index 0d0029cf8f..d32dd1efe8 100644 --- a/app/analytics.go +++ b/app/analytics.go @@ -21,7 +21,7 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo var systemUserCount int64 systemUserCount, err := a.Srv().Store.User().Count(model.UserCountOptions{}) if err != nil { - return nil, err + return nil, model.NewAppError("GetAnalytics", "app.user.get_total_users_count.app_error", nil, err.Error(), http.StatusInternalServerError) } if systemUserCount > int64(*a.Config().AnalyticsSettings.MaxUsersForStatistics) { @@ -62,14 +62,14 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo userInactiveChan = make(chan store.StoreResult, 1) go func() { count, err2 := a.Srv().Store.User().AnalyticsGetInactiveUsersCount() - userInactiveChan <- store.StoreResult{Data: count, Err: err2} + userInactiveChan <- store.StoreResult{Data: count, NErr: err2} close(userInactiveChan) }() } else { userChan = make(chan store.StoreResult, 1) go func() { count, err2 := a.Srv().Store.User().Count(model.UserCountOptions{TeamId: teamId}) - userChan <- store.StoreResult{Data: count, Err: err2} + userChan <- store.StoreResult{Data: count, NErr: err2} close(userChan) }() } @@ -94,14 +94,14 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo dailyActiveChan := make(chan store.StoreResult, 1) go func() { dailyActive, err2 := a.Srv().Store.User().AnalyticsActiveCount(DAY_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: false}) - dailyActiveChan <- store.StoreResult{Data: dailyActive, Err: err2} + dailyActiveChan <- store.StoreResult{Data: dailyActive, NErr: err2} close(dailyActiveChan) }() monthlyActiveChan := make(chan store.StoreResult, 1) go func() { monthlyActive, err2 := a.Srv().Store.User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: false}) - monthlyActiveChan <- store.StoreResult{Data: monthlyActive, Err: err2} + monthlyActiveChan <- store.StoreResult{Data: monthlyActive, NErr: err2} close(monthlyActiveChan) }() @@ -131,8 +131,8 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo rows[3].Value = float64(systemUserCount) } else { r = <-userChan - if r.Err != nil { - return nil, r.Err + if r.NErr != nil { + return nil, model.NewAppError("GetAnalytics", "app.user.get_total_users_count.app_error", nil, r.NErr.Error(), http.StatusInternalServerError) } rows[3].Value = float64(r.Data.(int64)) } @@ -141,8 +141,8 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo rows[10].Value = -1 } else { r = <-userInactiveChan - if r.Err != nil { - return nil, r.Err + if r.NErr != nil { + return nil, model.NewAppError("GetAnalytics", "app.user.analytics_get_inactive_users_count.app_error", nil, r.NErr.Error(), http.StatusInternalServerError) } rows[10].Value = float64(r.Data.(int64)) } @@ -181,14 +181,14 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo } r = <-dailyActiveChan - if r.Err != nil { - return nil, r.Err + if r.NErr != nil { + return nil, model.NewAppError("GetAnalytics", "app.user.analytics_daily_active_users.app_error", nil, r.NErr.Error(), http.StatusInternalServerError) } rows[8].Value = float64(r.Data.(int64)) r = <-monthlyActiveChan - if r.Err != nil { - return nil, r.Err + if r.NErr != nil { + return nil, model.NewAppError("GetAnalytics", "app.user.analytics_daily_active_users.app_error", nil, r.NErr.Error(), http.StatusInternalServerError) } rows[9].Value = float64(r.Data.(int64)) @@ -325,7 +325,7 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo r = <-commandChan if r.NErr != nil { - return nil, model.NewAppError("GetAnalytics", "app.analytics.getanalytics.internal_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("GetAnalytics", "app.analytics.getanalytics.internal_error", nil, r.NErr.Error(), http.StatusInternalServerError) } rows[4].Value = float64(r.Data.(int64)) @@ -344,7 +344,7 @@ func (a *App) GetAnalytics(name string, teamId string) (model.AnalyticsRows, *mo func (a *App) GetRecentlyActiveUsersForTeam(teamId string) (map[string]*model.User, *model.AppError) { users, err := a.Srv().Store.User().GetRecentlyActiveUsersForTeam(teamId, 0, 100, nil) if err != nil { - return nil, err + return nil, model.NewAppError("GetRecentlyActiveUsersForTeam", "app.user.get_recently_active_users.app_error", nil, err.Error(), http.StatusInternalServerError) } userMap := make(map[string]*model.User) @@ -359,7 +359,7 @@ func (a *App) GetRecentlyActiveUsersForTeam(teamId string) (map[string]*model.Us func (a *App) GetRecentlyActiveUsersForTeamPage(teamId string, page, perPage int, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { users, err := a.Srv().Store.User().GetRecentlyActiveUsersForTeam(teamId, page*perPage, perPage, viewRestrictions) if err != nil { - return nil, err + return nil, model.NewAppError("GetRecentlyActiveUsersForTeamPage", "app.user.get_recently_active_users.app_error", nil, err.Error(), http.StatusInternalServerError) } return a.sanitizeProfiles(users, asAdmin), nil @@ -368,7 +368,7 @@ func (a *App) GetRecentlyActiveUsersForTeamPage(teamId string, page, perPage int func (a *App) GetNewUsersForTeamPage(teamId string, page, perPage int, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { users, err := a.Srv().Store.User().GetNewUsersForTeam(teamId, page*perPage, perPage, viewRestrictions) if err != nil { - return nil, err + return nil, model.NewAppError("GetNewUsersForTeamPage", "app.user.get_new_users.app_error", nil, err.Error(), http.StatusInternalServerError) } return a.sanitizeProfiles(users, asAdmin), nil diff --git a/app/authentication.go b/app/authentication.go index 8df77f5820..0f1c933cbd 100644 --- a/app/authentication.go +++ b/app/authentication.go @@ -52,7 +52,7 @@ func (a *App) CheckPasswordAndAllCriteria(user *model.User, password string, mfa if err := a.checkUserPassword(user, password); err != nil { if passErr := a.Srv().Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); passErr != nil { - return passErr + return model.NewAppError("CheckPasswordAndAllCriteria", "app.user.update_failed_pwd_attempts.app_error", nil, passErr.Error(), http.StatusInternalServerError) } a.InvalidateCacheForUser(user.Id) @@ -65,7 +65,7 @@ func (a *App) CheckPasswordAndAllCriteria(user *model.User, password string, mfa // about the MFA state of the user in question if mfaToken != "" { if passErr := a.Srv().Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); passErr != nil { - return passErr + return model.NewAppError("CheckPasswordAndAllCriteria", "app.user.update_failed_pwd_attempts.app_error", nil, passErr.Error(), http.StatusInternalServerError) } } @@ -75,7 +75,7 @@ func (a *App) CheckPasswordAndAllCriteria(user *model.User, password string, mfa } if passErr := a.Srv().Store.User().UpdateFailedPasswordAttempts(user.Id, 0); passErr != nil { - return passErr + return model.NewAppError("CheckPasswordAndAllCriteria", "app.user.update_failed_pwd_attempts.app_error", nil, passErr.Error(), http.StatusInternalServerError) } a.InvalidateCacheForUser(user.Id) @@ -95,7 +95,7 @@ func (a *App) DoubleCheckPassword(user *model.User, password string) *model.AppE if err := a.checkUserPassword(user, password); err != nil { if passErr := a.Srv().Store.User().UpdateFailedPasswordAttempts(user.Id, user.FailedAttempts+1); passErr != nil { - return passErr + return model.NewAppError("DoubleCheckPassword", "app.user.update_failed_pwd_attempts.app_error", nil, passErr.Error(), http.StatusInternalServerError) } a.InvalidateCacheForUser(user.Id) @@ -104,7 +104,7 @@ func (a *App) DoubleCheckPassword(user *model.User, password string) *model.AppE } if passErr := a.Srv().Store.User().UpdateFailedPasswordAttempts(user.Id, 0); passErr != nil { - return passErr + return model.NewAppError("DoubleCheckPassword", "app.user.update_failed_pwd_attempts.app_error", nil, passErr.Error(), http.StatusInternalServerError) } a.InvalidateCacheForUser(user.Id) diff --git a/app/bot.go b/app/bot.go index 6f22f34a57..c0f8cb4dfa 100644 --- a/app/bot.go +++ b/app/bot.go @@ -18,9 +18,18 @@ import ( // CreateBot creates the given bot and corresponding user. func (a *App) CreateBot(bot *model.Bot) (*model.Bot, *model.AppError) { - user, err := a.Srv().Store.User().Save(model.UserFromBot(bot)) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Save(model.UserFromBot(bot)) + if nErr != nil { + var appErr *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(nErr, &appErr): + return nil, appErr + case errors.As(nErr, &invErr): + return nil, model.NewAppError("CreateBot", "app.user.save.existing.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("CreateBot", "app.user.save.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } bot.UserId = user.Id @@ -38,9 +47,10 @@ func (a *App) CreateBot(bot *model.Bot) (*model.Bot, *model.AppError) { // Get the owner of the bot, if one exists. If not, don't send a message ownerUser, err := a.Srv().Store.User().Get(bot.OwnerId) - if err != nil && err.Id != store.MISSING_ACCOUNT_ERROR { + var nfErr *store.ErrNotFound + if err != nil && !errors.As(err, &nfErr) { mlog.Error(err.Error()) - return nil, err + return nil, model.NewAppError("CreateBot", "app.user.get.app_error", nil, err.Error(), http.StatusInternalServerError) } else if ownerUser != nil { // Send a message to the bot's creator to inform them that the bot needs to be added // to a team and channel after it's created @@ -74,10 +84,19 @@ func (a *App) getOrCreateWarnMetricsBot(botDef *model.Bot) (*model.Bot, *model.A } // cannot find this bot user, save the user - user, err := a.Srv().Store.User().Save(model.UserFromBot(botDef)) - if err != nil { - mlog.Error(err.Error()) - return nil, err + user, nErr := a.Srv().Store.User().Save(model.UserFromBot(botDef)) + if nErr != nil { + mlog.Error(nErr.Error()) + var appError *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(nErr, &appError): + return nil, appError + case errors.As(nErr, &invErr): + return nil, model.NewAppError("getOrCreateWarnMetricsBot", "app.user.save.existing.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("getOrCreateWarnMetricsBot", "app.user.save.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } botDef.UserId = user.Id @@ -119,9 +138,15 @@ func (a *App) PatchBot(botUserId string, botPatch *model.BotPatch) (*model.Bot, bot.Patch(botPatch) - user, err := a.Srv().Store.User().Get(botUserId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(botUserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("PatchBot", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("PatchBot", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } patchedUser := model.UserFromBot(bot) @@ -130,16 +155,25 @@ func (a *App) PatchBot(botUserId string, botPatch *model.BotPatch) (*model.Bot, user.Email = patchedUser.Email user.FirstName = patchedUser.FirstName - userUpdate, err := a.Srv().Store.User().Update(user, true) - if err != nil { - return nil, err + userUpdate, nErr := a.Srv().Store.User().Update(user, true) + if nErr != nil { + var appErr *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(nErr, &appErr): + return nil, appErr + case errors.As(nErr, &invErr): + return nil, model.NewAppError("PatchBot", "app.user.update.find.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("PatchBot", "app.user.update.finding.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } a.InvalidateCacheForUser(user.Id) ruser := userUpdate.New a.sendUpdatedUserEvent(*ruser) - bot, nErr := a.Srv().Store.Bot().Update(bot) + bot, nErr = a.Srv().Store.Bot().Update(bot) if nErr != nil { var nfErr *store.ErrNotFound var appErr *model.AppError @@ -181,12 +215,18 @@ func (a *App) GetBots(options *model.BotGetOptions) (model.BotList, *model.AppEr // UpdateBotActive marks a bot as active or inactive, along with its corresponding user. func (a *App) UpdateBotActive(botUserId string, active bool) (*model.Bot, *model.AppError) { - user, err := a.Srv().Store.User().Get(botUserId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(botUserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("PatchBot", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("PatchBot", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } - if _, err = a.UpdateActive(user, active); err != nil { + if _, err := a.UpdateActive(user, active); err != nil { return nil, err } @@ -242,7 +282,7 @@ func (a *App) PermanentDeleteBot(botUserId string) *model.AppError { } if err := a.Srv().Store.User().PermanentDelete(botUserId); err != nil { - return err + return model.NewAppError("PermanentDeleteBot", "app.user.permanent_delete.app_error", nil, err.Error(), http.StatusInternalServerError) } return nil @@ -499,8 +539,8 @@ func (a *App) DeleteBotIconImage(botUserId string) *model.AppError { return model.NewAppError("DeleteBotIconImage", "api.bot.delete_bot_icon_image.app_error", nil, err.Error(), http.StatusInternalServerError) } - if err = a.Srv().Store.User().UpdateLastPictureUpdate(botUserId); err != nil { - mlog.Error(err.Error()) + if nErr := a.Srv().Store.User().UpdateLastPictureUpdate(botUserId); nErr != nil { + mlog.Error(nErr.Error()) } bot.LastIconUpdate = int64(0) diff --git a/app/bot_test.go b/app/bot_test.go index e40fbe14fa..39d7eaf4e8 100644 --- a/app/bot_test.go +++ b/app/bot_test.go @@ -97,7 +97,7 @@ func TestCreateBot(t *testing.T) { OwnerId: th.BasicUser.Id, }) require.NotNil(t, err) - require.Equal(t, "store.sql_user.save.username_exists.app_error", err.Id) + require.Equal(t, "app.user.save.existing.app_error", err.Id) }) } @@ -201,7 +201,7 @@ func TestPatchBot(t *testing.T) { _, err = th.App.PatchBot(bot.UserId, botPatch) require.NotNil(t, err) - require.Equal(t, "store.sql_user.update.username_taken.app_error", err.Id) + require.Equal(t, "app.user.update.find.app_error", err.Id) }) } @@ -465,7 +465,7 @@ func TestUpdateBotActive(t *testing.T) { _, err := th.App.UpdateBotActive(model.NewId(), false) require.NotNil(t, err) - require.Equal(t, "store.sql_user.missing_account.const", err.Id) + require.Equal(t, "app.user.missing_account.const", err.Id) }) t.Run("disable/enable bot", func(t *testing.T) { diff --git a/app/channel.go b/app/channel.go index f4b12e62f1..11d6848819 100644 --- a/app/channel.go +++ b/app/channel.go @@ -65,16 +65,21 @@ func (a *App) DefaultChannelNames() []string { func (a *App) JoinDefaultChannels(teamId string, user *model.User, shouldBeAdmin bool, userRequestorId string) *model.AppError { var requestor *model.User + var nErr error if userRequestorId != "" { - var err *model.AppError - requestor, err = a.Srv().Store.User().Get(userRequestorId) - if err != nil { - return err + requestor, nErr = a.Srv().Store.User().Get(userRequestorId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return model.NewAppError("JoinDefaultChannels", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("JoinDefaultChannels", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } } var err *model.AppError - var nErr error for _, channelName := range a.DefaultChannelNames() { channel, channelErr := a.Srv().Store.Channel().GetByName(teamId, channelName, true) if channelErr != nil { @@ -256,9 +261,15 @@ func (a *App) CreateChannel(channel *model.Channel, addMember bool) (*model.Chan } if addMember { - user, err := a.Srv().Store.User().Get(channel.CreatorId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(channel.CreatorId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("CreateChannel", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("CreateChannel", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } cm := &model.ChannelMember{ @@ -352,23 +363,23 @@ func (a *App) createDirectChannel(userId string, otherUserId string) (*model.Cha uc2 := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(userId) - uc1 <- store.StoreResult{Data: user, Err: err} + uc1 <- store.StoreResult{Data: user, NErr: err} close(uc1) }() go func() { user, err := a.Srv().Store.User().Get(otherUserId) - uc2 <- store.StoreResult{Data: user, Err: err} + uc2 <- store.StoreResult{Data: user, NErr: err} close(uc2) }() result := <-uc1 - if result.Err != nil { + if result.NErr != nil { return nil, model.NewAppError("CreateDirectChannel", "api.channel.create_direct_channel.invalid_user.app_error", nil, userId, http.StatusBadRequest) } user := result.Data.(*model.User) result = <-uc2 - if result.Err != nil { + if result.NErr != nil { return nil, model.NewAppError("CreateDirectChannel", "api.channel.create_direct_channel.invalid_user.app_error", nil, otherUserId, http.StatusBadRequest) } otherUser := result.Data.(*model.User) @@ -478,7 +489,7 @@ func (a *App) createGroupChannel(userIds []string, creatorId string) (*model.Cha users, err := a.Srv().Store.User().GetProfileByIds(userIds, nil, true) if err != nil { - return nil, err + return nil, model.NewAppError("createGroupChannel", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } if len(users) != len(userIds) { @@ -558,16 +569,16 @@ func (a *App) GetGroupChannel(userIds []string) (*model.Channel, *model.AppError users, err := a.Srv().Store.User().GetProfileByIds(userIds, nil, true) if err != nil { - return nil, err + return nil, model.NewAppError("GetGroupChannel", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } if len(users) != len(userIds) { return nil, model.NewAppError("GetGroupChannel", "api.channel.create_group.bad_user.app_error", nil, "user_ids="+model.ArrayToJson(userIds), http.StatusBadRequest) } - channel, err := a.GetChannelByName(model.GetGroupNameFromUserIds(userIds), "", true) - if err != nil { - return nil, err + channel, appErr := a.GetChannelByName(model.GetGroupNameFromUserIds(userIds), "", true) + if appErr != nil { + return nil, appErr } return channel, nil @@ -702,9 +713,15 @@ func (a *App) RestoreChannel(channel *model.Channel, userId string) (*model.Chan message.Add("channel_id", channel.Id) a.Publish(message) - user, err := a.Srv().Store.User().Get(userId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(userId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("RestoreChannel", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("RestoreChannel", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } if user != nil { @@ -1209,10 +1226,16 @@ func (a *App) DeleteChannel(channel *model.Channel, userId string) *model.AppErr var user *model.User if userId != "" { - var err *model.AppError - user, err = a.Srv().Store.User().Get(userId) - if err != nil { - return err + var nErr error + user, nErr = a.Srv().Store.User().Get(userId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return model.NewAppError("DeleteChannel", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("DeleteChannel", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } } @@ -1876,7 +1899,7 @@ func (a *App) JoinChannel(channel *model.Channel, userId string) *model.AppError memberChan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(userId) - userChan <- store.StoreResult{Data: user, Err: err} + userChan <- store.StoreResult{Data: user, NErr: err} close(userChan) }() go func() { @@ -1886,8 +1909,14 @@ func (a *App) JoinChannel(channel *model.Channel, userId string) *model.AppError }() uresult := <-userChan - if uresult.Err != nil { - return uresult.Err + if uresult.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(uresult.NErr, &nfErr): + return model.NewAppError("CreateChannel", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("CreateChannel", "app.user.get.app_error", nil, uresult.NErr.Error(), http.StatusInternalServerError) + } } mresult := <-memberChan @@ -1979,7 +2008,7 @@ func (a *App) LeaveChannel(channelId string, userId string) *model.AppError { uc := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(userId) - uc <- store.StoreResult{Data: user, Err: err} + uc <- store.StoreResult{Data: user, NErr: err} close(uc) }() @@ -2001,8 +2030,14 @@ func (a *App) LeaveChannel(channelId string, userId string) *model.AppError { } } uresult := <-uc - if uresult.Err != nil { - return uresult.Err + if uresult.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(uresult.NErr, &nfErr): + return model.NewAppError("LeaveChannel", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("LeaveChannel", "app.user.get.app_error", nil, uresult.NErr.Error(), http.StatusInternalServerError) + } } ccresult := <-mcc if ccresult.NErr != nil { @@ -2134,9 +2169,15 @@ func (a *App) postRemoveFromChannelMessage(removerUserId string, removedUser *mo } func (a *App) removeUserFromChannel(userIdToRemove string, removerUserId string, channel *model.Channel) *model.AppError { - user, err := a.Srv().Store.User().Get(userIdToRemove) - if err != nil { - return err + user, nErr := a.Srv().Store.User().Get(userIdToRemove) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return model.NewAppError("removeUserFromChannel", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("removeUserFromChannel", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } isGuest := user.IsGuest() diff --git a/app/channel_test.go b/app/channel_test.go index 965344a5f8..5013bd255a 100644 --- a/app/channel_test.go +++ b/app/channel_test.go @@ -1859,7 +1859,7 @@ func TestMarkChannelsAsViewedPanic(t *testing.T) { mockStore := th.App.Srv().Store.(*mocks.Store) mockUserStore := mocks.UserStore{} - mockUserStore.On("Get", "userID").Return(nil, model.NewAppError("SqlUserStore.Get", "store.sql_user.get.app_error", nil, "user_id=userID", http.StatusInternalServerError)) + mockUserStore.On("Get", "userID").Return(nil, model.NewAppError("SqlUserStore.Get", "app.user.get.app_error", nil, "user_id=userID", http.StatusInternalServerError)) mockChannelStore := mocks.ChannelStore{} mockChannelStore.On("Get", "channelID", true).Return(&model.Channel{}, nil) mockChannelStore.On("GetMember", "channelID", "userID").Return(&model.ChannelMember{ diff --git a/app/command.go b/app/command.go index 9bfeda8f2a..6c464709ea 100644 --- a/app/command.go +++ b/app/command.go @@ -231,28 +231,29 @@ func (a *App) MentionsToTeamMembers(message, teamId string) model.UserMentionMap wg.Add(1) go func(mention string) { defer wg.Done() - user, err := a.Srv().Store.User().GetByUsername(mention) + user, nErr := a.Srv().Store.User().GetByUsername(mention) - if err != nil && err.StatusCode != http.StatusNotFound { - mlog.Warn("Failed to retrieve user @"+mention, mlog.Err(err)) + var nfErr *store.ErrNotFound + if nErr != nil && !errors.As(nErr, &nfErr) { + mlog.Warn("Failed to retrieve user @"+mention, mlog.Err(nErr)) return } // If it's a http.StatusNotFound error, check for usernames in substrings // without trailing punctuation - if err != nil { + if nErr != nil { trimmed, ok := model.TrimUsernameSpecialChar(mention) for ; ok; trimmed, ok = model.TrimUsernameSpecialChar(trimmed) { - userFromTrimmed, userErr := a.Srv().Store.User().GetByUsername(trimmed) - if userErr != nil && err.StatusCode != http.StatusNotFound { + userFromTrimmed, nErr := a.Srv().Store.User().GetByUsername(trimmed) + if nErr != nil && !errors.As(nErr, &nfErr) { return } - if userErr != nil { + if nErr != nil { continue } - _, err = a.GetTeamMember(teamId, userFromTrimmed.Id) + _, err := a.GetTeamMember(teamId, userFromTrimmed.Id) if err != nil { // The user is not in the team, so we should ignore it return @@ -265,7 +266,7 @@ func (a *App) MentionsToTeamMembers(message, teamId string) model.UserMentionMap return } - _, err = a.GetTeamMember(teamId, user.Id) + _, err := a.GetTeamMember(teamId, user.Id) if err != nil { // The user is not in the team, so we should ignore it return @@ -367,7 +368,7 @@ func (a *App) tryExecuteCustomCommand(args *model.CommandArgs, trigger string, m userChan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(args.UserId) - userChan <- store.StoreResult{Data: user, Err: err} + userChan <- store.StoreResult{Data: user, NErr: err} close(userChan) }() @@ -389,8 +390,14 @@ func (a *App) tryExecuteCustomCommand(args *model.CommandArgs, trigger string, m team := tr.Data.(*model.Team) ur := <-userChan - if ur.Err != nil { - return nil, nil, ur.Err + if ur.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(ur.NErr, &nfErr): + return nil, nil, model.NewAppError("tryExecuteCustomCommand", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, nil, model.NewAppError("tryExecuteCustomCommand", "app.user.get.app_error", nil, ur.NErr.Error(), http.StatusInternalServerError) + } } user := ur.Data.(*model.User) diff --git a/app/config.go b/app/config.go index 29a84206c1..a43027b23d 100644 --- a/app/config.go +++ b/app/config.go @@ -247,9 +247,9 @@ func (s *Server) ensureInstallationDate() error { return nil } - installDate, appErr := s.Store.User().InferSystemInstallDate() + installDate, nErr := s.Store.User().InferSystemInstallDate() var installationDate int64 - if appErr == nil && installDate > 0 { + if nErr == nil && installDate > 0 { installationDate = installDate } else { installationDate = utils.MillisFromTime(time.Now()) diff --git a/app/constants.go b/app/constants.go index 4936c30909..65ddc1d98b 100644 --- a/app/constants.go +++ b/app/constants.go @@ -4,3 +4,5 @@ package app const MISSING_CHANNEL_MEMBER_ERROR = "app.channel.get_member.missing.app_error" +const MISSING_ACCOUNT_ERROR = "app.user.missing_account.const" +const MISSING_AUTH_ACCOUNT_ERROR = "app.user.get_by_auth.missing_account.app_error" diff --git a/app/export.go b/app/export.go index 3143857663..222f04d463 100644 --- a/app/export.go +++ b/app/export.go @@ -187,7 +187,7 @@ func (a *App) exportAllUsers(writer io.Writer) *model.AppError { users, err := a.Srv().Store.User().GetAllAfter(1000, afterId) if err != nil { - return err + return model.NewAppError("exportAllUsers", "app.user.get.app_error", nil, err.Error(), http.StatusInternalServerError) } if len(users) == 0 { @@ -412,11 +412,12 @@ func (a *App) BuildPostReactions(postId string) (*[]ReactionImportData, *model.A for _, reaction := range reactions { user, err := a.Srv().Store.User().Get(reaction.UserId) if err != nil { - if err.Id == store.MISSING_ACCOUNT_ERROR { // this is a valid case, the user that reacted might've been deleted by now + var nfErr *store.ErrNotFound + if errors.As(err, &nfErr) { // this is a valid case, the user that reacted might've been deleted by now mlog.Info("Skipping reactions by user since the entity doesn't exist anymore", mlog.String("user_id", reaction.UserId)) continue } - return nil, err + return nil, model.NewAppError("BuildPostReactions", "app.user.get.app_error", nil, err.Error(), http.StatusInternalServerError) } reactionsOfPost = append(reactionsOfPost, *ImportReactionFromPost(user, reaction)) } diff --git a/app/import_functions.go b/app/import_functions.go index 03582a34ed..ec1313207e 100644 --- a/app/import_functions.go +++ b/app/import_functions.go @@ -296,9 +296,9 @@ func (a *App) importUser(data *UserImportData, dryRun bool) *model.AppError { hasUserEmailVerifiedChanged := false var user *model.User - var err *model.AppError - user, err = a.Srv().Store.User().GetByUsername(*data.Username) - if err != nil { + var nErr error + user, nErr = a.Srv().Store.User().GetByUsername(*data.Username) + if nErr != nil { user = &model.User{} user.MakeNonNil() user.SetDefaultNotifications() @@ -475,6 +475,7 @@ func (a *App) importUser(data *UserImportData, dryRun bool) *model.AppError { } var savedUser *model.User + var err *model.AppError if user.Id == "" { if savedUser, err = a.createUser(user); err != nil { return err @@ -501,8 +502,14 @@ func (a *App) importUser(data *UserImportData, dryRun bool) *model.AppError { } } else { if hasUserAuthDataChanged { - if _, err = a.Srv().Store.User().UpdateAuthData(user.Id, authService, authData, user.Email, false); err != nil { - return err + if _, nErr := a.Srv().Store.User().UpdateAuthData(user.Id, authService, authData, user.Email, false); nErr != nil { + var invErr *store.ErrInvalidInput + switch { + case errors.As(nErr, &invErr): + return model.NewAppError("importUser", "app.user.update_auth_data.email_exists.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return model.NewAppError("importUser", "app.user.update_auth_data.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } } } @@ -976,15 +983,14 @@ func (a *App) importUserChannels(user *model.User, team *model.Team, teamMember } func (a *App) importReaction(data *ReactionImportData, post *model.Post, dryRun bool) *model.AppError { - var err *model.AppError - if err = validateReactionImportData(data, post.CreateAt); err != nil { + if err := validateReactionImportData(data, post.CreateAt); err != nil { return err } var user *model.User - user, err = a.Srv().Store.User().GetByUsername(*data.User) - if err != nil { - return model.NewAppError("BulkImport", "app.import.import_post.user_not_found.error", map[string]interface{}{"Username": data.User}, err.Error(), http.StatusBadRequest) + var nErr error + if user, nErr = a.Srv().Store.User().GetByUsername(*data.User); nErr != nil { + return model.NewAppError("BulkImport", "app.import.import_post.user_not_found.error", map[string]interface{}{"Username": data.User}, nErr.Error(), http.StatusBadRequest) } reaction := &model.Reaction{ @@ -993,7 +999,7 @@ func (a *App) importReaction(data *ReactionImportData, post *model.Post, dryRun EmojiName: *data.EmojiName, CreateAt: *data.CreateAt, } - if _, nErr := a.Srv().Store.Reaction().Save(reaction); nErr != nil { + if _, nErr = a.Srv().Store.Reaction().Save(reaction); nErr != nil { var appErr *model.AppError switch { case errors.As(nErr, &appErr): diff --git a/app/integration_action.go b/app/integration_action.go index b56adeb612..b05d52c3a6 100644 --- a/app/integration_action.go +++ b/app/integration_action.go @@ -85,7 +85,7 @@ func (a *App) DoPostActionWithCookie(postId, actionId, userId, selectedOption st userChan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(upstreamRequest.UserId) - userChan <- store.StoreResult{Data: user, Err: err} + userChan <- store.StoreResult{Data: user, NErr: err} close(userChan) }() @@ -188,8 +188,14 @@ func (a *App) DoPostActionWithCookie(postId, actionId, userId, selectedOption st }() ur := <-userChan - if ur.Err != nil { - return "", ur.Err + if ur.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(ur.NErr, &nfErr): + return "", model.NewAppError("DoPostActionWithCookie", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return "", model.NewAppError("DoPostActionWithCookie", "app.user.get.app_error", nil, ur.NErr.Error(), http.StatusInternalServerError) + } } user := ur.Data.(*model.User) upstreamRequest.UserName = user.Username diff --git a/app/license.go b/app/license.go index 016c5161b0..ef3674ae75 100644 --- a/app/license.go +++ b/app/license.go @@ -96,7 +96,7 @@ func (s *Server) SaveLicense(licenseBytes []byte) (*model.License, *model.AppErr case errors.As(nErr, &appErr): return nil, appErr default: - return nil, model.NewAppError("addLicense", "api.license.add_license.save.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("addLicense", "api.license.add_license.save.app_error", nil, nErr.Error(), http.StatusInternalServerError) } } diff --git a/app/login.go b/app/login.go index f992e32dc3..2cbfcaed70 100644 --- a/app/login.go +++ b/app/login.go @@ -125,7 +125,7 @@ func (a *App) GetUserForLogin(id, loginId string) (*model.User, *model.AppError) if len(id) != 0 { user, err := a.GetUser(id) if err != nil { - if err.Id != store.MISSING_ACCOUNT_ERROR { + if err.Id != MISSING_ACCOUNT_ERROR { err.StatusCode = http.StatusInternalServerError return nil, err } diff --git a/app/notification.go b/app/notification.go index eca1ae2fa2..52de649778 100644 --- a/app/notification.go +++ b/app/notification.go @@ -26,7 +26,7 @@ func (a *App) SendNotifications(post *model.Post, team *model.Team, channel *mod pchan := make(chan store.StoreResult, 1) go func() { props, err := a.Srv().Store.User().GetAllProfilesInChannel(channel.Id, true) - pchan <- store.StoreResult{Data: props, Err: err} + pchan <- store.StoreResult{Data: props, NErr: err} close(pchan) }() @@ -58,8 +58,8 @@ func (a *App) SendNotifications(post *model.Post, team *model.Team, channel *mod } result := <-pchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + return nil, result.NErr } profileMap := result.Data.(map[string]*model.User) @@ -504,9 +504,9 @@ func (a *App) filterOutOfChannelMentions(sender *model.User, post *model.Post, c // Filter out inactive users and bots allUsers := model.UserSlice(users).FilterByActive(true) allUsers = allUsers.FilterWithoutBots() - allUsers, err = a.FilterUsersByVisible(sender, allUsers) - if err != nil { - return nil, nil, err + allUsers, appErr := a.FilterUsersByVisible(sender, allUsers) + if appErr != nil { + return nil, nil, appErr } if len(allUsers) == 0 { diff --git a/app/notification_push.go b/app/notification_push.go index f80eee4aba..48e8c348b6 100644 --- a/app/notification_push.go +++ b/app/notification_push.go @@ -211,7 +211,7 @@ func (a *App) clearPushNotificationSync(currentSessionId, userId, channelId stri unreadCount, err := a.Srv().Store.User().GetUnreadCount(userId) if err != nil { - return err + return model.NewAppError("clearPushNotificationSync", "app.user.get_unread_count.app_error", nil, err.Error(), http.StatusInternalServerError) } msg.Badge = int(unreadCount) @@ -242,7 +242,7 @@ func (a *App) updateMobileAppBadgeSync(userId string) *model.AppError { unreadCount, err := a.Srv().Store.User().GetUnreadCount(userId) if err != nil { - return err + return model.NewAppError("updateMobileAppBadgeSync", "app.user.get_unread_count.app_error", nil, err.Error(), http.StatusInternalServerError) } msg.Badge = int(unreadCount) @@ -525,7 +525,7 @@ func (a *App) BuildPushNotificationMessage(contentsConfig string, post *model.Po unreadCount, err := a.Srv().Store.User().GetUnreadCount(user.Id) if err != nil { - return nil, err + return nil, model.NewAppError("BuildPushNotificationMessage", "app.user.get_unread_count.app_error", nil, err.Error(), http.StatusInternalServerError) } msg.Badge = int(unreadCount) diff --git a/app/oauth.go b/app/oauth.go index 637a9371a5..b0bf8d494b 100644 --- a/app/oauth.go +++ b/app/oauth.go @@ -269,6 +269,7 @@ func (a *App) GetOAuthAccessTokenForCodeFlow(clientId, grantType, redirectUri, c var accessData *model.AccessData var accessRsp *model.AccessResponse + var user *model.User if grantType == model.ACCESS_TOKEN_GRANT_TYPE { var authData *model.AuthData authData, nErr = a.Srv().Store.OAuth().GetAuthData(code) @@ -287,8 +288,8 @@ func (a *App) GetOAuthAccessTokenForCodeFlow(clientId, grantType, redirectUri, c return nil, model.NewAppError("GetOAuthAccessToken", "api.oauth.get_access_token.redirect_uri.app_error", nil, "", http.StatusBadRequest) } - user, err := a.Srv().Store.User().Get(authData.UserId) - if err != nil { + user, nErr = a.Srv().Store.User().Get(authData.UserId) + if nErr != nil { return nil, model.NewAppError("GetOAuthAccessToken", "api.oauth.get_access_token.internal_user.app_error", nil, "", http.StatusNotFound) } @@ -300,7 +301,7 @@ func (a *App) GetOAuthAccessTokenForCodeFlow(clientId, grantType, redirectUri, c if accessData != nil { if accessData.IsExpired() { var access *model.AccessResponse - access, err = a.newSessionUpdateToken(oauthApp.Name, accessData, user) + access, err := a.newSessionUpdateToken(oauthApp.Name, accessData, user) if err != nil { return nil, err } @@ -317,7 +318,7 @@ func (a *App) GetOAuthAccessTokenForCodeFlow(clientId, grantType, redirectUri, c } else { var session *model.Session // Create a new session and return new access token - session, err = a.newSession(oauthApp.Name, user) + session, err := a.newSession(oauthApp.Name, user) if err != nil { return nil, err } @@ -347,8 +348,8 @@ func (a *App) GetOAuthAccessTokenForCodeFlow(clientId, grantType, redirectUri, c return nil, model.NewAppError("GetOAuthAccessToken", "api.oauth.get_access_token.refresh_token.app_error", nil, "", http.StatusNotFound) } - user, err := a.Srv().Store.User().Get(accessData.UserId) - if err != nil { + user, nErr := a.Srv().Store.User().Get(accessData.UserId) + if nErr != nil { return nil, model.NewAppError("GetOAuthAccessToken", "api.oauth.get_access_token.internal_user.app_error", nil, "", http.StatusNotFound) } @@ -587,7 +588,7 @@ func (a *App) LoginByOAuth(service string, userData io.Reader, teamId string) (* } user, err := a.GetUserByAuth(model.NewString(*authUser.AuthData), service) if err != nil { - if err.Id == store.MISSING_AUTH_ACCOUNT_ERROR { + if err.Id == MISSING_AUTH_ACCOUNT_ERROR { user, err = a.CreateOAuthUser(service, bytes.NewReader(buf.Bytes()), teamId) } else { return nil, err @@ -637,21 +638,27 @@ func (a *App) CompleteSwitchWithOAuth(service string, userData io.Reader, email map[string]interface{}{"Service": service}, "", http.StatusBadRequest) } - user, err := a.Srv().Store.User().GetByEmail(email) - if err != nil { + user, nErr := a.Srv().Store.User().GetByEmail(email) + if nErr != nil { + return nil, model.NewAppError("CompleteSwitchWithOAuth", MISSING_ACCOUNT_ERROR, nil, nErr.Error(), http.StatusInternalServerError) + } + + if err := a.RevokeAllSessions(user.Id); err != nil { return nil, err } - if err = a.RevokeAllSessions(user.Id); err != nil { - return nil, err - } - - if _, err = a.Srv().Store.User().UpdateAuthData(user.Id, service, model.NewString(*ssoUser.AuthData), ssoUser.Email, true); err != nil { - return nil, err + if _, nErr := a.Srv().Store.User().UpdateAuthData(user.Id, service, ssoUser.AuthData, ssoUser.Email, true); nErr != nil { + var invErr *store.ErrInvalidInput + switch { + case errors.As(nErr, &invErr): + return nil, model.NewAppError("importUser", "app.user.update_auth_data.email_exists.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("importUser", "app.user.update_auth_data.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } a.Srv().Go(func() { - if err = a.Srv().EmailService.SendSignInChangeEmail(user.Email, strings.Title(service)+" SSO", user.Locale, a.GetSiteURL()); err != nil { + if err := a.Srv().EmailService.SendSignInChangeEmail(user.Email, strings.Title(service)+" SSO", user.Locale, a.GetSiteURL()); err != nil { mlog.Error("error sending signin change email", mlog.Err(err)) } }) diff --git a/app/permissions.go b/app/permissions.go index 300f4327d5..fbcafa0b92 100644 --- a/app/permissions.go +++ b/app/permissions.go @@ -30,7 +30,7 @@ func (a *App) ResetPermissionsSystem() *model.AppError { // Reset all Custom Role assignments to Users. if err := a.Srv().Store.User().ClearAllCustomRoleAssignments(); err != nil { - return err + return model.NewAppError("ResetPermissionsSystem", "app.user.clear_all_custom_role_assignments.select.app_error", nil, err.Error(), http.StatusInternalServerError) } // Reset all Custom Role assignments to TeamMembers. diff --git a/app/post.go b/app/post.go index c24b2857f6..a2ccb7824e 100644 --- a/app/post.go +++ b/app/post.go @@ -53,9 +53,15 @@ func (a *App) CreatePostAsUser(post *model.Post, currentSessionId string, setOnl } if err.Id == "api.post.create_post.town_square_read_only" { - user, userErr := a.Srv().Store.User().Get(post.UserId) - if userErr != nil { - return nil, userErr + user, nErr := a.Srv().Store.User().Get(post.UserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("CreatePostAsUser", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("CreatePostAsUser", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } T := utils.GetUserTranslations(user.Locale) @@ -185,9 +191,15 @@ func (a *App) CreatePost(post *model.Post, channel *model.Channel, triggerWebhoo }() } - user, err := a.Srv().Store.User().Get(post.UserId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(post.UserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("CreatePost", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("CreatePost", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } if user.IsBot { diff --git a/app/product_notices.go b/app/product_notices.go index eaa437ace2..42fc2afb69 100644 --- a/app/product_notices.go +++ b/app/product_notices.go @@ -16,10 +16,10 @@ import ( "github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/store" "github.com/mattermost/mattermost-server/v5/utils" - "github.com/pkg/errors" "github.com/Masterminds/semver/v3" - date_constraints "github.com/reflog/dateconstraints" + "github.com/pkg/errors" + "github.com/reflog/dateconstraints" ) const MAX_REPEAT_VIEWINGS = 3 @@ -301,16 +301,15 @@ func (a *App) UpdateProductNotices() *model.AppError { url := *a.Srv().Config().AnnouncementSettings.NoticesURL skip := *a.Srv().Config().AnnouncementSettings.NoticesSkipCache mlog.Debug("Will fetch notices from", mlog.String("url", url), mlog.Bool("skip_cache", skip)) - var appErr *model.AppError var err error cachedPostCount, err = a.Srv().Store.Post().AnalyticsPostCount("", false, false) if err != nil { mlog.Error("Failed to fetch post count", mlog.String("error", err.Error())) } - cachedUserCount, appErr = a.Srv().Store.User().Count(model.UserCountOptions{IncludeDeleted: true}) - if appErr != nil { - mlog.Error("Failed to fetch user count", mlog.String("error", appErr.Error())) + cachedUserCount, err = a.Srv().Store.User().Count(model.UserCountOptions{IncludeDeleted: true}) + if err != nil { + mlog.Error("Failed to fetch user count", mlog.String("error", err.Error())) } data, err := utils.GetUrlWithCache(url, ¬icesCache, skip) diff --git a/app/session.go b/app/session.go index d3e9d3139c..48e127172f 100644 --- a/app/session.go +++ b/app/session.go @@ -399,9 +399,15 @@ func (a *App) SetSessionExpireInDays(session *model.Session, days int) { func (a *App) CreateUserAccessToken(token *model.UserAccessToken) (*model.UserAccessToken, *model.AppError) { - user, err := a.Srv().Store.User().Get(token.UserId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(token.UserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("CreateUserAccessToken", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("CreateUserAccessToken", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } if !*a.Config().ServiceSettings.EnableUserAccessTokens && !user.IsBot { @@ -410,14 +416,14 @@ func (a *App) CreateUserAccessToken(token *model.UserAccessToken) (*model.UserAc token.Token = model.NewId() - token, nErr := a.Srv().Store.UserAccessToken().Save(token) + token, nErr = a.Srv().Store.UserAccessToken().Save(token) if nErr != nil { var appErr *model.AppError switch { case errors.As(nErr, &appErr): return nil, appErr default: - return nil, model.NewAppError("CreateUserAccessToken", "app.user_access_token.save.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, model.NewAppError("CreateUserAccessToken", "app.user_access_token.save.app_error", nil, nErr.Error(), http.StatusInternalServerError) } } @@ -442,9 +448,15 @@ func (a *App) createSessionForUserAccessToken(tokenString string) (*model.Sessio return nil, model.NewAppError("createSessionForUserAccessToken", "app.user_access_token.invalid_or_missing", nil, "inactive_token", http.StatusUnauthorized) } - user, err := a.Srv().Store.User().Get(token.UserId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(token.UserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("createSessionForUserAccessToken", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("createSessionForUserAccessToken", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } if !*a.Config().ServiceSettings.EnableUserAccessTokens && !user.IsBot { diff --git a/app/slashcommands/auto_users.go b/app/slashcommands/auto_users.go index c7560b374c..9908dee7e1 100644 --- a/app/slashcommands/auto_users.go +++ b/app/slashcommands/auto_users.go @@ -56,7 +56,7 @@ func CreateBasicUser(a *app.App, client *model.Client4) *model.AppError { } _, err := a.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email) if err != nil { - return err + return model.NewAppError("CreateBasicUser", "app.user.verify_email.app_error", nil, err.Error(), http.StatusInternalServerError) } if _, nErr := a.Srv().Store.Team().SaveMember(&model.TeamMember{TeamId: basicteam.Id, UserId: ruser.Id}, *a.Config().TeamSettings.MaxUsersPerTeam); nErr != nil { var appErr *model.AppError diff --git a/app/slashcommands/command_groupmsg.go b/app/slashcommands/command_groupmsg.go index c1cd93f782..449655e04f 100644 --- a/app/slashcommands/command_groupmsg.go +++ b/app/slashcommands/command_groupmsg.go @@ -48,8 +48,8 @@ func (me *groupmsgProvider) DoCommand(a *app.App, args *model.CommandArgs, messa for _, username := range users { username = strings.TrimSpace(username) username = strings.TrimPrefix(username, "@") - targetUser, err := a.Srv().Store.User().GetByUsername(username) - if err != nil { + targetUser, nErr := a.Srv().Store.User().GetByUsername(username) + if nErr != nil { invalidUsernames = append(invalidUsernames, username) continue } diff --git a/app/slashcommands/command_invite.go b/app/slashcommands/command_invite.go index bb68efd350..31cdc60db1 100644 --- a/app/slashcommands/command_invite.go +++ b/app/slashcommands/command_invite.go @@ -50,9 +50,9 @@ func (me *InviteProvider) DoCommand(a *app.App, args *model.CommandArgs, message targetUsername := splitMessage[0] targetUsername = strings.TrimPrefix(targetUsername, "@") - userProfile, err := a.Srv().Store.User().GetByUsername(targetUsername) - if err != nil { - mlog.Error(err.Error()) + userProfile, nErr := a.Srv().Store.User().GetByUsername(targetUsername) + if nErr != nil { + mlog.Error(nErr.Error()) return &model.CommandResponse{ Text: args.T("api.command_invite.missing_user.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, @@ -67,6 +67,7 @@ func (me *InviteProvider) DoCommand(a *app.App, args *model.CommandArgs, message } var channelToJoin *model.Channel + var err *model.AppError // User set a channel to add the invited user if len(splitMessage) > 1 && splitMessage[1] != "" { targetChannelName := strings.TrimPrefix(strings.TrimSpace(splitMessage[1]), "~") diff --git a/app/slashcommands/command_msg.go b/app/slashcommands/command_msg.go index 46ce7ffcaf..671927a90e 100644 --- a/app/slashcommands/command_msg.go +++ b/app/slashcommands/command_msg.go @@ -51,9 +51,9 @@ func (me *msgProvider) DoCommand(a *app.App, args *model.CommandArgs, message st targetUsername = strings.SplitN(message, " ", 2)[0] targetUsername = strings.TrimPrefix(targetUsername, "@") - userProfile, err := a.Srv().Store.User().GetByUsername(targetUsername) - if err != nil { - mlog.Error(err.Error()) + userProfile, nErr := a.Srv().Store.User().GetByUsername(targetUsername) + if nErr != nil { + mlog.Error(nErr.Error()) return &model.CommandResponse{Text: args.T("api.command_msg.missing.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} } diff --git a/app/slashcommands/command_remove.go b/app/slashcommands/command_remove.go index 724998095d..7545a2d16b 100644 --- a/app/slashcommands/command_remove.go +++ b/app/slashcommands/command_remove.go @@ -108,9 +108,9 @@ func doCommand(a *app.App, args *model.CommandArgs, message string) *model.Comma targetUsername = strings.SplitN(message, " ", 2)[0] targetUsername = strings.TrimPrefix(targetUsername, "@") - userProfile, err := a.Srv().Store.User().GetByUsername(targetUsername) - if err != nil { - mlog.Error(err.Error()) + userProfile, nErr := a.Srv().Store.User().GetByUsername(targetUsername) + if nErr != nil { + mlog.Error(nErr.Error()) return &model.CommandResponse{ Text: args.T("api.command_remove.missing.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, diff --git a/app/team.go b/app/team.go index bf4043c906..9782ecd67c 100644 --- a/app/team.go +++ b/app/team.go @@ -488,7 +488,7 @@ func (a *App) AddUserToTeam(teamId string, userId string, userRequestorId string uchan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(userId) - uchan <- store.StoreResult{Data: user, Err: err} + uchan <- store.StoreResult{Data: user, NErr: err} close(uchan) }() @@ -505,8 +505,14 @@ func (a *App) AddUserToTeam(teamId string, userId string, userRequestorId string team := result.Data.(*model.Team) result = <-uchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(result.NErr, &nfErr): + return nil, model.NewAppError("AddUserToTeam", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("AddUserToTeam", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) + } } user := result.Data.(*model.User) @@ -559,7 +565,7 @@ func (a *App) AddUserToTeamByToken(userId string, tokenId string) (*model.Team, uchan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(userId) - uchan <- store.StoreResult{Data: user, Err: err} + uchan <- store.StoreResult{Data: user, NErr: err} close(uchan) }() @@ -580,8 +586,14 @@ func (a *App) AddUserToTeamByToken(userId string, tokenId string) (*model.Team, } result = <-uchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(result.NErr, &nfErr): + return nil, model.NewAppError("AddUserToTeamByToken", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("AddUserToTeamByToken", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) + } } user := result.Data.(*model.User) @@ -628,7 +640,7 @@ func (a *App) AddUserToTeamByInviteId(inviteId string, userId string) (*model.Te uchan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(userId) - uchan <- store.StoreResult{Data: user, Err: err} + uchan <- store.StoreResult{Data: user, NErr: err} close(uchan) }() @@ -645,8 +657,14 @@ func (a *App) AddUserToTeamByInviteId(inviteId string, userId string) (*model.Te team := result.Data.(*model.Team) result = <-uchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(result.NErr, &nfErr): + return nil, model.NewAppError("AddUserToTeamByInviteId", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("AddUserToTeamByInviteId", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) + } } user := result.Data.(*model.User) @@ -760,7 +778,7 @@ func (a *App) JoinUserToTeam(team *model.Team, user *model.User, userRequestorId } if _, err := a.Srv().Store.User().UpdateUpdateAt(user.Id); err != nil { - return err + return model.NewAppError("JoinUserToTeam", "app.user.update_update.app_error", nil, err.Error(), http.StatusInternalServerError) } if err := a.createInitialSidebarCategories(user.Id, team.Id); err != nil { @@ -1144,7 +1162,7 @@ func (a *App) RemoveUserFromTeam(teamId string, userId string, requestorId strin uchan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(userId) - uchan <- store.StoreResult{Data: user, Err: err} + uchan <- store.StoreResult{Data: user, NErr: err} close(uchan) }() @@ -1161,8 +1179,14 @@ func (a *App) RemoveUserFromTeam(teamId string, userId string, requestorId strin team := result.Data.(*model.Team) result = <-uchan - if result.Err != nil { - return result.Err + if result.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(result.NErr, &nfErr): + return model.NewAppError("RemoveUserFromTeam", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("RemoveUserFromTeam", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) + } } user := result.Data.(*model.User) @@ -1180,9 +1204,15 @@ func (a *App) RemoveTeamMemberFromTeam(teamMember *model.TeamMember, requestorId message.Add("team_id", teamMember.TeamId) a.Publish(message) - user, err := a.Srv().Store.User().Get(teamMember.UserId) - if err != nil { - return err + user, nErr := a.Srv().Store.User().Get(teamMember.UserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return model.NewAppError("RemoveTeamMemberFromTeam", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("RemoveTeamMemberFromTeam", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } teamMember.Roles = "" @@ -1214,7 +1244,7 @@ func (a *App) RemoveTeamMemberFromTeam(teamMember *model.TeamMember, requestorId } if _, err := a.Srv().Store.User().UpdateUpdateAt(user.Id); err != nil { - return err + return model.NewAppError("RemoveTeamMemberFromTeam", "app.user.update_update.app_error", nil, err.Error(), http.StatusInternalServerError) } if err := a.Srv().Store.Channel().ClearSidebarOnTeamLeave(user.Id, teamMember.TeamId); err != nil { @@ -1337,7 +1367,7 @@ func (a *App) prepareInviteNewUsersToTeam(teamId, senderId string) (*model.User, uchan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(senderId) - uchan <- store.StoreResult{Data: user, Err: err} + uchan <- store.StoreResult{Data: user, NErr: err} close(uchan) }() @@ -1354,8 +1384,14 @@ func (a *App) prepareInviteNewUsersToTeam(teamId, senderId string) (*model.User, team := result.Data.(*model.Team) result = <-uchan - if result.Err != nil { - return nil, nil, result.Err + if result.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(result.NErr, &nfErr): + return nil, nil, model.NewAppError("prepareInviteNewUsersToTeam", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, nil, model.NewAppError("prepareInviteNewUsersToTeam", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) + } } user := result.Data.(*model.User) return user, team, nil @@ -1462,7 +1498,7 @@ func (a *App) prepareInviteGuestsToChannels(teamId string, guestsInvite *model.G uchan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(senderId) - uchan <- store.StoreResult{Data: user, Err: err} + uchan <- store.StoreResult{Data: user, NErr: err} close(uchan) }() @@ -1473,8 +1509,14 @@ func (a *App) prepareInviteGuestsToChannels(teamId string, guestsInvite *model.G channels := result.Data.([]*model.Channel) result = <-uchan - if result.Err != nil { - return nil, nil, nil, result.Err + if result.NErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(result.NErr, &nfErr): + return nil, nil, nil, model.NewAppError("prepareInviteGuestsToChannels", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, nil, nil, model.NewAppError("prepareInviteGuestsToChannels", "app.user.get.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) + } } user := result.Data.(*model.User) diff --git a/app/user.go b/app/user.go index 3532b31cec..2c3539d920 100644 --- a/app/user.go +++ b/app/user.go @@ -258,7 +258,7 @@ func (a *App) createUserOrGuest(user *model.User, guest bool) (*model.User, *mod // system is granted the system_admin role count, err := a.Srv().Store.User().Count(model.UserCountOptions{IncludeDeleted: true}) if err != nil { - return nil, err + return nil, model.NewAppError("createUserOrGuest", "app.user.get_total_users_count.app_error", nil, err.Error(), http.StatusInternalServerError) } if count <= 0 { user.Roles = model.SYSTEM_ADMIN_ROLE_ID + " " + model.SYSTEM_USER_ROLE_ID @@ -268,9 +268,9 @@ func (a *App) createUserOrGuest(user *model.User, guest bool) (*model.User, *mod user.Locale = *a.Config().LocalizationSettings.DefaultClientLocale } - ruser, err := a.createUser(user) - if err != nil { - return nil, err + ruser, appErr := a.createUser(user) + if appErr != nil { + return nil, appErr } // This message goes to everyone, so the teamId, channelId and userId are irrelevant message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_NEW_USER, "", "", "", nil) @@ -297,10 +297,19 @@ func (a *App) createUser(user *model.User) (*model.User, *model.AppError) { return nil, err } - ruser, err := a.Srv().Store.User().Save(user) - if err != nil { - mlog.Error("Couldn't save the user", mlog.Err(err)) - return nil, err + ruser, nErr := a.Srv().Store.User().Save(user) + if nErr != nil { + mlog.Error("Couldn't save the user", mlog.Err(nErr)) + var appErr *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(nErr, &appErr): + return nil, appErr + case errors.As(nErr, &invErr): + return nil, model.NewAppError("createUser", "app.user.save.existing.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("createUser", "app.user.save.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } if user.EmailVerified { @@ -337,12 +346,12 @@ func (a *App) CreateOAuthUser(service string, userData io.Reader, teamId string) euchan := make(chan store.StoreResult, 1) go func() { userByAuth, err := a.Srv().Store.User().GetByAuth(user.AuthData, service) - suchan <- store.StoreResult{Data: userByAuth, Err: err} + suchan <- store.StoreResult{Data: userByAuth, NErr: err} close(suchan) }() go func() { userByEmail, err := a.Srv().Store.User().GetByEmail(user.Email) - euchan <- store.StoreResult{Data: userByEmail, Err: err} + euchan <- store.StoreResult{Data: userByEmail, NErr: err} close(euchan) }() @@ -355,11 +364,11 @@ func (a *App) CreateOAuthUser(service string, userData io.Reader, teamId string) } } - if result := <-suchan; result.Err == nil { + if result := <-suchan; result.NErr == nil { return result.Data.(*model.User), nil } - if result := <-euchan; result.Err == nil { + if result := <-euchan; result.NErr == nil { authService := result.Data.(*model.User).AuthService if authService == "" { return nil, model.NewAppError("CreateOAuthUser", "api.user.create_oauth_user.already_attached.app_error", map[string]interface{}{"Service": service, "Auth": model.USER_AUTH_SERVICE_EMAIL}, "email="+user.Email, http.StatusBadRequest) @@ -425,14 +434,30 @@ func (a *App) IsUsernameTaken(name string) bool { } func (a *App) GetUser(userId string) (*model.User, *model.AppError) { - return a.Srv().Store.User().Get(userId) + user, err := a.Srv().Store.User().Get(userId) + if err != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(err, &nfErr): + return nil, model.NewAppError("GetUser", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("GetUser", "app.user.get.app_error", nil, err.Error(), http.StatusInternalServerError) + } + } + + return user, nil } func (a *App) GetUserByUsername(username string) (*model.User, *model.AppError) { result, err := a.Srv().Store.User().GetByUsername(username) - if err != nil && err.Id == "store.sql_user.get_by_username.app_error" { - err.StatusCode = http.StatusNotFound - return nil, err + if err != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(err, &nfErr): + return nil, model.NewAppError("GetUserByUsername", "app.user.get_by_username.app_error", nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("GetUserByUsername", "app.user.get_by_username.app_error", nil, err.Error(), http.StatusInternalServerError) + } } return result, nil } @@ -440,22 +465,42 @@ func (a *App) GetUserByUsername(username string) (*model.User, *model.AppError) func (a *App) GetUserByEmail(email string) (*model.User, *model.AppError) { user, err := a.Srv().Store.User().GetByEmail(email) if err != nil { - if err.Id == "store.sql_user.missing_account.const" { - err.StatusCode = http.StatusNotFound - return nil, err + var nfErr *store.ErrNotFound + switch { + case errors.As(err, &nfErr): + return nil, model.NewAppError("GetUserByEmail", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("GetUserByEmail", MISSING_ACCOUNT_ERROR, nil, err.Error(), http.StatusInternalServerError) } - err.StatusCode = http.StatusBadRequest - return nil, err } return user, nil } func (a *App) GetUserByAuth(authData *string, authService string) (*model.User, *model.AppError) { - return a.Srv().Store.User().GetByAuth(authData, authService) + user, err := a.Srv().Store.User().GetByAuth(authData, authService) + if err != nil { + var invErr *store.ErrInvalidInput + var nfErr *store.ErrNotFound + switch { + case errors.As(err, &invErr): + return nil, model.NewAppError("GetUserByAuth", MISSING_AUTH_ACCOUNT_ERROR, nil, invErr.Error(), http.StatusBadRequest) + case errors.As(err, &nfErr): + return nil, model.NewAppError("GetUserByAuth", MISSING_AUTH_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusInternalServerError) + default: + return nil, model.NewAppError("GetUserByAuth", "app.user.get_by_auth.other.app_error", nil, err.Error(), http.StatusInternalServerError) + } + } + + return user, nil } func (a *App) GetUsers(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetAllProfiles(options) + users, err := a.Srv().Store.User().GetAllProfiles(options) + if err != nil { + return nil, model.NewAppError("GetUsers", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } func (a *App) GetUsersPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) { @@ -472,11 +517,21 @@ func (a *App) GetUsersEtag(restrictionsHash string) string { } func (a *App) GetUsersInTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetProfiles(options) + users, err := a.Srv().Store.User().GetProfiles(options) + if err != nil { + return nil, model.NewAppError("GetUsersInTeam", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } func (a *App) GetUsersNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetProfilesNotInTeam(teamId, groupConstrained, offset, limit, viewRestrictions) + users, err := a.Srv().Store.User().GetProfilesNotInTeam(teamId, groupConstrained, offset, limit, viewRestrictions) + if err != nil { + return nil, model.NewAppError("GetUsersNotInTeam", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } func (a *App) GetUsersInTeamPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) { @@ -506,11 +561,21 @@ func (a *App) GetUsersNotInTeamEtag(teamId string, restrictionsHash string) stri } func (a *App) GetUsersInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetProfilesInChannel(options) + users, err := a.Srv().Store.User().GetProfilesInChannel(options) + if err != nil { + return nil, model.NewAppError("GetUsersInChannel", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } func (a *App) GetUsersInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetProfilesInChannelByStatus(options) + users, err := a.Srv().Store.User().GetProfilesInChannelByStatus(options) + if err != nil { + return nil, model.NewAppError("GetUsersInChannelByStatus", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } func (a *App) GetUsersInChannelMap(options *model.UserGetOptions, asAdmin bool) (map[string]*model.User, *model.AppError) { @@ -546,7 +611,12 @@ func (a *App) GetUsersInChannelPageByStatus(options *model.UserGetOptions, asAdm } func (a *App) GetUsersNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetProfilesNotInChannel(teamId, channelId, groupConstrained, offset, limit, viewRestrictions) + users, err := a.Srv().Store.User().GetProfilesNotInChannel(teamId, channelId, groupConstrained, offset, limit, viewRestrictions) + if err != nil { + return nil, model.NewAppError("GetUsersNotInChannel", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } func (a *App) GetUsersNotInChannelMap(teamId string, channelId string, groupConstrained bool, offset int, limit int, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) (map[string]*model.User, *model.AppError) { @@ -584,17 +654,32 @@ func (a *App) GetUsersWithoutTeamPage(options *model.UserGetOptions, asAdmin boo } func (a *App) GetUsersWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetProfilesWithoutTeam(options) + users, err := a.Srv().Store.User().GetProfilesWithoutTeam(options) + if err != nil { + return nil, model.NewAppError("GetUsersWithoutTeam", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } // GetTeamGroupUsers returns the users who are associated to the team via GroupTeams and GroupMembers. func (a *App) GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetTeamGroupUsers(teamID) + users, err := a.Srv().Store.User().GetTeamGroupUsers(teamID) + if err != nil { + return nil, model.NewAppError("GetTeamGroupUsers", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } // GetChannelGroupUsers returns the users who are associated to the channel via GroupChannels and GroupMembers. func (a *App) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) { - return a.Srv().Store.User().GetChannelGroupUsers(channelID) + users, err := a.Srv().Store.User().GetChannelGroupUsers(channelID) + if err != nil { + return nil, model.NewAppError("GetChannelGroupUsers", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } func (a *App) GetUsersByIds(userIds []string, options *store.UserGetByIdsOpts) ([]*model.User, *model.AppError) { @@ -602,7 +687,7 @@ func (a *App) GetUsersByIds(userIds []string, options *store.UserGetByIdsOpts) ( users, err := a.Srv().Store.User().GetProfileByIds(userIds, options, allowFromCache) if err != nil { - return nil, err + return nil, model.NewAppError("GetUsersByIds", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } return a.sanitizeProfiles(users, options.IsAdmin), nil @@ -611,7 +696,7 @@ func (a *App) GetUsersByIds(userIds []string, options *store.UserGetByIdsOpts) ( func (a *App) GetUsersByGroupChannelIds(channelIds []string, asAdmin bool) (map[string][]*model.User, *model.AppError) { usersByChannelId, err := a.Srv().Store.User().GetProfileByGroupChannelIdsForUser(a.Session().UserId, channelIds) if err != nil { - return nil, err + return nil, model.NewAppError("GetUsersByGroupChannelIds", "app.user.get_profile_by_group_channel_ids_for_user.app_error", nil, err.Error(), http.StatusInternalServerError) } for channelId, userList := range usersByChannelId { usersByChannelId[channelId] = a.sanitizeProfiles(userList, asAdmin) @@ -623,7 +708,7 @@ func (a *App) GetUsersByGroupChannelIds(channelIds []string, asAdmin bool) (map[ func (a *App) GetUsersByUsernames(usernames []string, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { users, err := a.Srv().Store.User().GetProfilesByUsernames(usernames, viewRestrictions) if err != nil { - return nil, err + return nil, model.NewAppError("GetUsersByUsernames", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } return a.sanitizeProfiles(users, asAdmin), nil } @@ -658,7 +743,13 @@ func (a *App) GenerateMfaSecret(userId string) (*model.MfaSecret, *model.AppErro func (a *App) ActivateMfa(userId, token string) *model.AppError { user, err := a.Srv().Store.User().Get(userId) if err != nil { - return err + var nfErr *store.ErrNotFound + switch { + case errors.As(err, &nfErr): + return model.NewAppError("ActivateMfa", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return model.NewAppError("ActivateMfa", "app.user.get.app_error", nil, err.Error(), http.StatusInternalServerError) + } } if len(user.AuthService) > 0 && user.AuthService != model.USER_AUTH_SERVICE_LDAP { @@ -1003,7 +1094,16 @@ func (a *App) UpdateActive(user *model.User, active bool) (*model.User, *model.A userUpdate, err := a.Srv().Store.User().Update(user, true) if err != nil { - return nil, err + var appErr *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(err, &appErr): + return nil, appErr + case errors.As(err, &invErr): + return nil, model.NewAppError("UpdateActive", "app.user.update.find.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("UpdateActive", "app.user.update.finding.app_error", nil, err.Error(), http.StatusInternalServerError) + } } ruser := userUpdate.New @@ -1024,7 +1124,7 @@ func (a *App) UpdateActive(user *model.User, active bool) (*model.User, *model.A func (a *App) DeactivateGuests() *model.AppError { userIds, err := a.Srv().Store.User().DeactivateGuests() if err != nil { - return err + return model.NewAppError("DeactivateGuests", "app.user.update_active_for_multiple_users.updating.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, userId := range userIds { @@ -1098,13 +1198,19 @@ func (a *App) UpdateUserAuth(userId string, userAuth *model.UserAuth) (*model.Us password := model.HashPassword(userAuth.Password) if err := a.Srv().Store.User().UpdatePassword(userId, password); err != nil { - return nil, err + return nil, model.NewAppError("UpdateUserAuth", "app.user.update_password.app_error", nil, err.Error(), http.StatusInternalServerError) } } else { userAuth.Password = "" if _, err := a.Srv().Store.User().UpdateAuthData(userId, userAuth.AuthService, userAuth.AuthData, "", false); err != nil { - return nil, err + var invErr *store.ErrInvalidInput + switch { + case errors.As(err, &invErr): + return nil, model.NewAppError("UpdateUserAuth", "app.user.update_auth_data.email_exists.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("UpdateUserAuth", "app.user.update_auth_data.app_error", nil, err.Error(), http.StatusInternalServerError) + } } } @@ -1129,7 +1235,13 @@ func (a *App) sendUpdatedUserEvent(user model.User) { func (a *App) UpdateUser(user *model.User, sendNotifications bool) (*model.User, *model.AppError) { prev, err := a.Srv().Store.User().Get(user.Id) if err != nil { - return nil, err + var nfErr *store.ErrNotFound + switch { + case errors.As(err, &nfErr): + return nil, model.NewAppError("UpdateUser", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("UpdateUser", "app.user.get.app_error", nil, err.Error(), http.StatusInternalServerError) + } } if !CheckUserDomain(user, *a.Config().TeamSettings.RestrictCreationToDomains) { @@ -1150,8 +1262,8 @@ func (a *App) UpdateUser(user *model.User, sendNotifications bool) (*model.User, if *a.Config().EmailSettings.RequireEmailVerification && prev.Email != user.Email { newEmail = user.Email - _, err = a.GetUserByEmail(newEmail) - if err == nil { + _, appErr := a.GetUserByEmail(newEmail) + if appErr == nil { return nil, model.NewAppError("UpdateUser", "store.sql_user.update.email_taken.app_error", nil, "user_id="+user.Id, http.StatusBadRequest) } @@ -1166,7 +1278,16 @@ func (a *App) UpdateUser(user *model.User, sendNotifications bool) (*model.User, userUpdate, err := a.Srv().Store.User().Update(user, false) if err != nil { - return nil, err + var appErr *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(err, &appErr): + return nil, appErr + case errors.As(err, &invErr): + return nil, model.NewAppError("UpdateUser", "app.user.update.find.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("UpdateUser", "app.user.update.finding.app_error", nil, err.Error(), http.StatusInternalServerError) + } } if sendNotifications { @@ -1440,7 +1561,7 @@ func (a *App) UpdateUserRoles(userId string, newRoles string, sendWebSocketEvent uchan := make(chan store.StoreResult, 1) go func() { userUpdate, err := a.Srv().Store.User().Update(user, true) - uchan <- store.StoreResult{Data: userUpdate, Err: err} + uchan <- store.StoreResult{Data: userUpdate, NErr: err} close(uchan) }() @@ -1452,8 +1573,17 @@ func (a *App) UpdateUserRoles(userId string, newRoles string, sendWebSocketEvent }() result := <-uchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + var appErr *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(result.NErr, &appErr): + return nil, appErr + case errors.As(result.NErr, &invErr): + return nil, model.NewAppError("UpdateUserRoles", "app.user.update.find.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return nil, model.NewAppError("UpdateUserRoles", "app.user.update.finding.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) + } } ruser := result.Data.(*model.UserUpdate).New @@ -1572,7 +1702,7 @@ func (a *App) PermanentDeleteUser(user *model.User) *model.AppError { } if err := a.Srv().Store.User().PermanentDelete(user.Id); err != nil { - return err + return model.NewAppError("PermanentDeleteUser", "app.user.permanent_delete.app_error", nil, err.Error(), http.StatusInternalServerError) } if err := a.Srv().Store.Audit().PermanentDeleteByUser(user.Id); err != nil { @@ -1591,7 +1721,7 @@ func (a *App) PermanentDeleteUser(user *model.User) *model.AppError { func (a *App) PermanentDeleteAllUsers() *model.AppError { users, err := a.Srv().Store.User().GetAll() if err != nil { - return err + return model.NewAppError("PermanentDeleteAllUsers", "app.user.get.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { a.PermanentDeleteUser(user) @@ -1674,7 +1804,7 @@ func (a *App) GetTotalUsersStats(viewRestrictions *model.ViewUsersRestrictions) ViewRestrictions: viewRestrictions, }) if err != nil { - return nil, err + return nil, model.NewAppError("GetTotalUsersStats", "app.user.get_total_users_count.app_error", nil, err.Error(), http.StatusInternalServerError) } stats := &model.UsersStats{ TotalUsersCount: count, @@ -1686,7 +1816,7 @@ func (a *App) GetTotalUsersStats(viewRestrictions *model.ViewUsersRestrictions) func (a *App) GetFilteredUsersStats(options *model.UserCountOptions) (*model.UsersStats, *model.AppError) { count, err := a.Srv().Store.User().Count(*options) if err != nil { - return nil, err + return nil, model.NewAppError("GetFilteredUsersStats", "app.user.get_total_users_count.app_error", nil, err.Error(), http.StatusInternalServerError) } stats := &model.UsersStats{ TotalUsersCount: count, @@ -1696,7 +1826,7 @@ func (a *App) GetFilteredUsersStats(options *model.UserCountOptions) (*model.Use func (a *App) VerifyUserEmail(userId, email string) *model.AppError { if _, err := a.Srv().Store.User().VerifyEmail(userId, email); err != nil { - return err + return model.NewAppError("VerifyUserEmail", "app.user.verify_email.app_error", nil, err.Error(), http.StatusInternalServerError) } a.InvalidateCacheForUser(userId) @@ -1735,7 +1865,7 @@ func (a *App) SearchUsersInChannel(channelId string, term string, options *model term = strings.TrimSpace(term) users, err := a.Srv().Store.User().SearchInChannel(channelId, term, options) if err != nil { - return nil, err + return nil, model.NewAppError("SearchUsersInChannel", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { a.SanitizeProfile(user, options.IsAdmin) @@ -1748,7 +1878,7 @@ func (a *App) SearchUsersNotInChannel(teamId string, channelId string, term stri term = strings.TrimSpace(term) users, err := a.Srv().Store.User().SearchNotInChannel(teamId, channelId, term, options) if err != nil { - return nil, err + return nil, model.NewAppError("SearchUsersNotInChannel", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { @@ -1759,13 +1889,11 @@ func (a *App) SearchUsersNotInChannel(teamId string, channelId string, term stri } func (a *App) SearchUsersInTeam(teamId, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { - var users []*model.User - var err *model.AppError term = strings.TrimSpace(term) - users, err = a.Srv().Store.User().Search(teamId, term, options) + users, err := a.Srv().Store.User().Search(teamId, term, options) if err != nil { - return nil, err + return nil, model.NewAppError("SearchUsersInTeam", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { @@ -1779,7 +1907,7 @@ func (a *App) SearchUsersNotInTeam(notInTeamId string, term string, options *mod term = strings.TrimSpace(term) users, err := a.Srv().Store.User().SearchNotInTeam(notInTeamId, term, options) if err != nil { - return nil, err + return nil, model.NewAppError("SearchUsersNotInTeam", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { @@ -1793,7 +1921,7 @@ func (a *App) SearchUsersWithoutTeam(term string, options *model.UserSearchOptio term = strings.TrimSpace(term) users, err := a.Srv().Store.User().SearchWithoutTeam(term, options) if err != nil { - return nil, err + return nil, model.NewAppError("SearchUsersWithoutTeam", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { @@ -1807,7 +1935,7 @@ func (a *App) SearchUsersInGroup(groupID string, term string, options *model.Use term = strings.TrimSpace(term) users, err := a.Srv().Store.User().SearchInGroup(groupID, term, options) if err != nil { - return nil, err + return nil, model.NewAppError("SearchUsersInGroup", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { @@ -1822,7 +1950,7 @@ func (a *App) AutocompleteUsersInChannel(teamId string, channelId string, term s autocomplete, err := a.Srv().Store.User().AutocompleteUsersInChannel(teamId, channelId, term, options) if err != nil { - return nil, err + return nil, model.NewAppError("AutocompleteUsersInChannel", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range autocomplete.InChannel { @@ -1837,13 +1965,11 @@ func (a *App) AutocompleteUsersInChannel(teamId string, channelId string, term s } func (a *App) AutocompleteUsersInTeam(teamId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInTeam, *model.AppError) { - var err *model.AppError - term = strings.TrimSpace(term) users, err := a.Srv().Store.User().Search(teamId, term, options) if err != nil { - return nil, err + return nil, model.NewAppError("AutocompleteUsersInTeam", "app.user.search.app_error", nil, err.Error(), http.StatusInternalServerError) } for _, user := range users { @@ -1892,7 +2018,16 @@ func (a *App) UpdateOAuthUserAttrs(userData io.Reader, user *model.User, provide if userAttrsChanged { users, err := a.Srv().Store.User().Update(user, true) if err != nil { - return err + var appErr *model.AppError + var invErr *store.ErrInvalidInput + switch { + case errors.As(err, &appErr): + return appErr + case errors.As(err, &invErr): + return model.NewAppError("UpdateOAuthUserAttrs", "app.user.update.find.app_error", nil, invErr.Error(), http.StatusBadRequest) + default: + return model.NewAppError("UpdateOAuthUserAttrs", "app.user.update.finding.app_error", nil, err.Error(), http.StatusInternalServerError) + } } user = users.New @@ -2047,10 +2182,10 @@ func (a *App) GetViewUsersRestrictions(userId string) (*model.ViewUsersRestricti // PromoteGuestToUser Convert user's roles and all his mermbership's roles from // guest roles to regular user roles. func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.AppError { - err := a.Srv().Store.User().PromoteGuestToUser(user.Id) + nErr := a.Srv().Store.User().PromoteGuestToUser(user.Id) a.InvalidateCacheForUser(user.Id) - if err != nil { - return err + if nErr != nil { + return model.NewAppError("PromoteGuestToUser", "app.user.promote_guest.user_update.app_error", nil, nErr.Error(), http.StatusInternalServerError) } userTeams, nErr := a.Srv().Store.Team().GetTeamsByUserId(user.Id) if nErr != nil { @@ -2059,7 +2194,7 @@ func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.Ap for _, team := range userTeams { // Soft error if there is an issue joining the default channels - if err = a.JoinDefaultChannels(team.Id, user, false, requestorId); err != nil { + if err := a.JoinDefaultChannels(team.Id, user, false, requestorId); err != nil { mlog.Error("Failed to join default channels", mlog.String("user_id", user.Id), mlog.String("team_id", team.Id), mlog.String("requestor_id", requestorId), mlog.Err(err)) } } @@ -2101,10 +2236,10 @@ func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.Ap // DemoteUserToGuest Convert user's roles and all his mermbership's roles from // regular user roles to guest roles. func (a *App) DemoteUserToGuest(user *model.User) *model.AppError { - err := a.Srv().Store.User().DemoteUserToGuest(user.Id) + nErr := a.Srv().Store.User().DemoteUserToGuest(user.Id) a.InvalidateCacheForUser(user.Id) - if err != nil { - return err + if nErr != nil { + return model.NewAppError("DemoteUserToGuest", "app.user.demote_user_to_guest.user_update.app_error", nil, nErr.Error(), http.StatusInternalServerError) } demotedUser, err := a.GetUser(user.Id) @@ -2176,29 +2311,40 @@ func (a *App) invalidateUserCacheAndPublish(userId string) { // relationship with a user. That means any user sharing any channel, including // direct and group channels. func (a *App) GetKnownUsers(userID string) ([]string, *model.AppError) { - return a.Srv().Store.User().GetKnownUsers(userID) + users, err := a.Srv().Store.User().GetKnownUsers(userID) + if err != nil { + return nil, model.NewAppError("GetKnownUsers", "app.user.get_known_users.get_users.app_error", nil, err.Error(), http.StatusInternalServerError) + } + + return users, nil } // ConvertBotToUser converts a bot to user. func (a *App) ConvertBotToUser(bot *model.Bot, userPatch *model.UserPatch, sysadmin bool) (*model.User, *model.AppError) { - user, err := a.Srv().Store.User().Get(bot.UserId) - if err != nil { - return nil, err + user, nErr := a.Srv().Store.User().Get(bot.UserId) + if nErr != nil { + var nfErr *store.ErrNotFound + switch { + case errors.As(nErr, &nfErr): + return nil, model.NewAppError("ConvertBotToUser", MISSING_ACCOUNT_ERROR, nil, nfErr.Error(), http.StatusNotFound) + default: + return nil, model.NewAppError("ConvertBotToUser", "app.user.get.app_error", nil, nErr.Error(), http.StatusInternalServerError) + } } if sysadmin && !user.IsInRole(model.SYSTEM_ADMIN_ROLE_ID) { - _, err = a.UpdateUserRoles( + _, appErr := a.UpdateUserRoles( user.Id, fmt.Sprintf("%s %s", user.Roles, model.SYSTEM_ADMIN_ROLE_ID), false) - if err != nil { - return nil, err + if appErr != nil { + return nil, appErr } } user.Patch(userPatch) - user, err = a.UpdateUser(user, false) + user, err := a.UpdateUser(user, false) if err != nil { return nil, err } diff --git a/app/user_test.go b/app/user_test.go index 32b6964bdf..5a4b640140 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -398,8 +398,8 @@ func TestUpdateUserEmail(t *testing.T) { Username: model.NewId(), IsBot: true, } - _, err = th.App.Srv().Store.User().Save(&botuser) - assert.Nil(t, err) + _, nErr := th.App.Srv().Store.User().Save(&botuser) + assert.Nil(t, nErr) newBotEmail := th.MakeEmail() botuser.Email = newBotEmail @@ -441,8 +441,8 @@ func TestUpdateUserEmail(t *testing.T) { Username: model.NewId(), IsBot: true, } - _, err = th.App.Srv().Store.User().Save(&botuser) - assert.Nil(t, err) + _, nErr := th.App.Srv().Store.User().Save(&botuser) + assert.Nil(t, nErr) newBotEmail := th.MakeEmail() botuser.Email = newBotEmail diff --git a/app/webhook.go b/app/webhook.go index bad85b9c62..56e966aa03 100644 --- a/app/webhook.go +++ b/app/webhook.go @@ -676,7 +676,7 @@ func (a *App) HandleIncomingWebhook(hookId string, req *model.IncomingWebhookReq uchan := make(chan store.StoreResult, 1) go func() { user, err := a.Srv().Store.User().Get(hook.UserId) - uchan <- store.StoreResult{Data: user, Err: err} + uchan <- store.StoreResult{Data: user, NErr: err} close(uchan) }() @@ -700,7 +700,7 @@ func (a *App) HandleIncomingWebhook(hookId string, req *model.IncomingWebhookReq if len(channelName) != 0 { if channelName[0] == '@' { if result, err := a.Srv().Store.User().GetByUsername(channelName[1:]); err != nil { - return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.user.app_error", nil, "err="+err.Message, http.StatusBadRequest) + return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.user.app_error", nil, err.Error(), http.StatusBadRequest) } else { if ch, err := a.GetOrCreateDirectChannel(hook.UserId, result.Id); err != nil { return err @@ -757,8 +757,8 @@ func (a *App) HandleIncomingWebhook(hookId string, req *model.IncomingWebhookReq } var user *model.User - if result := <-uchan; result.Err != nil { - return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.user.app_error", nil, "err="+result.Err.Message, http.StatusForbidden) + if result := <-uchan; result.NErr != nil { + return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.user.app_error", nil, result.NErr.Error(), http.StatusForbidden) } else { user = result.Data.(*model.User) } diff --git a/cmd/mattermost/commands/userargs.go b/cmd/mattermost/commands/userargs.go index b2b48ec3d9..3adf31a658 100644 --- a/cmd/mattermost/commands/userargs.go +++ b/cmd/mattermost/commands/userargs.go @@ -21,7 +21,7 @@ func getUserFromUserArg(a *app.App, userArg string) *model.User { user, _ := a.Srv().Store.User().GetByEmail(userArg) if user == nil { - var err *model.AppError + var err error if user, err = a.Srv().Store.User().GetByUsername(userArg); err == nil { return user } diff --git a/i18n/en.json b/i18n/en.json index dd2e576174..5bff9c9faf 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -5334,14 +5334,138 @@ "id": "app.upload.upload_data.update.app_error", "translation": "Failed to update the upload session." }, + { + "id": "app.user.analytics_daily_active_users.app_error", + "translation": "Unable to get the active users during the requested period." + }, + { + "id": "app.user.analytics_get_inactive_users_count.app_error", + "translation": "We could not count the inactive users." + }, + { + "id": "app.user.clear_all_custom_role_assignments.select.app_error", + "translation": "Failed to retrieve the users." + }, { "id": "app.user.convert_bot_to_user.app_error", "translation": "Unable to convert bot to user." }, + { + "id": "app.user.demote_user_to_guest.user_update.app_error", + "translation": "Failed to update the user." + }, + { + "id": "app.user.get.app_error", + "translation": "We encountered an error finding the account." + }, + { + "id": "app.user.get_by_auth.missing_account.app_error", + "translation": "Unable to find an existing account matching your authentication type for this team. This team may require an invite from the team owner to join." + }, + { + "id": "app.user.get_by_auth.other.app_error", + "translation": "We encountered an error trying to find the account by authentication type." + }, + { + "id": "app.user.get_by_username.app_error", + "translation": "Unable to find an existing account matching your username for this team. This team may require an invite from the team owner to join." + }, + { + "id": "app.user.get_known_users.get_users.app_error", + "translation": "Unable to get know users from the database." + }, + { + "id": "app.user.get_new_users.app_error", + "translation": "We encountered an error while finding the new users." + }, + { + "id": "app.user.get_profile_by_group_channel_ids_for_user.app_error", + "translation": "We encountered an error while finding user profiles." + }, + { + "id": "app.user.get_profiles.app_error", + "translation": "We encountered an error while finding user profiles." + }, + { + "id": "app.user.get_recently_active_users.app_error", + "translation": "We encountered an error while finding the recently active users." + }, + { + "id": "app.user.get_total_users_count.app_error", + "translation": "We could not count the users." + }, + { + "id": "app.user.get_unread_count.app_error", + "translation": "We could not get the unread message count for the user." + }, + { + "id": "app.user.get_users_batch_for_indexing.get_users.app_error", + "translation": "Unable to get the users batch for indexing." + }, + { + "id": "app.user.missing_account.const", + "translation": "Unable to find the user." + }, + { + "id": "app.user.permanent_delete.app_error", + "translation": "Unable to delete the existing account." + }, { "id": "app.user.permanentdeleteuser.internal_error", "translation": "Unable to delete user." }, + { + "id": "app.user.promote_guest.user_update.app_error", + "translation": "Failed to update the user." + }, + { + "id": "app.user.save.app_error", + "translation": "Unable to save the account." + }, + { + "id": "app.user.save.existing.app_error", + "translation": "Must call update for existing user." + }, + { + "id": "app.user.search.app_error", + "translation": "Unable to find any user matching the search parameters." + }, + { + "id": "app.user.update.find.app_error", + "translation": "Unable to find the existing account to update." + }, + { + "id": "app.user.update.finding.app_error", + "translation": "We encountered an error finding the account." + }, + { + "id": "app.user.update_active_for_multiple_users.updating.app_error", + "translation": "Unable to deactivate guests." + }, + { + "id": "app.user.update_auth_data.app_error", + "translation": "Unable to update the auth data." + }, + { + "id": "app.user.update_auth_data.email_exists.app_error", + "translation": "Unable to switch account to {{.Service}}. An account using the email {{.Email}} already exists." + }, + { + "id": "app.user.update_failed_pwd_attempts.app_error", + "translation": "Unable to update the failed_attempts." + }, + { + "id": "app.user.update_password.app_error", + "translation": "Unable to update the user password." + }, + { + "id": "app.user.update_update.app_error", + "translation": "Unable to update the date of the last update of the user." + }, + { + "id": "app.user.verify_email.app_error", + "translation": "Unable to update verify email field." + }, { "id": "app.user_access_token.delete.app_error", "translation": "Unable to delete the personal access token." @@ -7866,262 +7990,14 @@ "id": "store.sql_team.save_member.exists.app_error", "translation": "A team member with that ID already exists." }, - { - "id": "store.sql_user.analytics_daily_active_users.app_error", - "translation": "Unable to get the active users during the requested period." - }, - { - "id": "store.sql_user.analytics_get_external_users.app_error", - "translation": "We could not count the users with non local domain emails" - }, - { - "id": "store.sql_user.analytics_get_inactive_users_count.app_error", - "translation": "We could not count the inactive users." - }, - { - "id": "store.sql_user.analytics_get_system_admin_count.app_error", - "translation": "Unable to get the system admin count." - }, - { - "id": "store.sql_user.app_error", - "translation": "Failed to build query." - }, - { - "id": "store.sql_user.clear_all_custom_role_assignments.commit_transaction.app_error", - "translation": "Failed to commit the database transaction." - }, - { - "id": "store.sql_user.clear_all_custom_role_assignments.open_transaction.app_error", - "translation": "Failed to begin the database transaction." - }, - { - "id": "store.sql_user.clear_all_custom_role_assignments.select.app_error", - "translation": "Failed to retrieve the users." - }, - { - "id": "store.sql_user.clear_all_custom_role_assignments.update.app_error", - "translation": "Failed to update the user." - }, - { - "id": "store.sql_user.count.app_error", - "translation": "UserCountOptions don't make sense." - }, - { - "id": "store.sql_user.demote_user_to_guest.channel_members_update.app_error", - "translation": "Failed to update the user channels memberships." - }, - { - "id": "store.sql_user.demote_user_to_guest.commit_transaction.app_error", - "translation": "Failed to commit the database transaction." - }, - { - "id": "store.sql_user.demote_user_to_guest.open_transaction.app_error", - "translation": "Failed to begin the database transaction." - }, - { - "id": "store.sql_user.demote_user_to_guest.team_members_update.app_error", - "translation": "Failed to update the user teams memberships." - }, - { - "id": "store.sql_user.demote_user_to_guest.user_update.app_error", - "translation": "Failed to update the user." - }, - { - "id": "store.sql_user.get.app_error", - "translation": "We encountered an error finding the account." - }, - { - "id": "store.sql_user.get_by_auth.missing_account.app_error", - "translation": "Unable to find an existing account matching your authentication type for this team. This team may require an invite from the team owner to join." - }, - { - "id": "store.sql_user.get_by_auth.other.app_error", - "translation": "We encountered an error trying to find the account by authentication type." - }, - { - "id": "store.sql_user.get_by_username.app_error", - "translation": "Unable to find an existing account matching your username for this team. This team may require an invite from the team owner to join." - }, { "id": "store.sql_user.get_for_login.app_error", "translation": "Unable to find an existing account matching your credentials. This team may require an invite from the team owner to join." }, - { - "id": "store.sql_user.get_for_login.multiple_users", - "translation": "We found multiple users matching your credentials and were unable to log you in. Please contact an administrator." - }, - { - "id": "store.sql_user.get_known_users.get_users.app_error", - "translation": "Unable to get know users from the database." - }, - { - "id": "store.sql_user.get_new_users.app_error", - "translation": "We encountered an error while finding the new users." - }, - { - "id": "store.sql_user.get_profile_by_group_channel_ids_for_user.app_error", - "translation": "We encountered an error while finding user profiles." - }, - { - "id": "store.sql_user.get_profiles.app_error", - "translation": "We encountered an error while finding user profiles." - }, - { - "id": "store.sql_user.get_recently_active_users.app_error", - "translation": "We encountered an error while finding the recently active users." - }, - { - "id": "store.sql_user.get_sysadmin_profiles.app_error", - "translation": "We encountered an error while finding user profiles." - }, - { - "id": "store.sql_user.get_system_install_date.app_error", - "translation": "Unable to infer the system date based on the first user creation date." - }, - { - "id": "store.sql_user.get_total_users_count.app_error", - "translation": "We could not count the users." - }, - { - "id": "store.sql_user.get_unread_count.app_error", - "translation": "We could not get the unread message count for the user." - }, - { - "id": "store.sql_user.get_unread_count_for_channel.app_error", - "translation": "We could not get the unread message count for the user and channel." - }, - { - "id": "store.sql_user.get_users_batch_for_indexing.get_channel_members.app_error", - "translation": "Unable to get the channel members for the users batch for indexing." - }, - { - "id": "store.sql_user.get_users_batch_for_indexing.get_team_members.app_error", - "translation": "Unable to get the team members for the users batch for indexing." - }, - { - "id": "store.sql_user.get_users_batch_for_indexing.get_users.app_error", - "translation": "Unable to get the users batch for indexing." - }, - { - "id": "store.sql_user.missing_account.const", - "translation": "Unable to find the user." - }, - { - "id": "store.sql_user.permanent_delete.app_error", - "translation": "Unable to delete the existing account." - }, - { - "id": "store.sql_user.promote_guest.channel_members_update.app_error", - "translation": "Failed to update the user channels memberships." - }, - { - "id": "store.sql_user.promote_guest.commit_transaction.app_error", - "translation": "Failed to commit the database transaction." - }, - { - "id": "store.sql_user.promote_guest.open_transaction.app_error", - "translation": "Failed to begin the database transaction." - }, - { - "id": "store.sql_user.promote_guest.team_members_update.app_error", - "translation": "Failed to update the user teams memberships." - }, - { - "id": "store.sql_user.promote_guest.user_update.app_error", - "translation": "Failed to update the user." - }, - { - "id": "store.sql_user.save.app_error", - "translation": "Unable to save the account." - }, - { - "id": "store.sql_user.save.email_exists.app_error", - "translation": "An account with that email already exists." - }, - { - "id": "store.sql_user.save.existing.app_error", - "translation": "Must call update for existing user." - }, - { - "id": "store.sql_user.save.username_exists.app_error", - "translation": "An account with that username already exists." - }, - { - "id": "store.sql_user.search.app_error", - "translation": "Unable to find any user matching the search parameters." - }, - { - "id": "store.sql_user.update.app_error", - "translation": "Unable to update the account." - }, - { - "id": "store.sql_user.update.can_not_change_ldap.app_error", - "translation": "Can not change fields set by AD/LDAP." - }, { "id": "store.sql_user.update.email_taken.app_error", "translation": "This email is already taken. Please choose another." }, - { - "id": "store.sql_user.update.find.app_error", - "translation": "Unable to find the existing account to update." - }, - { - "id": "store.sql_user.update.finding.app_error", - "translation": "We encountered an error finding the account." - }, - { - "id": "store.sql_user.update.updating.app_error", - "translation": "We encountered an error updating the account." - }, - { - "id": "store.sql_user.update.username_taken.app_error", - "translation": "This username is already taken. Please choose another." - }, - { - "id": "store.sql_user.update_active_for_multiple_users.getting_changed_users.app_error", - "translation": "Unable to get the list of deactivate guests ids." - }, - { - "id": "store.sql_user.update_active_for_multiple_users.updating.app_error", - "translation": "Unable to deactivate guests." - }, - { - "id": "store.sql_user.update_auth_data.app_error", - "translation": "Unable to update the auth data." - }, - { - "id": "store.sql_user.update_auth_data.email_exists.app_error", - "translation": "Unable to switch account to {{.Service}}. An account using the email {{.Email}} already exists." - }, - { - "id": "store.sql_user.update_failed_pwd_attempts.app_error", - "translation": "Unable to update the failed_attempts." - }, - { - "id": "store.sql_user.update_last_picture_update.app_error", - "translation": "Unable to update the update_at." - }, - { - "id": "store.sql_user.update_mfa_active.app_error", - "translation": "We encountered an error updating the user's MFA active status." - }, - { - "id": "store.sql_user.update_mfa_secret.app_error", - "translation": "We encountered an error updating the user's MFA secret." - }, - { - "id": "store.sql_user.update_password.app_error", - "translation": "Unable to update the user password." - }, - { - "id": "store.sql_user.update_update.app_error", - "translation": "Unable to update the date of the last update of the user." - }, - { - "id": "store.sql_user.verify_email.app_error", - "translation": "Unable to update verify email field." - }, { "id": "store.update_error", "translation": "update error" diff --git a/jobs/active_users/worker.go b/jobs/active_users/worker.go index 6d2feca919..6209f2f88b 100644 --- a/jobs/active_users/worker.go +++ b/jobs/active_users/worker.go @@ -4,6 +4,8 @@ package active_users import ( + "net/http" + "github.com/mattermost/mattermost-server/v5/app" "github.com/mattermost/mattermost-server/v5/jobs" tjobs "github.com/mattermost/mattermost-server/v5/jobs/interfaces" @@ -91,7 +93,7 @@ func (worker *Worker) DoJob(job *model.Job) { if err != nil { mlog.Error("Worker: Failed to get active user count", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error())) - worker.setJobError(job, err) + worker.setJobError(job, model.NewAppError("DoJob", "app.user.get_total_users_count.app_error", nil, err.Error(), http.StatusInternalServerError)) return } diff --git a/services/mfa/mfa.go b/services/mfa/mfa.go index 326e965bc8..1738f20b60 100644 --- a/services/mfa/mfa.go +++ b/services/mfa/mfa.go @@ -111,7 +111,7 @@ func (m *Mfa) Deactivate(userId string) *model.AppError { return err } - schan := make(chan *model.AppError, 1) + schan := make(chan error, 1) go func() { schan <- m.Store.User().UpdateMfaSecret(userId, "") close(schan) diff --git a/services/mfa/mfa_test.go b/services/mfa/mfa_test.go index 79c2cd28bb..100a2b4cf1 100644 --- a/services/mfa/mfa_test.go +++ b/services/mfa/mfa_test.go @@ -4,8 +4,8 @@ package mfa import ( + "errors" "fmt" - "net/http" "net/url" "testing" "time" @@ -42,8 +42,8 @@ func TestGenerateSecret(t *testing.T) { t.Run("fail on store action fail", func(t *testing.T) { storeMock := mocks.Store{} userStoreMock := mocks.UserStore{} - userStoreMock.On("UpdateMfaSecret", user.Id, mock.AnythingOfType("string")).Return(func(userId string, secret string) *model.AppError { - return model.NewAppError("GenerateQrCode", "mfa.generate_qr_code.save_secret.app_error", nil, "", http.StatusInternalServerError) + userStoreMock.On("UpdateMfaSecret", user.Id, mock.AnythingOfType("string")).Return(func(userId string, secret string) error { + return errors.New("failed to update mfa secret") }) storeMock.On("User").Return(&userStoreMock) @@ -56,7 +56,7 @@ func TestGenerateSecret(t *testing.T) { t.Run("Successful generate secret", func(t *testing.T) { storeMock := mocks.Store{} userStoreMock := mocks.UserStore{} - userStoreMock.On("UpdateMfaSecret", user.Id, mock.AnythingOfType("string")).Return(func(userId string, secret string) *model.AppError { + userStoreMock.On("UpdateMfaSecret", user.Id, mock.AnythingOfType("string")).Return(func(userId string, secret string) error { return nil }) storeMock.On("User").Return(&userStoreMock) @@ -130,8 +130,8 @@ func TestActivate(t *testing.T) { t.Run("fail on store action fail", func(t *testing.T) { storeMock := mocks.Store{} userStoreMock := mocks.UserStore{} - userStoreMock.On("UpdateMfaActive", user.Id, true).Return(func(userId string, active bool) *model.AppError { - return model.NewAppError("Activate", "mfa.activate.save_active.app_error", nil, "", http.StatusInternalServerError) + userStoreMock.On("UpdateMfaActive", user.Id, true).Return(func(userId string, active bool) error { + return errors.New("failed to update mfa active") }) storeMock.On("User").Return(&userStoreMock) @@ -144,7 +144,7 @@ func TestActivate(t *testing.T) { t.Run("Successful activate", func(t *testing.T) { storeMock := mocks.Store{} userStoreMock := mocks.UserStore{} - userStoreMock.On("UpdateMfaActive", user.Id, true).Return(func(userId string, active bool) *model.AppError { + userStoreMock.On("UpdateMfaActive", user.Id, true).Return(func(userId string, active bool) error { return nil }) storeMock.On("User").Return(&userStoreMock) @@ -177,11 +177,11 @@ func TestDeactivate(t *testing.T) { t.Run("fail on store UpdateMfaActive action fail", func(t *testing.T) { storeMock := mocks.Store{} userStoreMock := mocks.UserStore{} - userStoreMock.On("UpdateMfaActive", user.Id, false).Return(func(userId string, active bool) *model.AppError { - return model.NewAppError("Deactivate", "mfa.deactivate.save_active.app_error", nil, "", http.StatusInternalServerError) + userStoreMock.On("UpdateMfaActive", user.Id, false).Return(func(userId string, active bool) error { + return errors.New("failed to update mfa active") }) - userStoreMock.On("UpdateMfaSecret", user.Id, "").Return(func(userId string, secret string) *model.AppError { - return model.NewAppError("Deactivate", "mfa.deactivate.save_secret.app_error", nil, "", http.StatusInternalServerError) + userStoreMock.On("UpdateMfaSecret", user.Id, "").Return(func(userId string, secret string) error { + return errors.New("failed to update mfa secret") }) storeMock.On("User").Return(&userStoreMock) @@ -194,11 +194,11 @@ func TestDeactivate(t *testing.T) { t.Run("fail on store UpdateMfaSecret action fail", func(t *testing.T) { storeMock := mocks.Store{} userStoreMock := mocks.UserStore{} - userStoreMock.On("UpdateMfaActive", user.Id, false).Return(func(userId string, active bool) *model.AppError { + userStoreMock.On("UpdateMfaActive", user.Id, false).Return(func(userId string, active bool) error { return nil }) - userStoreMock.On("UpdateMfaSecret", user.Id, "").Return(func(userId string, secret string) *model.AppError { - return model.NewAppError("Deactivate", "mfa.deactivate.save_secret.app_error", nil, "", http.StatusInternalServerError) + userStoreMock.On("UpdateMfaSecret", user.Id, "").Return(func(userId string, secret string) error { + return errors.New("failed to update mfa secret") }) storeMock.On("User").Return(&userStoreMock) @@ -211,10 +211,10 @@ func TestDeactivate(t *testing.T) { t.Run("Successful deactivate", func(t *testing.T) { storeMock := mocks.Store{} userStoreMock := mocks.UserStore{} - userStoreMock.On("UpdateMfaActive", user.Id, false).Return(func(userId string, active bool) *model.AppError { + userStoreMock.On("UpdateMfaActive", user.Id, false).Return(func(userId string, active bool) error { return nil }) - userStoreMock.On("UpdateMfaSecret", user.Id, "").Return(func(userId string, secret string) *model.AppError { + userStoreMock.On("UpdateMfaSecret", user.Id, "").Return(func(userId string, secret string) error { return nil }) storeMock.On("User").Return(&userStoreMock) diff --git a/services/searchengine/bleveengine/indexer/indexing_job.go b/services/searchengine/bleveengine/indexer/indexing_job.go index db7c7e8e21..1397f18e68 100644 --- a/services/searchengine/bleveengine/indexer/indexing_job.go +++ b/services/searchengine/bleveengine/indexer/indexing_job.go @@ -442,7 +442,7 @@ func (worker *BleveIndexerWorker) IndexUsersBatch(progress IndexingProgress) (In for users == nil { if usersBatch, err := worker.jobServer.Store.User().GetUsersBatchForIndexing(progress.LastEntityTime, endTime, BATCH_SIZE); err != nil { if tries >= 10 { - return progress, err + return progress, model.NewAppError("IndexUsersBatch", "app.user.get_users_batch_for_indexing.get_users.app_error", nil, err.Error(), http.StatusInternalServerError) } else { mlog.Warn("Failed to get users batch for indexing. Retrying.", mlog.Err(err)) diff --git a/services/slackimport/slackimport.go b/services/slackimport/slackimport.go index a454bab20c..06db0caca8 100644 --- a/services/slackimport/slackimport.go +++ b/services/slackimport/slackimport.go @@ -684,17 +684,17 @@ func (si *SlackImporter) oldImportUser(team *model.Team, user *model.User) *mode user.Roles = model.SYSTEM_USER_ROLE_ID - ruser, err := si.store.User().Save(user) - if err != nil { - mlog.Error("Error saving user.", mlog.Err(err)) + ruser, nErr := si.store.User().Save(user) + if nErr != nil { + mlog.Error("Error saving user.", mlog.Err(nErr)) return nil } - if _, err = si.store.User().VerifyEmail(ruser.Id, ruser.Email); err != nil { + if _, err := si.store.User().VerifyEmail(ruser.Id, ruser.Email); err != nil { mlog.Error("Failed to set email verified.", mlog.Err(err)) } - if err = si.actions.JoinUserToTeam(team, user, ""); err != nil { + if err := si.actions.JoinUserToTeam(team, user, ""); err != nil { mlog.Error("Failed to join team when importing.", mlog.Err(err)) } diff --git a/services/telemetry/telemetry.go b/services/telemetry/telemetry.go index b4867aba6a..593eb2dcf1 100644 --- a/services/telemetry/telemetry.go +++ b/services/telemetry/telemetry.go @@ -234,14 +234,14 @@ func (ts *TelemetryService) trackActivity() { activeUsersDailyCountChan := make(chan store.StoreResult, 1) go func() { count, err := ts.dbStore.User().AnalyticsActiveCount(DAY_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: false}) - activeUsersDailyCountChan <- store.StoreResult{Data: count, Err: err} + activeUsersDailyCountChan <- store.StoreResult{Data: count, NErr: err} close(activeUsersDailyCountChan) }() activeUsersMonthlyCountChan := make(chan store.StoreResult, 1) go func() { count, err := ts.dbStore.User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: false}) - activeUsersMonthlyCountChan <- store.StoreResult{Data: count, Err: err} + activeUsersMonthlyCountChan <- store.StoreResult{Data: count, NErr: err} close(activeUsersMonthlyCountChan) }() @@ -311,12 +311,12 @@ func (ts *TelemetryService) trackActivity() { outgoingWebhooksCount, _ = ts.dbStore.Webhook().AnalyticsOutgoingCount("") var activeUsersDailyCount int64 - if r := <-activeUsersDailyCountChan; r.Err == nil { + if r := <-activeUsersDailyCountChan; r.NErr == nil { activeUsersDailyCount = r.Data.(int64) } var activeUsersMonthlyCount int64 - if r := <-activeUsersMonthlyCountChan; r.Err == nil { + if r := <-activeUsersMonthlyCountChan; r.NErr == nil { activeUsersMonthlyCount = r.Data.(int64) } diff --git a/store/constants.go b/store/constants.go index 24a21a93ae..876cb41bce 100644 --- a/store/constants.go +++ b/store/constants.go @@ -6,9 +6,6 @@ package store const ( CHANNEL_EXISTS_ERROR = "store.sql_channel.save_channel.exists.app_error" - MISSING_ACCOUNT_ERROR = "store.sql_user.missing_account.const" - MISSING_AUTH_ACCOUNT_ERROR = "store.sql_user.get_by_auth.missing_account.app_error" - USER_SEARCH_OPTION_NAMES_ONLY = "names_only" USER_SEARCH_OPTION_NAMES_ONLY_NO_FULL_NAME = "names_only_no_full_name" USER_SEARCH_OPTION_ALL_NO_FULL_NAME = "all_no_full_name" diff --git a/store/localcachelayer/user_layer.go b/store/localcachelayer/user_layer.go index 652e6e10b3..cdf9997784 100644 --- a/store/localcachelayer/user_layer.go +++ b/store/localcachelayer/user_layer.go @@ -71,7 +71,7 @@ func (s LocalCacheUserStore) InvalidateProfilesInChannelCache(channelId string) } } -func (s LocalCacheUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) { +func (s LocalCacheUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, error) { if allowFromCache { var cachedMap map[string]*model.User if err := s.rootStore.doStandardReadCache(s.rootStore.profilesInChannelCache, channelId, &cachedMap); err == nil { @@ -91,7 +91,7 @@ func (s LocalCacheUserStore) GetAllProfilesInChannel(channelId string, allowFrom return userMap, nil } -func (s LocalCacheUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, *model.AppError) { +func (s LocalCacheUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) { if !allowFromCache { return s.UserStore.GetProfileByIds(userIds, options, false) } @@ -137,7 +137,7 @@ func (s LocalCacheUserStore) GetProfileByIds(userIds []string, options *store.Us // It checks if the user entry is present in the cache, returning the entry from cache // if it is present. Otherwise, it fetches the entry from the store and stores it in the // cache. -func (s LocalCacheUserStore) Get(id string) (*model.User, *model.AppError) { +func (s LocalCacheUserStore) Get(id string) (*model.User, error) { var cacheItem *model.User if err := s.rootStore.doStandardReadCache(s.rootStore.userProfileByIdsCache, id, &cacheItem); err == nil { if s.rootStore.metrics != nil { diff --git a/store/opentracinglayer/opentracinglayer.go b/store/opentracinglayer/opentracinglayer.go index 54d8859066..d11385192b 100644 --- a/store/opentracinglayer/opentracinglayer.go +++ b/store/opentracinglayer/opentracinglayer.go @@ -7985,7 +7985,7 @@ func (s *OpenTracingLayerUploadSessionStore) Update(session *model.UploadSession return err } -func (s *OpenTracingLayerUserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.AnalyticsActiveCount") s.Root.Store.SetContext(newCtx) @@ -8021,7 +8021,7 @@ func (s *OpenTracingLayerUserStore) AnalyticsActiveCountForPeriod(startTime int6 return result, err } -func (s *OpenTracingLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, *model.AppError) { +func (s *OpenTracingLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.AnalyticsGetExternalUsers") s.Root.Store.SetContext(newCtx) @@ -8039,7 +8039,7 @@ func (s *OpenTracingLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) return result, err } -func (s *OpenTracingLayerUserStore) AnalyticsGetGuestCount() (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) AnalyticsGetGuestCount() (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.AnalyticsGetGuestCount") s.Root.Store.SetContext(newCtx) @@ -8057,7 +8057,7 @@ func (s *OpenTracingLayerUserStore) AnalyticsGetGuestCount() (int64, *model.AppE return result, err } -func (s *OpenTracingLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.AnalyticsGetInactiveUsersCount") s.Root.Store.SetContext(newCtx) @@ -8075,7 +8075,7 @@ func (s *OpenTracingLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, *mo return result, err } -func (s *OpenTracingLayerUserStore) AnalyticsGetSystemAdminCount() (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) AnalyticsGetSystemAdminCount() (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.AnalyticsGetSystemAdminCount") s.Root.Store.SetContext(newCtx) @@ -8093,7 +8093,7 @@ func (s *OpenTracingLayerUserStore) AnalyticsGetSystemAdminCount() (int64, *mode return result, err } -func (s *OpenTracingLayerUserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, *model.AppError) { +func (s *OpenTracingLayerUserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.AutocompleteUsersInChannel") s.Root.Store.SetContext(newCtx) @@ -8111,7 +8111,7 @@ func (s *OpenTracingLayerUserStore) AutocompleteUsersInChannel(teamId string, ch return result, err } -func (s *OpenTracingLayerUserStore) ClearAllCustomRoleAssignments() *model.AppError { +func (s *OpenTracingLayerUserStore) ClearAllCustomRoleAssignments() error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.ClearAllCustomRoleAssignments") s.Root.Store.SetContext(newCtx) @@ -8142,7 +8142,7 @@ func (s *OpenTracingLayerUserStore) ClearCaches() { } -func (s *OpenTracingLayerUserStore) Count(options model.UserCountOptions) (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) Count(options model.UserCountOptions) (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.Count") s.Root.Store.SetContext(newCtx) @@ -8160,7 +8160,7 @@ func (s *OpenTracingLayerUserStore) Count(options model.UserCountOptions) (int64 return result, err } -func (s *OpenTracingLayerUserStore) DeactivateGuests() ([]string, *model.AppError) { +func (s *OpenTracingLayerUserStore) DeactivateGuests() ([]string, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.DeactivateGuests") s.Root.Store.SetContext(newCtx) @@ -8178,7 +8178,7 @@ func (s *OpenTracingLayerUserStore) DeactivateGuests() ([]string, *model.AppErro return result, err } -func (s *OpenTracingLayerUserStore) DemoteUserToGuest(userID string) *model.AppError { +func (s *OpenTracingLayerUserStore) DemoteUserToGuest(userID string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.DemoteUserToGuest") s.Root.Store.SetContext(newCtx) @@ -8196,7 +8196,7 @@ func (s *OpenTracingLayerUserStore) DemoteUserToGuest(userID string) *model.AppE return err } -func (s *OpenTracingLayerUserStore) Get(id string) (*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) Get(id string) (*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.Get") s.Root.Store.SetContext(newCtx) @@ -8214,7 +8214,7 @@ func (s *OpenTracingLayerUserStore) Get(id string) (*model.User, *model.AppError return result, err } -func (s *OpenTracingLayerUserStore) GetAll() ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetAll() ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetAll") s.Root.Store.SetContext(newCtx) @@ -8232,7 +8232,7 @@ func (s *OpenTracingLayerUserStore) GetAll() ([]*model.User, *model.AppError) { return result, err } -func (s *OpenTracingLayerUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetAllAfter") s.Root.Store.SetContext(newCtx) @@ -8250,7 +8250,7 @@ func (s *OpenTracingLayerUserStore) GetAllAfter(limit int, afterId string) ([]*m return result, err } -func (s *OpenTracingLayerUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetAllNotInAuthService") s.Root.Store.SetContext(newCtx) @@ -8268,7 +8268,7 @@ func (s *OpenTracingLayerUserStore) GetAllNotInAuthService(authServices []string return result, err } -func (s *OpenTracingLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetAllProfiles") s.Root.Store.SetContext(newCtx) @@ -8286,7 +8286,7 @@ func (s *OpenTracingLayerUserStore) GetAllProfiles(options *model.UserGetOptions return result, err } -func (s *OpenTracingLayerUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetAllProfilesInChannel") s.Root.Store.SetContext(newCtx) @@ -8304,7 +8304,7 @@ func (s *OpenTracingLayerUserStore) GetAllProfilesInChannel(channelId string, al return result, err } -func (s *OpenTracingLayerUserStore) GetAllUsingAuthService(authService string) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetAllUsingAuthService(authService string) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetAllUsingAuthService") s.Root.Store.SetContext(newCtx) @@ -8322,7 +8322,7 @@ func (s *OpenTracingLayerUserStore) GetAllUsingAuthService(authService string) ( return result, err } -func (s *OpenTracingLayerUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetAnyUnreadPostCountForChannel") s.Root.Store.SetContext(newCtx) @@ -8340,7 +8340,7 @@ func (s *OpenTracingLayerUserStore) GetAnyUnreadPostCountForChannel(userId strin return result, err } -func (s *OpenTracingLayerUserStore) GetByAuth(authData *string, authService string) (*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetByAuth(authData *string, authService string) (*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetByAuth") s.Root.Store.SetContext(newCtx) @@ -8358,7 +8358,7 @@ func (s *OpenTracingLayerUserStore) GetByAuth(authData *string, authService stri return result, err } -func (s *OpenTracingLayerUserStore) GetByEmail(email string) (*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetByEmail(email string) (*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetByEmail") s.Root.Store.SetContext(newCtx) @@ -8376,7 +8376,7 @@ func (s *OpenTracingLayerUserStore) GetByEmail(email string) (*model.User, *mode return result, err } -func (s *OpenTracingLayerUserStore) GetByUsername(username string) (*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetByUsername(username string) (*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetByUsername") s.Root.Store.SetContext(newCtx) @@ -8394,7 +8394,7 @@ func (s *OpenTracingLayerUserStore) GetByUsername(username string) (*model.User, return result, err } -func (s *OpenTracingLayerUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetChannelGroupUsers") s.Root.Store.SetContext(newCtx) @@ -8451,7 +8451,7 @@ func (s *OpenTracingLayerUserStore) GetEtagForProfilesNotInTeam(teamId string) s return result } -func (s *OpenTracingLayerUserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetForLogin") s.Root.Store.SetContext(newCtx) @@ -8469,7 +8469,7 @@ func (s *OpenTracingLayerUserStore) GetForLogin(loginId string, allowSignInWithU return result, err } -func (s *OpenTracingLayerUserStore) GetKnownUsers(userID string) ([]string, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetKnownUsers(userID string) ([]string, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetKnownUsers") s.Root.Store.SetContext(newCtx) @@ -8487,7 +8487,7 @@ func (s *OpenTracingLayerUserStore) GetKnownUsers(userID string) ([]string, *mod return result, err } -func (s *OpenTracingLayerUserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetNewUsersForTeam") s.Root.Store.SetContext(newCtx) @@ -8505,7 +8505,7 @@ func (s *OpenTracingLayerUserStore) GetNewUsersForTeam(teamId string, offset int return result, err } -func (s *OpenTracingLayerUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfileByGroupChannelIdsForUser") s.Root.Store.SetContext(newCtx) @@ -8523,7 +8523,7 @@ func (s *OpenTracingLayerUserStore) GetProfileByGroupChannelIdsForUser(userId st return result, err } -func (s *OpenTracingLayerUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfileByIds") s.Root.Store.SetContext(newCtx) @@ -8541,7 +8541,7 @@ func (s *OpenTracingLayerUserStore) GetProfileByIds(userIds []string, options *s return result, err } -func (s *OpenTracingLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfiles") s.Root.Store.SetContext(newCtx) @@ -8559,7 +8559,7 @@ func (s *OpenTracingLayerUserStore) GetProfiles(options *model.UserGetOptions) ( return result, err } -func (s *OpenTracingLayerUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfilesByUsernames") s.Root.Store.SetContext(newCtx) @@ -8577,7 +8577,7 @@ func (s *OpenTracingLayerUserStore) GetProfilesByUsernames(usernames []string, v return result, err } -func (s *OpenTracingLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfilesInChannel") s.Root.Store.SetContext(newCtx) @@ -8595,7 +8595,7 @@ func (s *OpenTracingLayerUserStore) GetProfilesInChannel(options *model.UserGetO return result, err } -func (s *OpenTracingLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfilesInChannelByStatus") s.Root.Store.SetContext(newCtx) @@ -8613,7 +8613,7 @@ func (s *OpenTracingLayerUserStore) GetProfilesInChannelByStatus(options *model. return result, err } -func (s *OpenTracingLayerUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfilesNotInChannel") s.Root.Store.SetContext(newCtx) @@ -8631,7 +8631,7 @@ func (s *OpenTracingLayerUserStore) GetProfilesNotInChannel(teamId string, chann return result, err } -func (s *OpenTracingLayerUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfilesNotInTeam") s.Root.Store.SetContext(newCtx) @@ -8649,7 +8649,7 @@ func (s *OpenTracingLayerUserStore) GetProfilesNotInTeam(teamId string, groupCon return result, err } -func (s *OpenTracingLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetProfilesWithoutTeam") s.Root.Store.SetContext(newCtx) @@ -8667,7 +8667,7 @@ func (s *OpenTracingLayerUserStore) GetProfilesWithoutTeam(options *model.UserGe return result, err } -func (s *OpenTracingLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetRecentlyActiveUsersForTeam") s.Root.Store.SetContext(newCtx) @@ -8685,7 +8685,7 @@ func (s *OpenTracingLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, return result, err } -func (s *OpenTracingLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetSystemAdminProfiles") s.Root.Store.SetContext(newCtx) @@ -8703,7 +8703,7 @@ func (s *OpenTracingLayerUserStore) GetSystemAdminProfiles() (map[string]*model. return result, err } -func (s *OpenTracingLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetTeamGroupUsers") s.Root.Store.SetContext(newCtx) @@ -8721,7 +8721,7 @@ func (s *OpenTracingLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.U return result, err } -func (s *OpenTracingLayerUserStore) GetUnreadCount(userId string) (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetUnreadCount(userId string) (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetUnreadCount") s.Root.Store.SetContext(newCtx) @@ -8739,7 +8739,7 @@ func (s *OpenTracingLayerUserStore) GetUnreadCount(userId string) (int64, *model return result, err } -func (s *OpenTracingLayerUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetUnreadCountForChannel") s.Root.Store.SetContext(newCtx) @@ -8757,7 +8757,7 @@ func (s *OpenTracingLayerUserStore) GetUnreadCountForChannel(userId string, chan return result, err } -func (s *OpenTracingLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, *model.AppError) { +func (s *OpenTracingLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.GetUsersBatchForIndexing") s.Root.Store.SetContext(newCtx) @@ -8775,7 +8775,7 @@ func (s *OpenTracingLayerUserStore) GetUsersBatchForIndexing(startTime int64, en return result, err } -func (s *OpenTracingLayerUserStore) InferSystemInstallDate() (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) InferSystemInstallDate() (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.InferSystemInstallDate") s.Root.Store.SetContext(newCtx) @@ -8832,7 +8832,7 @@ func (s *OpenTracingLayerUserStore) InvalidateProfilesInChannelCacheByUser(userI } -func (s *OpenTracingLayerUserStore) PermanentDelete(userId string) *model.AppError { +func (s *OpenTracingLayerUserStore) PermanentDelete(userId string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.PermanentDelete") s.Root.Store.SetContext(newCtx) @@ -8850,7 +8850,7 @@ func (s *OpenTracingLayerUserStore) PermanentDelete(userId string) *model.AppErr return err } -func (s *OpenTracingLayerUserStore) PromoteGuestToUser(userID string) *model.AppError { +func (s *OpenTracingLayerUserStore) PromoteGuestToUser(userID string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.PromoteGuestToUser") s.Root.Store.SetContext(newCtx) @@ -8868,7 +8868,7 @@ func (s *OpenTracingLayerUserStore) PromoteGuestToUser(userID string) *model.App return err } -func (s *OpenTracingLayerUserStore) ResetLastPictureUpdate(userId string) *model.AppError { +func (s *OpenTracingLayerUserStore) ResetLastPictureUpdate(userId string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.ResetLastPictureUpdate") s.Root.Store.SetContext(newCtx) @@ -8886,7 +8886,7 @@ func (s *OpenTracingLayerUserStore) ResetLastPictureUpdate(userId string) *model return err } -func (s *OpenTracingLayerUserStore) Save(user *model.User) (*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) Save(user *model.User) (*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.Save") s.Root.Store.SetContext(newCtx) @@ -8904,7 +8904,7 @@ func (s *OpenTracingLayerUserStore) Save(user *model.User) (*model.User, *model. return result, err } -func (s *OpenTracingLayerUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.Search") s.Root.Store.SetContext(newCtx) @@ -8922,7 +8922,7 @@ func (s *OpenTracingLayerUserStore) Search(teamId string, term string, options * return result, err } -func (s *OpenTracingLayerUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.SearchInChannel") s.Root.Store.SetContext(newCtx) @@ -8940,7 +8940,7 @@ func (s *OpenTracingLayerUserStore) SearchInChannel(channelId string, term strin return result, err } -func (s *OpenTracingLayerUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.SearchInGroup") s.Root.Store.SetContext(newCtx) @@ -8958,7 +8958,7 @@ func (s *OpenTracingLayerUserStore) SearchInGroup(groupID string, term string, o return result, err } -func (s *OpenTracingLayerUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.SearchNotInChannel") s.Root.Store.SetContext(newCtx) @@ -8976,7 +8976,7 @@ func (s *OpenTracingLayerUserStore) SearchNotInChannel(teamId string, channelId return result, err } -func (s *OpenTracingLayerUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.SearchNotInTeam") s.Root.Store.SetContext(newCtx) @@ -8994,7 +8994,7 @@ func (s *OpenTracingLayerUserStore) SearchNotInTeam(notInTeamId string, term str return result, err } -func (s *OpenTracingLayerUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *OpenTracingLayerUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.SearchWithoutTeam") s.Root.Store.SetContext(newCtx) @@ -9012,7 +9012,7 @@ func (s *OpenTracingLayerUserStore) SearchWithoutTeam(term string, options *mode return result, err } -func (s *OpenTracingLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, *model.AppError) { +func (s *OpenTracingLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.Update") s.Root.Store.SetContext(newCtx) @@ -9030,7 +9030,7 @@ func (s *OpenTracingLayerUserStore) Update(user *model.User, allowRoleUpdate boo return result, err } -func (s *OpenTracingLayerUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError) { +func (s *OpenTracingLayerUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdateAuthData") s.Root.Store.SetContext(newCtx) @@ -9048,7 +9048,7 @@ func (s *OpenTracingLayerUserStore) UpdateAuthData(userId string, service string return result, err } -func (s *OpenTracingLayerUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError { +func (s *OpenTracingLayerUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdateFailedPasswordAttempts") s.Root.Store.SetContext(newCtx) @@ -9066,7 +9066,7 @@ func (s *OpenTracingLayerUserStore) UpdateFailedPasswordAttempts(userId string, return err } -func (s *OpenTracingLayerUserStore) UpdateLastPictureUpdate(userId string) *model.AppError { +func (s *OpenTracingLayerUserStore) UpdateLastPictureUpdate(userId string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdateLastPictureUpdate") s.Root.Store.SetContext(newCtx) @@ -9084,7 +9084,7 @@ func (s *OpenTracingLayerUserStore) UpdateLastPictureUpdate(userId string) *mode return err } -func (s *OpenTracingLayerUserStore) UpdateMfaActive(userId string, active bool) *model.AppError { +func (s *OpenTracingLayerUserStore) UpdateMfaActive(userId string, active bool) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdateMfaActive") s.Root.Store.SetContext(newCtx) @@ -9102,7 +9102,7 @@ func (s *OpenTracingLayerUserStore) UpdateMfaActive(userId string, active bool) return err } -func (s *OpenTracingLayerUserStore) UpdateMfaSecret(userId string, secret string) *model.AppError { +func (s *OpenTracingLayerUserStore) UpdateMfaSecret(userId string, secret string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdateMfaSecret") s.Root.Store.SetContext(newCtx) @@ -9120,7 +9120,7 @@ func (s *OpenTracingLayerUserStore) UpdateMfaSecret(userId string, secret string return err } -func (s *OpenTracingLayerUserStore) UpdatePassword(userId string, newPassword string) *model.AppError { +func (s *OpenTracingLayerUserStore) UpdatePassword(userId string, newPassword string) error { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdatePassword") s.Root.Store.SetContext(newCtx) @@ -9138,7 +9138,7 @@ func (s *OpenTracingLayerUserStore) UpdatePassword(userId string, newPassword st return err } -func (s *OpenTracingLayerUserStore) UpdateUpdateAt(userId string) (int64, *model.AppError) { +func (s *OpenTracingLayerUserStore) UpdateUpdateAt(userId string) (int64, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.UpdateUpdateAt") s.Root.Store.SetContext(newCtx) @@ -9156,7 +9156,7 @@ func (s *OpenTracingLayerUserStore) UpdateUpdateAt(userId string) (int64, *model return result, err } -func (s *OpenTracingLayerUserStore) VerifyEmail(userId string, email string) (string, *model.AppError) { +func (s *OpenTracingLayerUserStore) VerifyEmail(userId string, email string) (string, error) { origCtx := s.Root.Store.Context() span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "UserStore.VerifyEmail") s.Root.Store.SetContext(newCtx) diff --git a/store/retrylayer/retrylayer.go b/store/retrylayer/retrylayer.go index e4fa2d48e9..58b49a9020 100644 --- a/store/retrylayer/retrylayer.go +++ b/store/retrylayer/retrylayer.go @@ -8048,9 +8048,23 @@ func (s *RetryLayerUploadSessionStore) Update(session *model.UploadSession) erro } -func (s *RetryLayerUserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, *model.AppError) { +func (s *RetryLayerUserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, error) { - return s.UserStore.AnalyticsActiveCount(time, options) + tries := 0 + for { + result, err := s.UserStore.AnalyticsActiveCount(time, options) + 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 + } + } } @@ -8074,39 +8088,123 @@ func (s *RetryLayerUserStore) AnalyticsActiveCountForPeriod(startTime int64, end } -func (s *RetryLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, *model.AppError) { +func (s *RetryLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, error) { - return s.UserStore.AnalyticsGetExternalUsers(hostDomain) + tries := 0 + for { + result, err := s.UserStore.AnalyticsGetExternalUsers(hostDomain) + 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 + } + } } -func (s *RetryLayerUserStore) AnalyticsGetGuestCount() (int64, *model.AppError) { +func (s *RetryLayerUserStore) AnalyticsGetGuestCount() (int64, error) { - return s.UserStore.AnalyticsGetGuestCount() + tries := 0 + for { + result, err := s.UserStore.AnalyticsGetGuestCount() + 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 + } + } } -func (s *RetryLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, *model.AppError) { +func (s *RetryLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, error) { - return s.UserStore.AnalyticsGetInactiveUsersCount() + tries := 0 + for { + result, err := s.UserStore.AnalyticsGetInactiveUsersCount() + 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 + } + } } -func (s *RetryLayerUserStore) AnalyticsGetSystemAdminCount() (int64, *model.AppError) { +func (s *RetryLayerUserStore) AnalyticsGetSystemAdminCount() (int64, error) { - return s.UserStore.AnalyticsGetSystemAdminCount() + tries := 0 + for { + result, err := s.UserStore.AnalyticsGetSystemAdminCount() + 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 + } + } } -func (s *RetryLayerUserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, *model.AppError) { +func (s *RetryLayerUserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) { - return s.UserStore.AutocompleteUsersInChannel(teamId, channelId, term, options) + tries := 0 + for { + result, err := s.UserStore.AutocompleteUsersInChannel(teamId, channelId, term, options) + 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 + } + } } -func (s *RetryLayerUserStore) ClearAllCustomRoleAssignments() *model.AppError { +func (s *RetryLayerUserStore) ClearAllCustomRoleAssignments() error { - return s.UserStore.ClearAllCustomRoleAssignments() + tries := 0 + for { + err := s.UserStore.ClearAllCustomRoleAssignments() + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } @@ -8116,93 +8214,303 @@ func (s *RetryLayerUserStore) ClearCaches() { } -func (s *RetryLayerUserStore) Count(options model.UserCountOptions) (int64, *model.AppError) { +func (s *RetryLayerUserStore) Count(options model.UserCountOptions) (int64, error) { - return s.UserStore.Count(options) + tries := 0 + for { + result, err := s.UserStore.Count(options) + 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 + } + } } -func (s *RetryLayerUserStore) DeactivateGuests() ([]string, *model.AppError) { +func (s *RetryLayerUserStore) DeactivateGuests() ([]string, error) { - return s.UserStore.DeactivateGuests() + tries := 0 + for { + result, err := s.UserStore.DeactivateGuests() + 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 + } + } } -func (s *RetryLayerUserStore) DemoteUserToGuest(userID string) *model.AppError { +func (s *RetryLayerUserStore) DemoteUserToGuest(userID string) error { - return s.UserStore.DemoteUserToGuest(userID) + tries := 0 + for { + err := s.UserStore.DemoteUserToGuest(userID) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) Get(id string) (*model.User, *model.AppError) { +func (s *RetryLayerUserStore) Get(id string) (*model.User, error) { - return s.UserStore.Get(id) + tries := 0 + for { + result, err := s.UserStore.Get(id) + 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 + } + } } -func (s *RetryLayerUserStore) GetAll() ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetAll() ([]*model.User, error) { - return s.UserStore.GetAll() + tries := 0 + for { + result, err := s.UserStore.GetAll() + 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 + } + } } -func (s *RetryLayerUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, error) { - return s.UserStore.GetAllAfter(limit, afterId) + tries := 0 + for { + result, err := s.UserStore.GetAllAfter(limit, afterId) + 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 + } + } } -func (s *RetryLayerUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, error) { - return s.UserStore.GetAllNotInAuthService(authServices) + tries := 0 + for { + result, err := s.UserStore.GetAllNotInAuthService(authServices) + 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 + } + } } -func (s *RetryLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, error) { - return s.UserStore.GetAllProfiles(options) + tries := 0 + for { + result, err := s.UserStore.GetAllProfiles(options) + 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 + } + } } -func (s *RetryLayerUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, error) { - return s.UserStore.GetAllProfilesInChannel(channelId, allowFromCache) + tries := 0 + for { + result, err := s.UserStore.GetAllProfilesInChannel(channelId, allowFromCache) + 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 + } + } } -func (s *RetryLayerUserStore) GetAllUsingAuthService(authService string) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetAllUsingAuthService(authService string) ([]*model.User, error) { - return s.UserStore.GetAllUsingAuthService(authService) + tries := 0 + for { + result, err := s.UserStore.GetAllUsingAuthService(authService) + 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 + } + } } -func (s *RetryLayerUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (s *RetryLayerUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, error) { - return s.UserStore.GetAnyUnreadPostCountForChannel(userId, channelId) + tries := 0 + for { + result, err := s.UserStore.GetAnyUnreadPostCountForChannel(userId, channelId) + 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 + } + } } -func (s *RetryLayerUserStore) GetByAuth(authData *string, authService string) (*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetByAuth(authData *string, authService string) (*model.User, error) { - return s.UserStore.GetByAuth(authData, authService) + tries := 0 + for { + result, err := s.UserStore.GetByAuth(authData, authService) + 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 + } + } } -func (s *RetryLayerUserStore) GetByEmail(email string) (*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetByEmail(email string) (*model.User, error) { - return s.UserStore.GetByEmail(email) + tries := 0 + for { + result, err := s.UserStore.GetByEmail(email) + 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 + } + } } -func (s *RetryLayerUserStore) GetByUsername(username string) (*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetByUsername(username string) (*model.User, error) { - return s.UserStore.GetByUsername(username) + tries := 0 + for { + result, err := s.UserStore.GetByUsername(username) + 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 + } + } } -func (s *RetryLayerUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, error) { - return s.UserStore.GetChannelGroupUsers(channelID) + tries := 0 + for { + result, err := s.UserStore.GetChannelGroupUsers(channelID) + 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 + } + } } @@ -8224,117 +8532,383 @@ func (s *RetryLayerUserStore) GetEtagForProfilesNotInTeam(teamId string) string } -func (s *RetryLayerUserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, error) { - return s.UserStore.GetForLogin(loginId, allowSignInWithUsername, allowSignInWithEmail) + tries := 0 + for { + result, err := s.UserStore.GetForLogin(loginId, allowSignInWithUsername, allowSignInWithEmail) + 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 + } + } } -func (s *RetryLayerUserStore) GetKnownUsers(userID string) ([]string, *model.AppError) { +func (s *RetryLayerUserStore) GetKnownUsers(userID string) ([]string, error) { - return s.UserStore.GetKnownUsers(userID) + tries := 0 + for { + result, err := s.UserStore.GetKnownUsers(userID) + 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 + } + } } -func (s *RetryLayerUserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { - return s.UserStore.GetNewUsersForTeam(teamId, offset, limit, viewRestrictions) + tries := 0 + for { + result, err := s.UserStore.GetNewUsersForTeam(teamId, offset, limit, viewRestrictions) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, error) { - return s.UserStore.GetProfileByGroupChannelIdsForUser(userId, channelIds) + tries := 0 + for { + result, err := s.UserStore.GetProfileByGroupChannelIdsForUser(userId, channelIds) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) { - return s.UserStore.GetProfileByIds(userIds, options, allowFromCache) + tries := 0 + for { + result, err := s.UserStore.GetProfileByIds(userIds, options, allowFromCache) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, error) { - return s.UserStore.GetProfiles(options) + tries := 0 + for { + result, err := s.UserStore.GetProfiles(options) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { - return s.UserStore.GetProfilesByUsernames(usernames, viewRestrictions) + tries := 0 + for { + result, err := s.UserStore.GetProfilesByUsernames(usernames, viewRestrictions) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, error) { - return s.UserStore.GetProfilesInChannel(options) + tries := 0 + for { + result, err := s.UserStore.GetProfilesInChannel(options) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, error) { - return s.UserStore.GetProfilesInChannelByStatus(options) + tries := 0 + for { + result, err := s.UserStore.GetProfilesInChannelByStatus(options) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { - return s.UserStore.GetProfilesNotInChannel(teamId, channelId, groupConstrained, offset, limit, viewRestrictions) + tries := 0 + for { + result, err := s.UserStore.GetProfilesNotInChannel(teamId, channelId, groupConstrained, offset, limit, viewRestrictions) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { - return s.UserStore.GetProfilesNotInTeam(teamId, groupConstrained, offset, limit, viewRestrictions) + tries := 0 + for { + result, err := s.UserStore.GetProfilesNotInTeam(teamId, groupConstrained, offset, limit, viewRestrictions) + 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 + } + } } -func (s *RetryLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, error) { - return s.UserStore.GetProfilesWithoutTeam(options) + tries := 0 + for { + result, err := s.UserStore.GetProfilesWithoutTeam(options) + 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 + } + } } -func (s *RetryLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { - return s.UserStore.GetRecentlyActiveUsersForTeam(teamId, offset, limit, viewRestrictions) + tries := 0 + for { + result, err := s.UserStore.GetRecentlyActiveUsersForTeam(teamId, offset, limit, viewRestrictions) + 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 + } + } } -func (s *RetryLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, error) { - return s.UserStore.GetSystemAdminProfiles() + tries := 0 + for { + result, err := s.UserStore.GetSystemAdminProfiles() + 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 + } + } } -func (s *RetryLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, error) { - return s.UserStore.GetTeamGroupUsers(teamID) + tries := 0 + for { + result, err := s.UserStore.GetTeamGroupUsers(teamID) + 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 + } + } } -func (s *RetryLayerUserStore) GetUnreadCount(userId string) (int64, *model.AppError) { +func (s *RetryLayerUserStore) GetUnreadCount(userId string) (int64, error) { - return s.UserStore.GetUnreadCount(userId) + tries := 0 + for { + result, err := s.UserStore.GetUnreadCount(userId) + 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 + } + } } -func (s *RetryLayerUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (s *RetryLayerUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, error) { - return s.UserStore.GetUnreadCountForChannel(userId, channelId) + tries := 0 + for { + result, err := s.UserStore.GetUnreadCountForChannel(userId, channelId) + 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 + } + } } -func (s *RetryLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, *model.AppError) { +func (s *RetryLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, error) { - return s.UserStore.GetUsersBatchForIndexing(startTime, endTime, limit) + tries := 0 + for { + result, err := s.UserStore.GetUsersBatchForIndexing(startTime, endTime, limit) + 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 + } + } } -func (s *RetryLayerUserStore) InferSystemInstallDate() (int64, *model.AppError) { +func (s *RetryLayerUserStore) InferSystemInstallDate() (int64, error) { - return s.UserStore.InferSystemInstallDate() + tries := 0 + for { + result, err := s.UserStore.InferSystemInstallDate() + 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 + } + } } @@ -8356,117 +8930,383 @@ func (s *RetryLayerUserStore) InvalidateProfilesInChannelCacheByUser(userId stri } -func (s *RetryLayerUserStore) PermanentDelete(userId string) *model.AppError { +func (s *RetryLayerUserStore) PermanentDelete(userId string) error { - return s.UserStore.PermanentDelete(userId) + tries := 0 + for { + err := s.UserStore.PermanentDelete(userId) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) PromoteGuestToUser(userID string) *model.AppError { +func (s *RetryLayerUserStore) PromoteGuestToUser(userID string) error { - return s.UserStore.PromoteGuestToUser(userID) + tries := 0 + for { + err := s.UserStore.PromoteGuestToUser(userID) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) ResetLastPictureUpdate(userId string) *model.AppError { +func (s *RetryLayerUserStore) ResetLastPictureUpdate(userId string) error { - return s.UserStore.ResetLastPictureUpdate(userId) + tries := 0 + for { + err := s.UserStore.ResetLastPictureUpdate(userId) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) Save(user *model.User) (*model.User, *model.AppError) { +func (s *RetryLayerUserStore) Save(user *model.User) (*model.User, error) { - return s.UserStore.Save(user) + tries := 0 + for { + result, err := s.UserStore.Save(user) + 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 + } + } } -func (s *RetryLayerUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { - return s.UserStore.Search(teamId, term, options) + tries := 0 + for { + result, err := s.UserStore.Search(teamId, term, options) + 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 + } + } } -func (s *RetryLayerUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { - return s.UserStore.SearchInChannel(channelId, term, options) + tries := 0 + for { + result, err := s.UserStore.SearchInChannel(channelId, term, options) + 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 + } + } } -func (s *RetryLayerUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) { - return s.UserStore.SearchInGroup(groupID, term, options) + tries := 0 + for { + result, err := s.UserStore.SearchInGroup(groupID, term, options) + 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 + } + } } -func (s *RetryLayerUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { - return s.UserStore.SearchNotInChannel(teamId, channelId, term, options) + tries := 0 + for { + result, err := s.UserStore.SearchNotInChannel(teamId, channelId, term, options) + 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 + } + } } -func (s *RetryLayerUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { - return s.UserStore.SearchNotInTeam(notInTeamId, term, options) + tries := 0 + for { + result, err := s.UserStore.SearchNotInTeam(notInTeamId, term, options) + 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 + } + } } -func (s *RetryLayerUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *RetryLayerUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, error) { - return s.UserStore.SearchWithoutTeam(term, options) + tries := 0 + for { + result, err := s.UserStore.SearchWithoutTeam(term, options) + 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 + } + } } -func (s *RetryLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, *model.AppError) { +func (s *RetryLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error) { - return s.UserStore.Update(user, allowRoleUpdate) + tries := 0 + for { + result, err := s.UserStore.Update(user, allowRoleUpdate) + 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 + } + } } -func (s *RetryLayerUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError) { +func (s *RetryLayerUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, error) { - return s.UserStore.UpdateAuthData(userId, service, authData, email, resetMfa) + tries := 0 + for { + result, err := s.UserStore.UpdateAuthData(userId, service, authData, email, resetMfa) + 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 + } + } } -func (s *RetryLayerUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError { +func (s *RetryLayerUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) error { - return s.UserStore.UpdateFailedPasswordAttempts(userId, attempts) + tries := 0 + for { + err := s.UserStore.UpdateFailedPasswordAttempts(userId, attempts) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) UpdateLastPictureUpdate(userId string) *model.AppError { +func (s *RetryLayerUserStore) UpdateLastPictureUpdate(userId string) error { - return s.UserStore.UpdateLastPictureUpdate(userId) + tries := 0 + for { + err := s.UserStore.UpdateLastPictureUpdate(userId) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) UpdateMfaActive(userId string, active bool) *model.AppError { +func (s *RetryLayerUserStore) UpdateMfaActive(userId string, active bool) error { - return s.UserStore.UpdateMfaActive(userId, active) + tries := 0 + for { + err := s.UserStore.UpdateMfaActive(userId, active) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) UpdateMfaSecret(userId string, secret string) *model.AppError { +func (s *RetryLayerUserStore) UpdateMfaSecret(userId string, secret string) error { - return s.UserStore.UpdateMfaSecret(userId, secret) + tries := 0 + for { + err := s.UserStore.UpdateMfaSecret(userId, secret) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) UpdatePassword(userId string, newPassword string) *model.AppError { +func (s *RetryLayerUserStore) UpdatePassword(userId string, newPassword string) error { - return s.UserStore.UpdatePassword(userId, newPassword) + tries := 0 + for { + err := s.UserStore.UpdatePassword(userId, newPassword) + if err == nil { + return nil + } + if !isRepeatableError(err) { + return err + } + tries++ + if tries >= 3 { + err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures") + return err + } + } } -func (s *RetryLayerUserStore) UpdateUpdateAt(userId string) (int64, *model.AppError) { +func (s *RetryLayerUserStore) UpdateUpdateAt(userId string) (int64, error) { - return s.UserStore.UpdateUpdateAt(userId) + tries := 0 + for { + result, err := s.UserStore.UpdateUpdateAt(userId) + 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 + } + } } -func (s *RetryLayerUserStore) VerifyEmail(userId string, email string) (string, *model.AppError) { +func (s *RetryLayerUserStore) VerifyEmail(userId string, email string) (string, error) { - return s.UserStore.VerifyEmail(userId, email) + tries := 0 + for { + result, err := s.UserStore.VerifyEmail(userId, email) + 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 + } + } } diff --git a/store/searchlayer/user_layer.go b/store/searchlayer/user_layer.go index e30b777da1..674ae627fc 100644 --- a/store/searchlayer/user_layer.go +++ b/store/searchlayer/user_layer.go @@ -33,7 +33,7 @@ func (s *SearchUserStore) deleteUserIndex(user *model.User) { } } -func (s *SearchUserStore) Search(teamId, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *SearchUserStore) Search(teamId, term string, options *model.UserSearchOptions) ([]*model.User, error) { for _, engine := range s.rootStore.searchEngine.GetActiveEngines() { if engine.IsSearchEnabled() { listOfAllowedChannels, err := s.getListOfAllowedChannelsForTeam(teamId, options.ViewRestrictions) @@ -54,9 +54,9 @@ func (s *SearchUserStore) Search(teamId, term string, options *model.UserSearchO continue } - users, err := s.UserStore.GetProfileByIds(usersIds, nil, false) - if err != nil { - mlog.Error("Encountered error on Search", mlog.String("search_engine", engine.GetName()), mlog.Err(err)) + users, nErr := s.UserStore.GetProfileByIds(usersIds, nil, false) + if nErr != nil { + mlog.Error("Encountered error on Search", mlog.String("search_engine", engine.GetName()), mlog.Err(nErr)) continue } @@ -70,7 +70,7 @@ func (s *SearchUserStore) Search(teamId, term string, options *model.UserSearchO return s.UserStore.Search(teamId, term, options) } -func (s *SearchUserStore) Update(user *model.User, trustedUpdateData bool) (*model.UserUpdate, *model.AppError) { +func (s *SearchUserStore) Update(user *model.User, trustedUpdateData bool) (*model.UserUpdate, error) { userUpdate, err := s.UserStore.Update(user, trustedUpdateData) if err == nil { @@ -79,7 +79,7 @@ func (s *SearchUserStore) Update(user *model.User, trustedUpdateData bool) (*mod return userUpdate, err } -func (s *SearchUserStore) Save(user *model.User) (*model.User, *model.AppError) { +func (s *SearchUserStore) Save(user *model.User) (*model.User, error) { nuser, err := s.UserStore.Save(user) if err == nil { @@ -88,7 +88,7 @@ func (s *SearchUserStore) Save(user *model.User) (*model.User, *model.AppError) return nuser, err } -func (s *SearchUserStore) PermanentDelete(userId string) *model.AppError { +func (s *SearchUserStore) PermanentDelete(userId string) error { user, userErr := s.UserStore.Get(userId) if userErr != nil { mlog.Error("Encountered error deleting user", mlog.String("user_id", userId), mlog.Err(userErr)) @@ -117,29 +117,29 @@ func (s *SearchUserStore) autocompleteUsersInChannelByEngine(engine searchengine uchan := make(chan store.StoreResult, 1) go func() { users, err := s.UserStore.GetProfileByIds(uchanIds, nil, false) - uchan <- store.StoreResult{Data: users, Err: err} + uchan <- store.StoreResult{Data: users, NErr: err} close(uchan) }() nuchan := make(chan store.StoreResult, 1) go func() { users, err := s.UserStore.GetProfileByIds(nuchanIds, nil, false) - nuchan <- store.StoreResult{Data: users, Err: err} + nuchan <- store.StoreResult{Data: users, NErr: err} close(nuchan) }() autocomplete := &model.UserAutocompleteInChannel{} result := <-uchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + return nil, model.NewAppError("autocompleteUsersInChannelByEngine", "app.user.get_profiles.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) } inUsers := result.Data.([]*model.User) autocomplete.InChannel = inUsers result = <-nuchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + return nil, model.NewAppError("autocompleteUsersInChannelByEngine", "app.user.get_profiles.app_error", nil, result.NErr.Error(), http.StatusInternalServerError) } outUsers := result.Data.([]*model.User) autocomplete.OutOfChannel = outUsers @@ -198,7 +198,7 @@ func (s *SearchUserStore) getListOfAllowedChannelsForTeam(teamId string, viewRes return []string{}, nil } -func (s *SearchUserStore) AutocompleteUsersInChannel(teamId, channelId, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, *model.AppError) { +func (s *SearchUserStore) AutocompleteUsersInChannel(teamId, channelId, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) { for _, engine := range s.rootStore.searchEngine.GetActiveEngines() { if engine.IsAutocompletionEnabled() { listOfAllowedChannels, err := s.getListOfAllowedChannelsForTeam(teamId, options.ViewRestrictions) diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index 3b9d1b940d..1297ed7357 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -7,17 +7,16 @@ import ( "database/sql" "encoding/json" "fmt" - "net/http" "sort" "strings" - sq "github.com/Masterminds/squirrel" "github.com/mattermost/gorp" - "github.com/pkg/errors" - "github.com/mattermost/mattermost-server/v5/einterfaces" "github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/store" + + sq "github.com/Masterminds/squirrel" + "github.com/pkg/errors" ) const ( @@ -99,9 +98,9 @@ func (us SqlUserStore) createIndexesIfNotExists() { us.CreateFullTextIndexIfNotExists("idx_users_names_no_full_name_txt", "Users", strings.Join(USER_SEARCH_TYPE_NAMES_NO_FULL_NAME, ", ")) } -func (us SqlUserStore) Save(user *model.User) (*model.User, *model.AppError) { +func (us SqlUserStore) Save(user *model.User) (*model.User, error) { if len(user.Id) > 0 { - return nil, model.NewAppError("SqlUserStore.Save", "store.sql_user.save.existing.app_error", nil, "user_id="+user.Id, http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "id", user.Id) } user.PreSave() @@ -111,18 +110,18 @@ func (us SqlUserStore) Save(user *model.User) (*model.User, *model.AppError) { if err := us.GetMaster().Insert(user); err != nil { if IsUniqueConstraintError(err, []string{"Email", "users_email_key", "idx_users_email_unique"}) { - return nil, model.NewAppError("SqlUserStore.Save", "store.sql_user.save.email_exists.app_error", nil, "user_id="+user.Id+", "+err.Error(), http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "email", user.Email) } if IsUniqueConstraintError(err, []string{"Username", "users_username_key", "idx_users_username_unique"}) { - return nil, model.NewAppError("SqlUserStore.Save", "store.sql_user.save.username_exists.app_error", nil, "user_id="+user.Id+", "+err.Error(), http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "username", user.Username) } - return nil, model.NewAppError("SqlUserStore.Save", "store.sql_user.save.app_error", nil, "user_id="+user.Id+", "+err.Error(), http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to save User with userId=%s", user.Id) } return user, nil } -func (us SqlUserStore) DeactivateGuests() ([]string, *model.AppError) { +func (us SqlUserStore) DeactivateGuests() ([]string, error) { curTime := model.GetMillis() updateQuery := us.getQueryBuilder().Update("Users"). Set("UpdateAt", curTime). @@ -132,31 +131,31 @@ func (us SqlUserStore) DeactivateGuests() ([]string, *model.AppError) { queryString, args, err := updateQuery.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.UpdateActiveForMultipleUsers", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "deactivate_guests_tosql") } _, err = us.GetMaster().Exec(queryString, args...) if err != nil { - return nil, model.NewAppError("SqlUserStore.UpdateActiveForMultipleUsers", "store.sql_user.update_active_for_multiple_users.updating.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to update Users with roles=system_guest") } selectQuery := us.getQueryBuilder().Select("Id").From("Users").Where(sq.Eq{"DeleteAt": curTime}) queryString, args, err = selectQuery.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.UpdateActiveForMultipleUsers", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "deactivate_guests_tosql") } userIds := []string{} _, err = us.GetMaster().Select(&userIds, queryString, args...) if err != nil { - return nil, model.NewAppError("SqlUserStore.UpdateActiveForMultipleUsers", "store.sql_user.update_active_for_multiple_users.getting_changed_users.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } return userIds, nil } -func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) (*model.UserUpdate, *model.AppError) { +func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) (*model.UserUpdate, error) { user.PreUpdate() if err := user.IsValid(); err != nil { @@ -165,11 +164,11 @@ func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) (*model. oldUserResult, err := us.GetMaster().Get(model.User{}, user.Id) if err != nil { - return nil, model.NewAppError("SqlUserStore.Update", "store.sql_user.update.finding.app_error", nil, "user_id="+user.Id+", "+err.Error(), http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to get User with userId=%s", user.Id) } if oldUserResult == nil { - return nil, model.NewAppError("SqlUserStore.Update", "store.sql_user.update.find.app_error", nil, "user_id="+user.Id, http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "id", user.Id) } oldUser := oldUserResult.(*model.User) @@ -195,7 +194,7 @@ func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) (*model. } } else if user.IsLDAPUser() && !trustedUpdateData { if user.Username != oldUser.Username || user.Email != oldUser.Email { - return nil, model.NewAppError("SqlUserStore.Update", "store.sql_user.update.can_not_change_ldap.app_error", nil, "user_id="+user.Id, http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "id", user.Id) } } else if user.Email != oldUser.Email { user.EmailVerified = false @@ -208,16 +207,16 @@ func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) (*model. count, err := us.GetMaster().Update(user) if err != nil { if IsUniqueConstraintError(err, []string{"Email", "users_email_key", "idx_users_email_unique"}) { - return nil, model.NewAppError("SqlUserStore.Update", "store.sql_user.update.email_taken.app_error", nil, "user_id="+user.Id+", "+err.Error(), http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "id", user.Id) } if IsUniqueConstraintError(err, []string{"Username", "users_username_key", "idx_users_username_unique"}) { - return nil, model.NewAppError("SqlUserStore.Update", "store.sql_user.update.username_taken.app_error", nil, "user_id="+user.Id+", "+err.Error(), http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "id", user.Id) } - return nil, model.NewAppError("SqlUserStore.Update", "store.sql_user.update.updating.app_error", nil, "user_id="+user.Id+", "+err.Error(), http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to update User with userId=%s", user.Id) } if count > 1 { - return nil, model.NewAppError("SqlUserStore.Update", "store.sql_user.update.app_error", nil, fmt.Sprintf("user_id=%v, count=%v", user.Id, count), http.StatusInternalServerError) + return nil, fmt.Errorf("multiple users were update: userId=%s, count=%d", user.Id, count) } user.Sanitize(map[string]bool{}) @@ -225,55 +224,55 @@ func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) (*model. return &model.UserUpdate{New: user, Old: oldUser}, nil } -func (us SqlUserStore) UpdateLastPictureUpdate(userId string) *model.AppError { +func (us SqlUserStore) UpdateLastPictureUpdate(userId string) error { curTime := model.GetMillis() if _, err := us.GetMaster().Exec("UPDATE Users SET LastPictureUpdate = :Time, UpdateAt = :Time WHERE Id = :UserId", map[string]interface{}{"Time": curTime, "UserId": userId}); err != nil { - return model.NewAppError("SqlUserStore.UpdateLastPictureUpdate", "store.sql_user.update_last_picture_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } return nil } -func (us SqlUserStore) ResetLastPictureUpdate(userId string) *model.AppError { +func (us SqlUserStore) ResetLastPictureUpdate(userId string) error { curTime := model.GetMillis() if _, err := us.GetMaster().Exec("UPDATE Users SET LastPictureUpdate = :PictureUpdateTime, UpdateAt = :UpdateTime WHERE Id = :UserId", map[string]interface{}{"PictureUpdateTime": 0, "UpdateTime": curTime, "UserId": userId}); err != nil { - return model.NewAppError("SqlUserStore.ResetLastPictureUpdate", "store.sql_user.update_last_picture_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } return nil } -func (us SqlUserStore) UpdateUpdateAt(userId string) (int64, *model.AppError) { +func (us SqlUserStore) UpdateUpdateAt(userId string) (int64, error) { curTime := model.GetMillis() if _, err := us.GetMaster().Exec("UPDATE Users SET UpdateAt = :Time WHERE Id = :UserId", map[string]interface{}{"Time": curTime, "UserId": userId}); err != nil { - return curTime, model.NewAppError("SqlUserStore.UpdateUpdateAt", "store.sql_user.update_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return curTime, errors.Wrapf(err, "failed to update User with userId=%s", userId) } return curTime, nil } -func (us SqlUserStore) UpdatePassword(userId, hashedPassword string) *model.AppError { +func (us SqlUserStore) UpdatePassword(userId, hashedPassword string) error { updateAt := model.GetMillis() if _, err := us.GetMaster().Exec("UPDATE Users SET Password = :Password, LastPasswordUpdate = :LastPasswordUpdate, UpdateAt = :UpdateAt, AuthData = NULL, AuthService = '', FailedAttempts = 0 WHERE Id = :UserId", map[string]interface{}{"Password": hashedPassword, "LastPasswordUpdate": updateAt, "UpdateAt": updateAt, "UserId": userId}); err != nil { - return model.NewAppError("SqlUserStore.UpdatePassword", "store.sql_user.update_password.app_error", nil, "id="+userId+", "+err.Error(), http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } return nil } -func (us SqlUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError { +func (us SqlUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) error { if _, err := us.GetMaster().Exec("UPDATE Users SET FailedAttempts = :FailedAttempts WHERE Id = :UserId", map[string]interface{}{"FailedAttempts": attempts, "UserId": userId}); err != nil { - return model.NewAppError("SqlUserStore.UpdateFailedPasswordAttempts", "store.sql_user.update_failed_pwd_attempts.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } return nil } -func (us SqlUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError) { +func (us SqlUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, error) { updateAt := model.GetMillis() query := ` @@ -299,43 +298,38 @@ func (us SqlUserStore) UpdateAuthData(userId string, service string, authData *s if _, err := us.GetMaster().Exec(query, map[string]interface{}{"LastPasswordUpdate": updateAt, "UpdateAt": updateAt, "UserId": userId, "AuthService": service, "AuthData": authData, "Email": email}); err != nil { if IsUniqueConstraintError(err, []string{"Email", "users_email_key", "idx_users_email_unique", "AuthData", "users_authdata_key"}) { - return "", model.NewAppError("SqlUserStore.UpdateAuthData", "store.sql_user.update_auth_data.email_exists.app_error", map[string]interface{}{"Service": service, "Email": email}, "user_id="+userId+", "+err.Error(), http.StatusBadRequest) + return "", store.NewErrInvalidInput("User", "id", userId) } - return "", model.NewAppError("SqlUserStore.UpdateAuthData", "store.sql_user.update_auth_data.app_error", nil, "id="+userId+", "+err.Error(), http.StatusInternalServerError) + return "", errors.Wrapf(err, "failed to update User with userId=%s", userId) } return userId, nil } -func (us SqlUserStore) UpdateMfaSecret(userId, secret string) *model.AppError { +func (us SqlUserStore) UpdateMfaSecret(userId, secret string) error { updateAt := model.GetMillis() if _, err := us.GetMaster().Exec("UPDATE Users SET MfaSecret = :Secret, UpdateAt = :UpdateAt WHERE Id = :UserId", map[string]interface{}{"Secret": secret, "UpdateAt": updateAt, "UserId": userId}); err != nil { - return model.NewAppError("SqlUserStore.UpdateMfaSecret", "store.sql_user.update_mfa_secret.app_error", nil, "id="+userId+", "+err.Error(), http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } return nil } -func (us SqlUserStore) UpdateMfaActive(userId string, active bool) *model.AppError { +func (us SqlUserStore) UpdateMfaActive(userId string, active bool) error { updateAt := model.GetMillis() if _, err := us.GetMaster().Exec("UPDATE Users SET MfaActive = :Active, UpdateAt = :UpdateAt WHERE Id = :UserId", map[string]interface{}{"Active": active, "UpdateAt": updateAt, "UserId": userId}); err != nil { - return model.NewAppError("SqlUserStore.UpdateMfaActive", "store.sql_user.update_mfa_active.app_error", nil, "id="+userId+", "+err.Error(), http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } return nil } -func (us SqlUserStore) Get(id string) (*model.User, *model.AppError) { - failure := func(err error, id string, statusCode int) *model.AppError { - details := "user_id=" + id + ", " + err.Error() - return model.NewAppError("SqlUserStore.Get", id, nil, details, statusCode) - } - +func (us SqlUserStore) Get(id string) (*model.User, error) { query := us.usersQuery.Where("Id = ?", id) queryString, args, err := query.ToSql() if err != nil { - return nil, failure(err, "store.sql_user.get.app_error", http.StatusInternalServerError) + return nil, errors.Wrap(err, "users_get_tosql") } row := us.GetReplica().Db.QueryRow(queryString, args...) @@ -349,40 +343,40 @@ func (us SqlUserStore) Get(id string) (*model.User, *model.AppError) { &user.IsBot, &user.BotDescription, &user.BotLastIconUpdate) if err != nil { if err == sql.ErrNoRows { - return nil, failure(err, store.MISSING_ACCOUNT_ERROR, http.StatusNotFound) + return nil, store.NewErrNotFound("User", id) } - return nil, failure(err, "store.sql_user.get.app_error", http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to get User with userId=%s", id) } if err = json.Unmarshal(props, &user.Props); err != nil { - return nil, failure(err, "store.sql_user.get.app_error", http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to unmarshal user props") } if err = json.Unmarshal(notifyProps, &user.NotifyProps); err != nil { - return nil, failure(err, "store.sql_user.get.app_error", http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to unmarshal user notify props") } if err = json.Unmarshal(timezone, &user.Timezone); err != nil { - return nil, failure(err, "store.sql_user.get.app_error", http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to unmarshal user timezone") } return &user, nil } -func (us SqlUserStore) GetAll() ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetAll() ([]*model.User, error) { query := us.usersQuery.OrderBy("Username ASC") queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetAll", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_all_users_tosql") } var data []*model.User if _, err := us.GetReplica().Select(&data, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetAll", "store.sql_user.get.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } return data, nil } -func (us SqlUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, error) { query := us.usersQuery. Where("Id > ?", afterId). OrderBy("Id ASC"). @@ -390,12 +384,12 @@ func (us SqlUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, *m queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllAfter", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_all_after_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllAfter", "store.sql_user.get.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } return users, nil @@ -409,7 +403,7 @@ func (us SqlUserStore) GetEtagForAllProfiles() string { return fmt.Sprintf("%v.%v", model.CurrentVersion, updateAt) } -func (us SqlUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, error) { isPostgreSQL := us.DriverName() == model.DATABASE_DRIVER_POSTGRES query := us.usersQuery. OrderBy("u.Username ASC"). @@ -427,12 +421,12 @@ func (us SqlUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.U queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllProfiles", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_all_profiles_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllProfiles", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to get User profiles") } for _, u := range users { @@ -628,7 +622,7 @@ func (us SqlUserStore) GetEtagForProfiles(teamId string) string { return fmt.Sprintf("%v.%v", model.CurrentVersion, updateAt) } -func (us SqlUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, error) { isPostgreSQL := us.DriverName() == model.DATABASE_DRIVER_POSTGRES query := us.usersQuery. Join("TeamMembers tm ON ( tm.UserId = u.Id AND tm.DeleteAt = 0 )"). @@ -649,12 +643,12 @@ func (us SqlUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfiles", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_etag_for_profiles_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfiles", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -668,7 +662,7 @@ func (us SqlUserStore) InvalidateProfilesInChannelCacheByUser(userId string) {} func (us SqlUserStore) InvalidateProfilesInChannelCache(channelId string) {} -func (us SqlUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, error) { query := us.usersQuery. Join("ChannelMembers cm ON ( cm.UserId = u.Id )"). Where("cm.ChannelId = ?", options.InChannelId). @@ -683,12 +677,12 @@ func (us SqlUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*m queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesInChannel", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profiles_in_channel_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesInChannel", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -698,7 +692,7 @@ func (us SqlUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*m return users, nil } -func (us SqlUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, error) { query := us.usersQuery. Join("ChannelMembers cm ON ( cm.UserId = u.Id )"). LeftJoin("Status s ON ( s.UserId = u.Id )"). @@ -722,12 +716,12 @@ func (us SqlUserStore) GetProfilesInChannelByStatus(options *model.UserGetOption queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesInChannelByStatus", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profiles_in_channel_by_status_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesInChannelByStatus", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -737,10 +731,7 @@ func (us SqlUserStore) GetProfilesInChannelByStatus(options *model.UserGetOption return users, nil } -func (us SqlUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) { - failure := func(e error) (map[string]*model.User, *model.AppError) { - return nil, model.NewAppError("SqlUserStore.GetAllProfilesInChannel", "store.sql_user.app_error", nil, e.Error(), http.StatusInternalServerError) - } +func (us SqlUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, error) { query := us.usersQuery. Join("ChannelMembers cm ON ( cm.UserId = u.Id )"). Where("cm.ChannelId = ?", channelId). @@ -749,12 +740,12 @@ func (us SqlUserStore) GetAllProfilesInChannel(channelId string, allowFromCache queryString, args, err := query.ToSql() if err != nil { - return failure(err) + return nil, errors.Wrap(err, "get_all_profiles_in_channel_tosql") } var users []*model.User rows, err := us.GetReplica().Db.Query(queryString, args...) if err != nil { - return failure(err) + return nil, errors.Wrap(err, "failed to find Users") } defer rows.Close() @@ -762,22 +753,22 @@ func (us SqlUserStore) GetAllProfilesInChannel(channelId string, allowFromCache var user model.User var props, notifyProps, timezone []byte if err = rows.Scan(&user.Id, &user.CreateAt, &user.UpdateAt, &user.DeleteAt, &user.Username, &user.Password, &user.AuthData, &user.AuthService, &user.Email, &user.EmailVerified, &user.Nickname, &user.FirstName, &user.LastName, &user.Position, &user.Roles, &user.AllowMarketing, &props, ¬ifyProps, &user.LastPasswordUpdate, &user.LastPictureUpdate, &user.FailedAttempts, &user.Locale, &timezone, &user.MfaActive, &user.MfaSecret, &user.IsBot, &user.BotDescription, &user.BotLastIconUpdate); err != nil { - return failure(err) + return nil, errors.Wrap(err, "failed to scan values from rows into User entity") } if err = json.Unmarshal(props, &user.Props); err != nil { - return failure(err) + return nil, errors.Wrap(err, "failed to unmarshal user props") } if err = json.Unmarshal(notifyProps, &user.NotifyProps); err != nil { - return failure(err) + return nil, errors.Wrap(err, "failed to unmarshal user notify props") } if err = json.Unmarshal(timezone, &user.Timezone); err != nil { - return failure(err) + return nil, errors.Wrap(err, "failed to unmarshal user timezone") } users = append(users, &user) } err = rows.Err() if err != nil { - return failure(err) + return nil, errors.Wrap(err, "error while iterating over rows") } userMap := make(map[string]*model.User) @@ -790,7 +781,7 @@ func (us SqlUserStore) GetAllProfilesInChannel(channelId string, allowFromCache return userMap, nil } -func (us SqlUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { query := us.usersQuery. Join("TeamMembers tm ON ( tm.UserId = u.Id AND tm.DeleteAt = 0 AND tm.TeamId = ? )", teamId). LeftJoin("ChannelMembers cm ON ( cm.UserId = u.Id AND cm.ChannelId = ? )", channelId). @@ -806,12 +797,12 @@ func (us SqlUserStore) GetProfilesNotInChannel(teamId string, channelId string, queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesNotInChannel", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profiles_not_in_channel_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesNotInChannel", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -821,7 +812,7 @@ func (us SqlUserStore) GetProfilesNotInChannel(teamId string, channelId string, return users, nil } -func (us SqlUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, error) { isPostgreSQL := us.DriverName() == model.DATABASE_DRIVER_POSTGRES query := us.usersQuery. Where(`( @@ -848,12 +839,12 @@ func (us SqlUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([] queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesWithoutTeam", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profiles_without_team_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesWithoutTeam", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -863,7 +854,7 @@ func (us SqlUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([] return users, nil } -func (us SqlUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { query := us.usersQuery query = applyViewRestrictionsFilter(query, viewRestrictions, true) @@ -876,12 +867,12 @@ func (us SqlUserStore) GetProfilesByUsernames(usernames []string, viewRestrictio queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesByUsernames", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profiles_by_usernames") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesByUsernames", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } return users, nil @@ -892,7 +883,7 @@ type UserWithLastActivityAt struct { LastActivityAt int64 } -func (us SqlUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { query := us.usersQuery. Column("s.LastActivityAt"). Join("TeamMembers tm ON (tm.UserId = u.Id AND tm.TeamId = ?)", teamId). @@ -905,12 +896,12 @@ func (us SqlUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset, limi queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetRecentlyActiveUsers", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_recently_active_users_for_team_tosql") } var users []*UserWithLastActivityAt if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetRecentlyActiveUsers", "store.sql_user.get_recently_active_users.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } userList := []*model.User{} @@ -925,7 +916,7 @@ func (us SqlUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset, limi return userList, nil } -func (us SqlUserStore) GetNewUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetNewUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { query := us.usersQuery. Join("TeamMembers tm ON (tm.UserId = u.Id AND tm.TeamId = ?)", teamId). OrderBy("u.CreateAt DESC"). @@ -936,12 +927,12 @@ func (us SqlUserStore) GetNewUsersForTeam(teamId string, offset, limit int, view queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetNewUsersForTeam", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_new_users_for_team_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetNewUsersForTeam", "store.sql_user.get_new_users.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -951,7 +942,7 @@ func (us SqlUserStore) GetNewUsersForTeam(teamId string, offset, limit int, view return users, nil } -func (us SqlUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, _ bool) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) { if options == nil { options = &store.UserGetByIdsOpts{} } @@ -973,11 +964,11 @@ func (us SqlUserStore) GetProfileByIds(userIds []string, options *store.UserGetB queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfileByIds", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profile_by_ids_tosql") } if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfileByIds", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } return users, nil @@ -988,7 +979,7 @@ type UserWithChannel struct { ChannelId string } -func (us SqlUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, error) { if len(channelIds) > MAX_GROUP_CHANNELS_FOR_PROFILES { channelIds = channelIds[0:MAX_GROUP_CHANNELS_FOR_PROFILES] } @@ -1017,12 +1008,12 @@ func (us SqlUserStore) GetProfileByGroupChannelIdsForUser(userId string, channel queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfileByGroupChannelIdsForUser", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profiles_by_group_channel_ids_for_user_tosql") } usersWithChannel := []*UserWithChannel{} if _, err := us.GetReplica().Select(&usersWithChannel, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfileByGroupChannelIdsForUser", "store.sql_user.get_profile_by_group_channel_ids_for_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } usersByChannelId := map[string][]*model.User{} @@ -1037,19 +1028,19 @@ func (us SqlUserStore) GetProfileByGroupChannelIdsForUser(userId string, channel return usersByChannelId, nil } -func (us SqlUserStore) GetSystemAdminProfiles() (map[string]*model.User, *model.AppError) { +func (us SqlUserStore) GetSystemAdminProfiles() (map[string]*model.User, error) { query := us.usersQuery. Where("Roles LIKE ?", "%system_admin%"). OrderBy("u.Username ASC") queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetSystemAdminProfiles", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_system_admin_profiles_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetSystemAdminProfiles", "store.sql_user.get_sysadmin_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } userMap := make(map[string]*model.User) @@ -1062,25 +1053,29 @@ func (us SqlUserStore) GetSystemAdminProfiles() (map[string]*model.User, *model. return userMap, nil } -func (us SqlUserStore) GetByEmail(email string) (*model.User, *model.AppError) { +func (us SqlUserStore) GetByEmail(email string) (*model.User, error) { query := us.usersQuery.Where("Email = lower(?)", email) queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetByEmail", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_by_email_tosql") } user := model.User{} if err := us.GetReplica().SelectOne(&user, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetByEmail", store.MISSING_ACCOUNT_ERROR, nil, "email="+email+", "+err.Error(), http.StatusInternalServerError) + if err == sql.ErrNoRows { + return nil, errors.Wrap(store.NewErrNotFound("User", fmt.Sprintf("email=%s", email)), "failed to find User") + } + + return nil, errors.Wrapf(err, "failed to get User with email=%s", email) } return &user, nil } -func (us SqlUserStore) GetByAuth(authData *string, authService string) (*model.User, *model.AppError) { +func (us SqlUserStore) GetByAuth(authData *string, authService string) (*model.User, error) { if authData == nil || *authData == "" { - return nil, model.NewAppError("SqlUserStore.GetByAuth", store.MISSING_AUTH_ACCOUNT_ERROR, nil, "authData='', authService="+authService, http.StatusBadRequest) + return nil, store.NewErrInvalidInput("User", "", "empty or nil") } query := us.usersQuery. @@ -1089,71 +1084,75 @@ func (us SqlUserStore) GetByAuth(authData *string, authService string) (*model.U queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetByAuth", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_by_auth_tosql") } user := model.User{} if err := us.GetReplica().SelectOne(&user, queryString, args...); err == sql.ErrNoRows { - return nil, model.NewAppError("SqlUserStore.GetByAuth", store.MISSING_AUTH_ACCOUNT_ERROR, nil, "authData="+*authData+", authService="+authService+", "+err.Error(), http.StatusInternalServerError) + return nil, store.NewErrNotFound("User", fmt.Sprintf("authData=%s, authService=%s", *authData, authService)) } else if err != nil { - return nil, model.NewAppError("SqlUserStore.GetByAuth", "store.sql_user.get_by_auth.other.app_error", nil, "authData="+*authData+", authService="+authService+", "+err.Error(), http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to find User with authData=%s and authService=%s", *authData, authService) } return &user, nil } -func (us SqlUserStore) GetAllUsingAuthService(authService string) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetAllUsingAuthService(authService string) ([]*model.User, error) { query := us.usersQuery. Where("u.AuthService = ?", authService). OrderBy("u.Username ASC") queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllUsingAuthService", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_all_using_auth_service_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllUsingAuthService", "store.sql_user.get_by_auth.other.app_error", nil, "authService="+authService+", "+err.Error(), http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to find Users with authService=%s", authService) } return users, nil } -func (us SqlUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, error) { query := us.usersQuery. Where(sq.NotEq{"u.AuthService": authServices}). OrderBy("u.Username ASC") queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllNotInAuthService", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_all_not_in_auth_service_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetAllNotInAuthService", "store.sql_user.get_by_auth.other.app_error", nil, "", http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to find Users with authServices in %v", authServices) } return users, nil } -func (us SqlUserStore) GetByUsername(username string) (*model.User, *model.AppError) { +func (us SqlUserStore) GetByUsername(username string) (*model.User, error) { query := us.usersQuery.Where("u.Username = lower(?)", username) queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetByUsername", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_by_username_tosql") } var user *model.User if err := us.GetReplica().SelectOne(&user, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetByUsername", "store.sql_user.get_by_username.app_error", nil, err.Error(), http.StatusInternalServerError) + if err == sql.ErrNoRows { + return nil, errors.Wrap(store.NewErrNotFound("User", fmt.Sprintf("username=%s", username)), "failed to find User") + } + + return nil, errors.Wrapf(err, "failed to find User with username=%s", username) } return user, nil } -func (us SqlUserStore) GetForLogin(loginId string, allowSignInWithUsername, allowSignInWithEmail bool) (*model.User, *model.AppError) { +func (us SqlUserStore) GetForLogin(loginId string, allowSignInWithUsername, allowSignInWithEmail bool) (*model.User, error) { query := us.usersQuery if allowSignInWithUsername && allowSignInWithEmail { query = query.Where("Username = lower(?) OR Email = lower(?)", loginId, loginId) @@ -1162,48 +1161,48 @@ func (us SqlUserStore) GetForLogin(loginId string, allowSignInWithUsername, allo } else if allowSignInWithEmail { query = query.Where("Email = lower(?)", loginId) } else { - return nil, model.NewAppError("SqlUserStore.GetForLogin", "store.sql_user.get_for_login.app_error", nil, "", http.StatusInternalServerError) + return nil, errors.New("sign in with username and email are disabled") } queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetForLogin", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_for_login_tosql") } users := []*model.User{} if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetForLogin", "store.sql_user.get_for_login.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } if len(users) == 0 { - return nil, model.NewAppError("SqlUserStore.GetForLogin", "store.sql_user.get_for_login.app_error", nil, "", http.StatusInternalServerError) + return nil, errors.New("user not found") } if len(users) > 1 { - return nil, model.NewAppError("SqlUserStore.GetForLogin", "store.sql_user.get_for_login.multiple_users", nil, "", http.StatusInternalServerError) + return nil, errors.New("multiple users found") } return users[0], nil } -func (us SqlUserStore) VerifyEmail(userId, email string) (string, *model.AppError) { +func (us SqlUserStore) VerifyEmail(userId, email string) (string, error) { curTime := model.GetMillis() if _, err := us.GetMaster().Exec("UPDATE Users SET Email = lower(:email), EmailVerified = true, UpdateAt = :Time WHERE Id = :UserId", map[string]interface{}{"email": email, "Time": curTime, "UserId": userId}); err != nil { - return "", model.NewAppError("SqlUserStore.VerifyEmail", "store.sql_user.verify_email.app_error", nil, "userId="+userId+", "+err.Error(), http.StatusInternalServerError) + return "", errors.Wrapf(err, "failed to update Users with userId=%s and email=%s", userId, email) } return userId, nil } -func (us SqlUserStore) PermanentDelete(userId string) *model.AppError { +func (us SqlUserStore) PermanentDelete(userId string) error { if _, err := us.GetMaster().Exec("DELETE FROM Users WHERE Id = :UserId", map[string]interface{}{"UserId": userId}); err != nil { - return model.NewAppError("SqlUserStore.PermanentDelete", "store.sql_user.permanent_delete.app_error", nil, "userId="+userId+", "+err.Error(), http.StatusInternalServerError) + return errors.Wrapf(err, "failed to delete User with userId=%s", userId) } return nil } -func (us SqlUserStore) Count(options model.UserCountOptions) (int64, *model.AppError) { +func (us SqlUserStore) Count(options model.UserCountOptions) (int64, error) { isPostgreSQL := us.DriverName() == model.DATABASE_DRIVER_POSTGRES query := us.getQueryBuilder().Select("COUNT(DISTINCT u.Id)").From("Users AS u") @@ -1219,7 +1218,7 @@ func (us SqlUserStore) Count(options model.UserCountOptions) (int64, *model.AppE query = query.LeftJoin("Bots ON u.Id = Bots.UserId").Where("Bots.UserId IS NULL") if options.ExcludeRegularUsers { // Currently this doesn't make sense because it will always return 0 - return int64(0), model.NewAppError("SqlUserStore.Count", "store.sql_user.count.app_error", nil, "", http.StatusInternalServerError) + return int64(0), errors.New("query with IncludeBotAccounts=false and excludeRegularUsers=true always return 0") } } @@ -1237,17 +1236,17 @@ func (us SqlUserStore) Count(options model.UserCountOptions) (int64, *model.AppE queryString, args, err := query.ToSql() if err != nil { - return int64(0), model.NewAppError("SqlUserStore.Get", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return int64(0), errors.Wrap(err, "count_tosql") } count, err := us.GetReplica().SelectInt(queryString, args...) if err != nil { - return int64(0), model.NewAppError("SqlUserStore.Count", "store.sql_user.get_total_users_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return int64(0), errors.Wrap(err, "failed to count Users") } return count, nil } -func (us SqlUserStore) AnalyticsActiveCount(timePeriod int64, options model.UserCountOptions) (int64, *model.AppError) { +func (us SqlUserStore) AnalyticsActiveCount(timePeriod int64, options model.UserCountOptions) (int64, error) { time := model.GetMillis() - timePeriod query := us.getQueryBuilder().Select("COUNT(*)").From("Status AS s").Where("LastActivityAt > :Time", map[string]interface{}{"Time": time}) @@ -1263,12 +1262,12 @@ func (us SqlUserStore) AnalyticsActiveCount(timePeriod int64, options model.User queryStr, args, err := query.ToSql() if err != nil { - return 0, model.NewAppError("SqlUserStore.Get", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return 0, errors.Wrap(err, "analytics_active_count_tosql") } v, err := us.GetReplica().SelectInt(queryStr, args...) if err != nil { - return 0, model.NewAppError("SqlUserStore.AnalyticsActiveCount", "store.sql_user.analytics_daily_active_users.app_error", nil, err.Error(), http.StatusInternalServerError) + return 0, errors.Wrap(err, "failed to count Users") } return v, nil } @@ -1297,7 +1296,7 @@ func (us SqlUserStore) AnalyticsActiveCountForPeriod(startTime int64, endTime in return v, nil } -func (us SqlUserStore) GetUnreadCount(userId string) (int64, *model.AppError) { +func (us SqlUserStore) GetUnreadCount(userId string) (int64, error) { query := ` SELECT SUM(CASE WHEN c.Type = 'D' THEN (c.TotalMsgCount - cm.MsgCount) ELSE cm.MentionCount END) FROM Channels c @@ -1308,29 +1307,29 @@ func (us SqlUserStore) GetUnreadCount(userId string) (int64, *model.AppError) { ` count, err := us.GetReplica().SelectInt(query, map[string]interface{}{"UserId": userId}) if err != nil { - return count, model.NewAppError("SqlUserStore.GetMentionCount", "store.sql_user.get_unread_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return count, errors.Wrapf(err, "failed to count unread Channels for userId=%s", userId) } return count, nil } -func (us SqlUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (us SqlUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, error) { count, err := us.GetReplica().SelectInt("SELECT SUM(CASE WHEN c.Type = 'D' THEN (c.TotalMsgCount - cm.MsgCount) ELSE cm.MentionCount END) FROM Channels c INNER JOIN ChannelMembers cm ON c.Id = cm.ChannelId AND cm.ChannelId = :ChannelId AND cm.UserId = :UserId", map[string]interface{}{"ChannelId": channelId, "UserId": userId}) if err != nil { - return 0, model.NewAppError("SqlUserStore.GetMentionCountForChannel", "store.sql_user.get_unread_count_for_channel.app_error", nil, err.Error(), http.StatusInternalServerError) + return 0, errors.Wrapf(err, "failed to get unread count for channelId=%s and userId=%s", channelId, userId) } return count, nil } -func (us SqlUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (us SqlUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, error) { count, err := us.GetReplica().SelectInt("SELECT SUM(c.TotalMsgCount - cm.MsgCount) FROM Channels c INNER JOIN ChannelMembers cm ON c.Id = cm.ChannelId AND cm.ChannelId = :ChannelId AND cm.UserId = :UserId", map[string]interface{}{"ChannelId": channelId, "UserId": userId}) if err != nil { - return count, model.NewAppError("SqlUserStore.GetMentionCountForChannel", "store.sql_user.get_unread_count_for_channel.app_error", nil, err.Error(), http.StatusInternalServerError) + return count, errors.Wrapf(err, "failed to get any unread count for channelId=%s and userId=%s", channelId, userId) } return count, nil } -func (us SqlUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { query := us.usersQuery. OrderBy("Username ASC"). Limit(uint64(options.Limit)) @@ -1341,7 +1340,7 @@ func (us SqlUserStore) Search(teamId string, term string, options *model.UserSea return us.performSearch(query, term, options) } -func (us SqlUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, error) { query := us.usersQuery. Where(`( SELECT @@ -1358,7 +1357,7 @@ func (us SqlUserStore) SearchWithoutTeam(term string, options *model.UserSearchO return us.performSearch(query, term, options) } -func (us SqlUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { query := us.usersQuery. LeftJoin("TeamMembers tm ON ( tm.UserId = u.Id AND tm.DeleteAt = 0 AND tm.TeamId = ? )", notInTeamId). Where("tm.UserId IS NULL"). @@ -1372,7 +1371,7 @@ func (us SqlUserStore) SearchNotInTeam(notInTeamId string, term string, options return us.performSearch(query, term, options) } -func (us SqlUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { query := us.usersQuery. LeftJoin("ChannelMembers cm ON ( cm.UserId = u.Id AND cm.ChannelId = ? )", channelId). Where("cm.UserId IS NULL"). @@ -1390,7 +1389,7 @@ func (us SqlUserStore) SearchNotInChannel(teamId string, channelId string, term return us.performSearch(query, term, options) } -func (us SqlUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { query := us.usersQuery. Join("ChannelMembers cm ON ( cm.UserId = u.Id AND cm.ChannelId = ? )", channelId). OrderBy("Username ASC"). @@ -1399,7 +1398,7 @@ func (us SqlUserStore) SearchInChannel(channelId string, term string, options *m return us.performSearch(query, term, options) } -func (us SqlUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) { query := us.usersQuery. Join("GroupMembers gm ON ( gm.UserId = u.Id AND gm.GroupId = ? )", groupID). OrderBy("Username ASC"). @@ -1441,7 +1440,7 @@ func generateSearchQuery(query sq.SelectBuilder, terms []string, fields []string return query } -func (us SqlUserStore) performSearch(query sq.SelectBuilder, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) performSearch(query sq.SelectBuilder, term string, options *model.UserSearchOptions) ([]*model.User, error) { term = sanitizeSearchTerm(term, "*") var searchType []string @@ -1476,13 +1475,12 @@ func (us SqlUserStore) performSearch(query sq.SelectBuilder, term string, option queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.Search", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "perform_search_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.Search", "store.sql_user.search.app_error", nil, - fmt.Sprintf("term=%v, search_type=%v, %v", term, searchType, err.Error()), http.StatusInternalServerError) + return nil, errors.Wrapf(err, "failed to find Users with term=%s and searchType=%v", term, searchType) } for _, u := range users { u.Sanitize(map[string]bool{}) @@ -1491,39 +1489,39 @@ func (us SqlUserStore) performSearch(query sq.SelectBuilder, term string, option return users, nil } -func (us SqlUserStore) AnalyticsGetInactiveUsersCount() (int64, *model.AppError) { +func (us SqlUserStore) AnalyticsGetInactiveUsersCount() (int64, error) { count, err := us.GetReplica().SelectInt("SELECT COUNT(Id) FROM Users WHERE DeleteAt > 0") if err != nil { - return int64(0), model.NewAppError("SqlUserStore.AnalyticsGetInactiveUsersCount", "store.sql_user.analytics_get_inactive_users_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return int64(0), errors.Wrap(err, "failed to count inactive Users") } return count, nil } -func (us SqlUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, *model.AppError) { +func (us SqlUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, error) { count, err := us.GetReplica().SelectInt("SELECT COUNT(Id) FROM Users WHERE LOWER(Email) NOT LIKE :HostDomain", map[string]interface{}{"HostDomain": "%@" + strings.ToLower(hostDomain)}) if err != nil { - return false, model.NewAppError("SqlUserStore.AnalyticsGetExternalUsers", "store.sql_user.analytics_get_external_users.app_error", nil, err.Error(), http.StatusInternalServerError) + return false, errors.Wrap(err, "failed to count inactive Users") } return count > 0, nil } -func (us SqlUserStore) AnalyticsGetGuestCount() (int64, *model.AppError) { +func (us SqlUserStore) AnalyticsGetGuestCount() (int64, error) { count, err := us.GetReplica().SelectInt("SELECT count(*) FROM Users WHERE Roles LIKE :Roles and DeleteAt = 0", map[string]interface{}{"Roles": "%system_guest%"}) if err != nil { - return int64(0), model.NewAppError("SqlUserStore.AnalyticsGetSystemAdminCount", "store.sql_user.analytics_get_system_admin_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return int64(0), errors.Wrap(err, "failed to count guest Users") } return count, nil } -func (us SqlUserStore) AnalyticsGetSystemAdminCount() (int64, *model.AppError) { +func (us SqlUserStore) AnalyticsGetSystemAdminCount() (int64, error) { count, err := us.GetReplica().SelectInt("SELECT count(*) FROM Users WHERE Roles LIKE :Roles and DeleteAt = 0", map[string]interface{}{"Roles": "%system_admin%"}) if err != nil { - return int64(0), model.NewAppError("SqlUserStore.AnalyticsGetSystemAdminCount", "store.sql_user.analytics_get_system_admin_count.app_error", nil, err.Error(), http.StatusInternalServerError) + return int64(0), errors.Wrap(err, "failed to count system admin Users") } return count, nil } -func (us SqlUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { var users []*model.User query := us.usersQuery. LeftJoin("TeamMembers tm ON ( tm.UserId = u.Id AND tm.DeleteAt = 0 AND tm.TeamId = ? )", teamId). @@ -1539,11 +1537,11 @@ func (us SqlUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesNotInTeam", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_profiles_not_in_team_tosql") } if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetProfilesNotInTeam", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -1573,7 +1571,7 @@ func (us SqlUserStore) GetEtagForProfilesNotInTeam(teamId string) string { return fmt.Sprintf("%v.%v", model.CurrentVersion, etag) } -func (us SqlUserStore) ClearAllCustomRoleAssignments() *model.AppError { +func (us SqlUserStore) ClearAllCustomRoleAssignments() error { builtInRoles := model.MakeDefaultRoles() lastUserId := strings.Repeat("0", 26) @@ -1582,13 +1580,13 @@ func (us SqlUserStore) ClearAllCustomRoleAssignments() *model.AppError { var err error if transaction, err = us.GetMaster().Begin(); err != nil { - return model.NewAppError("SqlUserStore.ClearAllCustomRoleAssignments", "store.sql_user.clear_all_custom_role_assignments.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "begin_transaction") } defer finalizeTransaction(transaction) var users []*model.User if _, err := transaction.Select(&users, "SELECT * from Users WHERE Id > :Id ORDER BY Id LIMIT 1000", map[string]interface{}{"Id": lastUserId}); err != nil { - return model.NewAppError("SqlUserStore.ClearAllCustomRoleAssignments", "store.sql_user.clear_all_custom_role_assignments.select.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrapf(err, "failed to find Users with id > %s", lastUserId) } if len(users) == 0 { @@ -1612,29 +1610,29 @@ func (us SqlUserStore) ClearAllCustomRoleAssignments() *model.AppError { newRolesString := strings.Join(newRoles, " ") if newRolesString != user.Roles { if _, err := transaction.Exec("UPDATE Users SET Roles = :Roles WHERE Id = :Id", map[string]interface{}{"Roles": newRolesString, "Id": user.Id}); err != nil { - return model.NewAppError("SqlUserStore.ClearAllCustomRoleAssignments", "store.sql_user.clear_all_custom_role_assignments.update.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "failed to update Users") } } } if err := transaction.Commit(); err != nil { - return model.NewAppError("SqlUserStore.ClearAllCustomRoleAssignments", "store.sql_user.clear_all_custom_role_assignments.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "commit_transaction") } } return nil } -func (us SqlUserStore) InferSystemInstallDate() (int64, *model.AppError) { +func (us SqlUserStore) InferSystemInstallDate() (int64, error) { createAt, err := us.GetReplica().SelectInt("SELECT CreateAt FROM Users WHERE CreateAt IS NOT NULL ORDER BY CreateAt ASC LIMIT 1") if err != nil { - return 0, model.NewAppError("SqlUserStore.GetSystemInstallDate", "store.sql_user.get_system_install_date.app_error", nil, err.Error(), http.StatusInternalServerError) + return 0, errors.Wrap(err, "failed to infer system install date") } return createAt, nil } -func (us SqlUserStore) GetUsersBatchForIndexing(startTime, endTime int64, limit int) ([]*model.UserForIndexing, *model.AppError) { +func (us SqlUserStore) GetUsersBatchForIndexing(startTime, endTime int64, limit int) ([]*model.UserForIndexing, error) { var users []*model.User usersQuery, args, _ := us.usersQuery. Where(sq.GtOrEq{"u.CreateAt": startTime}). @@ -1644,7 +1642,7 @@ func (us SqlUserStore) GetUsersBatchForIndexing(startTime, endTime int64, limit ToSql() _, err := us.GetSearchReplica().Select(&users, usersQuery, args...) if err != nil { - return nil, model.NewAppError("SqlUserStore.GetUsersBatchForIndexing", "store.sql_user.get_users_batch_for_indexing.get_users.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } userIds := []string{} @@ -1673,7 +1671,7 @@ func (us SqlUserStore) GetUsersBatchForIndexing(startTime, endTime int64, limit ToSql() _, err = us.GetSearchReplica().Select(&channelMembers, channelMembersQuery, args...) if err != nil { - return nil, model.NewAppError("SqlUserStore.GetUsersBatchForIndexing", "store.sql_user.get_users_batch_for_indexing.get_channel_members.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find ChannelMembers") } var teamMembers []*model.TeamMember @@ -1684,7 +1682,7 @@ func (us SqlUserStore) GetUsersBatchForIndexing(startTime, endTime int64, limit ToSql() _, err = us.GetSearchReplica().Select(&teamMembers, teamMembersQuery, args...) if err != nil { - return nil, model.NewAppError("SqlUserStore.GetUsersBatchForIndexing", "store.sql_user.get_users_batch_for_indexing.get_team_members.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find TeamMembers") } userMap := map[string]*model.UserForIndexing{} @@ -1725,17 +1723,17 @@ func (us SqlUserStore) GetUsersBatchForIndexing(startTime, endTime int64, limit return usersForIndexing, nil } -func (us SqlUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, error) { query := applyTeamGroupConstrainedFilter(us.usersQuery, teamID) queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.UsersPermittedToTeam", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_team_group_users_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.UsersPermittedToTeam", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -1745,17 +1743,17 @@ func (us SqlUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, *model.A return users, nil } -func (us SqlUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) { +func (us SqlUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, error) { query := applyChannelGroupConstrainedFilter(us.usersQuery, channelID) queryString, args, err := query.ToSql() if err != nil { - return nil, model.NewAppError("SqlUserStore.GetChannelGroupUsers", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "get_channel_group_users_tosql") } var users []*model.User if _, err := us.GetReplica().Select(&users, queryString, args...); err != nil { - return nil, model.NewAppError("SqlUserStore.GetChannelGroupUsers", "store.sql_user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find Users") } for _, u := range users { @@ -1798,16 +1796,16 @@ func applyViewRestrictionsFilter(query sq.SelectBuilder, restrictions *model.Vie return resultQuery } -func (us SqlUserStore) PromoteGuestToUser(userId string) *model.AppError { +func (us SqlUserStore) PromoteGuestToUser(userId string) error { transaction, err := us.GetMaster().Begin() if err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.promote_guest.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "begin_transaction") } defer finalizeTransaction(transaction) - user, appErr := us.Get(userId) - if appErr != nil { - return appErr + user, err := us.Get(userId) + if err != nil { + return err } roles := user.GetRoles() @@ -1826,11 +1824,11 @@ func (us SqlUserStore) PromoteGuestToUser(userId string) *model.AppError { queryString, args, err := query.ToSql() if err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "promote_guest_to_user_tosql") } if _, err = transaction.Exec(queryString, args...); err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.promote_guest.user_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } query = us.getQueryBuilder().Update("ChannelMembers"). @@ -1840,11 +1838,11 @@ func (us SqlUserStore) PromoteGuestToUser(userId string) *model.AppError { queryString, args, err = query.ToSql() if err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "promote_guest_to_user_tosql") } if _, err = transaction.Exec(queryString, args...); err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.promote_guest.channel_members_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update ChannelMembers with userId=%s", userId) } query = us.getQueryBuilder().Update("TeamMembers"). @@ -1854,29 +1852,29 @@ func (us SqlUserStore) PromoteGuestToUser(userId string) *model.AppError { queryString, args, err = query.ToSql() if err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "promote_guest_to_user_tosql") } if _, err := transaction.Exec(queryString, args...); err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.promote_guest.team_members_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update TeamMembers with userId=%s", userId) } if err := transaction.Commit(); err != nil { - return model.NewAppError("SqlUserStore.PromoteGuestToUser", "store.sql_user.promote_guest.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "commit_transaction") } return nil } -func (us SqlUserStore) DemoteUserToGuest(userId string) *model.AppError { +func (us SqlUserStore) DemoteUserToGuest(userId string) error { transaction, err := us.GetMaster().Begin() if err != nil { - return model.NewAppError("SqlUserStore.DemoteUserToGuest", "store.sql_user.demote_user_to_guest.open_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "begin_transaction") } defer finalizeTransaction(transaction) - user, appErr := us.Get(userId) - if appErr != nil { - return appErr + user, err := us.Get(userId) + if err != nil { + return err } roles := user.GetRoles() @@ -1898,11 +1896,11 @@ func (us SqlUserStore) DemoteUserToGuest(userId string) *model.AppError { queryString, args, err := query.ToSql() if err != nil { - return model.NewAppError("SqlUserStore.DemoteGuestToUser", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "demote_user_to_guest_tosql") } if _, err = transaction.Exec(queryString, args...); err != nil { - return model.NewAppError("SqlUserStore.DemoteGuestToUser", "store.sql_user.demote_user_to_guest.user_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update User with userId=%s", userId) } query = us.getQueryBuilder().Update("ChannelMembers"). @@ -1912,11 +1910,11 @@ func (us SqlUserStore) DemoteUserToGuest(userId string) *model.AppError { queryString, args, err = query.ToSql() if err != nil { - return model.NewAppError("SqlUserStore.DemoteGuestToUser", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "demote_user_to_guest_tosql") } if _, err = transaction.Exec(queryString, args...); err != nil { - return model.NewAppError("SqlUserStore.DemoteGuestToUser", "store.sql_user.demote_user_to_guest.channel_members_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update ChannelMembers with userId=%s", userId) } query = us.getQueryBuilder().Update("TeamMembers"). @@ -1926,45 +1924,45 @@ func (us SqlUserStore) DemoteUserToGuest(userId string) *model.AppError { queryString, args, err = query.ToSql() if err != nil { - return model.NewAppError("SqlUserStore.DemoteGuestToUser", "store.sql_user.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "demote_user_to_guest_tosql") } if _, err := transaction.Exec(queryString, args...); err != nil { - return model.NewAppError("SqlUserStore.DemoteGuestToUser", "store.sql_user.demote_user_to_guest.team_members_update.app_error", nil, "user_id="+userId, http.StatusInternalServerError) + return errors.Wrapf(err, "failed to update TeamMembers with userId=%s", userId) } if err := transaction.Commit(); err != nil { - return model.NewAppError("SqlUserStore.DemoteGuestToUser", "store.sql_user.demote_user_to_guest.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError) + return errors.Wrap(err, "commit_transaction") } return nil } -func (us SqlUserStore) AutocompleteUsersInChannel(teamId, channelId, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, *model.AppError) { +func (us SqlUserStore) AutocompleteUsersInChannel(teamId, channelId, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) { autocomplete := &model.UserAutocompleteInChannel{} uchan := make(chan store.StoreResult, 1) go func() { users, err := us.SearchInChannel(channelId, term, options) - uchan <- store.StoreResult{Data: users, Err: err} + uchan <- store.StoreResult{Data: users, NErr: err} close(uchan) }() nuchan := make(chan store.StoreResult, 1) go func() { users, err := us.SearchNotInChannel(teamId, channelId, term, options) - nuchan <- store.StoreResult{Data: users, Err: err} + nuchan <- store.StoreResult{Data: users, NErr: err} close(nuchan) }() result := <-uchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + return nil, result.NErr } users := result.Data.([]*model.User) autocomplete.InChannel = users result = <-nuchan - if result.Err != nil { - return nil, result.Err + if result.NErr != nil { + return nil, result.NErr } users = result.Data.([]*model.User) autocomplete.OutOfChannel = users @@ -1974,7 +1972,7 @@ func (us SqlUserStore) AutocompleteUsersInChannel(teamId, channelId, term string // GetKnownUsers returns the list of user ids of users with any direct // relationship with a user. That means any user sharing any channel, including // direct and group channels. -func (us SqlUserStore) GetKnownUsers(userId string) ([]string, *model.AppError) { +func (us SqlUserStore) GetKnownUsers(userId string) ([]string, error) { var userIds []string usersQuery, args, _ := us.getQueryBuilder(). Select("DISTINCT ocm.UserId"). @@ -1985,7 +1983,7 @@ func (us SqlUserStore) GetKnownUsers(userId string) ([]string, *model.AppError) ToSql() _, err := us.GetSearchReplica().Select(&userIds, usersQuery, args...) if err != nil { - return nil, model.NewAppError("SqlUserStore.GetKnownUsers", "store.sql_user.get_known_users.get_users.app_error", nil, err.Error(), http.StatusInternalServerError) + return nil, errors.Wrap(err, "failed to find ChannelMembers") } return userIds, nil diff --git a/store/store.go b/store/store.go index 4819cf702a..0f1c946056 100644 --- a/store/store.go +++ b/store/store.go @@ -304,74 +304,74 @@ type PostStore interface { } type UserStore interface { - Save(user *model.User) (*model.User, *model.AppError) - Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, *model.AppError) - UpdateLastPictureUpdate(userId string) *model.AppError - ResetLastPictureUpdate(userId string) *model.AppError - UpdatePassword(userId, newPassword string) *model.AppError - UpdateUpdateAt(userId string) (int64, *model.AppError) - UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError) - UpdateMfaSecret(userId, secret string) *model.AppError - UpdateMfaActive(userId string, active bool) *model.AppError - Get(id string) (*model.User, *model.AppError) - GetAll() ([]*model.User, *model.AppError) + Save(user *model.User) (*model.User, error) + Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error) + UpdateLastPictureUpdate(userId string) error + ResetLastPictureUpdate(userId string) error + UpdatePassword(userId, newPassword string) error + UpdateUpdateAt(userId string) (int64, error) + UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, error) + UpdateMfaSecret(userId, secret string) error + UpdateMfaActive(userId string, active bool) error + Get(id string) (*model.User, error) + GetAll() ([]*model.User, error) ClearCaches() InvalidateProfilesInChannelCacheByUser(userId string) InvalidateProfilesInChannelCache(channelId string) - GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) - GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) - GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) - GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) - GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) - GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) - GetAllProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) - GetProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) - GetProfileByIds(userIds []string, options *UserGetByIdsOpts, allowFromCache bool) ([]*model.User, *model.AppError) - GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, *model.AppError) + GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, error) + GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, error) + GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, error) + GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) + GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, error) + GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) + GetAllProfiles(options *model.UserGetOptions) ([]*model.User, error) + GetProfiles(options *model.UserGetOptions) ([]*model.User, error) + GetProfileByIds(userIds []string, options *UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) + GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, error) InvalidateProfileCacheForUser(userId string) - GetByEmail(email string) (*model.User, *model.AppError) - GetByAuth(authData *string, authService string) (*model.User, *model.AppError) - GetAllUsingAuthService(authService string) ([]*model.User, *model.AppError) - GetAllNotInAuthService(authServices []string) ([]*model.User, *model.AppError) - GetByUsername(username string) (*model.User, *model.AppError) - GetForLogin(loginId string, allowSignInWithUsername, allowSignInWithEmail bool) (*model.User, *model.AppError) - VerifyEmail(userId, email string) (string, *model.AppError) + GetByEmail(email string) (*model.User, error) + GetByAuth(authData *string, authService string) (*model.User, error) + GetAllUsingAuthService(authService string) ([]*model.User, error) + GetAllNotInAuthService(authServices []string) ([]*model.User, error) + GetByUsername(username string) (*model.User, error) + GetForLogin(loginId string, allowSignInWithUsername, allowSignInWithEmail bool) (*model.User, error) + VerifyEmail(userId, email string) (string, error) GetEtagForAllProfiles() string GetEtagForProfiles(teamId string) string - UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError - GetSystemAdminProfiles() (map[string]*model.User, *model.AppError) - PermanentDelete(userId string) *model.AppError - AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, *model.AppError) + UpdateFailedPasswordAttempts(userId string, attempts int) error + GetSystemAdminProfiles() (map[string]*model.User, error) + PermanentDelete(userId string) error + AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, error) AnalyticsActiveCountForPeriod(startTime int64, endTime int64, options model.UserCountOptions) (int64, error) - GetUnreadCount(userId string) (int64, *model.AppError) - GetUnreadCountForChannel(userId string, channelId string) (int64, *model.AppError) - GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, *model.AppError) - GetRecentlyActiveUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) - GetNewUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) - Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) - SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) - SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) - SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) - SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) - SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) - AnalyticsGetInactiveUsersCount() (int64, *model.AppError) - AnalyticsGetExternalUsers(hostDomain string) (bool, *model.AppError) - AnalyticsGetSystemAdminCount() (int64, *model.AppError) - AnalyticsGetGuestCount() (int64, *model.AppError) - GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) + GetUnreadCount(userId string) (int64, error) + GetUnreadCountForChannel(userId string, channelId string) (int64, error) + GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, error) + GetRecentlyActiveUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) + GetNewUsersForTeam(teamId string, offset, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) + Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) + SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) + SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) + SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) + SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, error) + SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) + AnalyticsGetInactiveUsersCount() (int64, error) + AnalyticsGetExternalUsers(hostDomain string) (bool, error) + AnalyticsGetSystemAdminCount() (int64, error) + AnalyticsGetGuestCount() (int64, error) + GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) GetEtagForProfilesNotInTeam(teamId string) string - ClearAllCustomRoleAssignments() *model.AppError - InferSystemInstallDate() (int64, *model.AppError) - GetAllAfter(limit int, afterId string) ([]*model.User, *model.AppError) - GetUsersBatchForIndexing(startTime, endTime int64, limit int) ([]*model.UserForIndexing, *model.AppError) - Count(options model.UserCountOptions) (int64, *model.AppError) - GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) - GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) - PromoteGuestToUser(userID string) *model.AppError - DemoteUserToGuest(userID string) *model.AppError - DeactivateGuests() ([]string, *model.AppError) - AutocompleteUsersInChannel(teamId, channelId, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, *model.AppError) - GetKnownUsers(userID string) ([]string, *model.AppError) + ClearAllCustomRoleAssignments() error + InferSystemInstallDate() (int64, error) + GetAllAfter(limit int, afterId string) ([]*model.User, error) + GetUsersBatchForIndexing(startTime, endTime int64, limit int) ([]*model.UserForIndexing, error) + Count(options model.UserCountOptions) (int64, error) + GetTeamGroupUsers(teamID string) ([]*model.User, error) + GetChannelGroupUsers(channelID string) ([]*model.User, error) + PromoteGuestToUser(userID string) error + DemoteUserToGuest(userID string) error + DeactivateGuests() ([]string, error) + AutocompleteUsersInChannel(teamId, channelId, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) + GetKnownUsers(userID string) ([]string, error) } type BotStore interface { diff --git a/store/storetest/channel_store.go b/store/storetest/channel_store.go index d4d7e2d3bf..6cfae89c85 100644 --- a/store/storetest/channel_store.go +++ b/store/storetest/channel_store.go @@ -4470,8 +4470,8 @@ func testGetMemberCountsByGroup(t *testing.T, ss store.Store) { Email: MakeEmail(), DeleteAt: 0, } - _, err = ss.User().Save(u1) - require.Nil(t, err) + _, nErr = ss.User().Save(u1) + require.Nil(t, nErr) _, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) require.Nil(t, nErr) @@ -4541,8 +4541,8 @@ func testGetMemberCountsByGroup(t *testing.T, ss store.Store) { Email: MakeEmail(), DeleteAt: 0, } - _, err = ss.User().Save(u) - require.Nil(t, err) + _, nErr = ss.User().Save(u) + require.Nil(t, nErr) _, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, -1) require.Nil(t, nErr) @@ -4592,8 +4592,8 @@ func testGetMemberCountsByGroup(t *testing.T, ss store.Store) { Email: MakeEmail(), DeleteAt: 0, } - _, err = ss.User().Save(u) - require.Nil(t, err) + _, nErr = ss.User().Save(u) + require.Nil(t, nErr) _, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, -1) require.Nil(t, nErr) diff --git a/store/storetest/group_store.go b/store/storetest/group_store.go index 5eea2c94f7..912722acd6 100644 --- a/store/storetest/group_store.go +++ b/store/storetest/group_store.go @@ -374,8 +374,8 @@ func testGroupStoreGetByUser(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - u1, err = ss.User().Save(u1) - require.Nil(t, err) + u1, nErr := ss.User().Save(u1) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(g1.Id, u1.Id) require.Nil(t, err) @@ -386,8 +386,8 @@ func testGroupStoreGetByUser(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - u2, err = ss.User().Save(u2) - require.Nil(t, err) + u2, nErr = ss.User().Save(u2) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(g2.Id, u2.Id) require.Nil(t, err) @@ -571,8 +571,8 @@ func testGroupGetMemberUsers(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user1, err := ss.User().Save(u1) - require.Nil(t, err) + user1, nErr := ss.User().Save(u1) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(group.Id, user1.Id) require.Nil(t, err) @@ -581,8 +581,8 @@ func testGroupGetMemberUsers(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user2, err := ss.User().Save(u2) - require.Nil(t, err) + user2, nErr := ss.User().Save(u2) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(group.Id, user2.Id) require.Nil(t, err) @@ -623,8 +623,8 @@ func testGroupGetMemberUsersPage(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user1, err := ss.User().Save(u1) - require.Nil(t, err) + user1, nErr := ss.User().Save(u1) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(group.Id, user1.Id) require.Nil(t, err) @@ -633,8 +633,8 @@ func testGroupGetMemberUsersPage(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user2, err := ss.User().Save(u2) - require.Nil(t, err) + user2, nErr := ss.User().Save(u2) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(group.Id, user2.Id) require.Nil(t, err) @@ -643,8 +643,8 @@ func testGroupGetMemberUsersPage(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user3, err := ss.User().Save(u3) - require.Nil(t, err) + user3, nErr := ss.User().Save(u3) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(group.Id, user3.Id) require.Nil(t, err) @@ -923,8 +923,8 @@ func testUpsertMember(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user, err := ss.User().Save(u1) - require.Nil(t, err) + user, nErr := ss.User().Save(u1) + require.Nil(t, nErr) // Happy path d2, err := ss.Group().UpsertMember(group.Id, user.Id) @@ -981,8 +981,8 @@ func testGroupDeleteMember(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user, err := ss.User().Save(u1) - require.Nil(t, err) + user, nErr := ss.User().Save(u1) + require.Nil(t, nErr) // Create member d1, err := ss.Group().UpsertMember(group.Id, user.Id) @@ -1321,8 +1321,8 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user, err = ss.User().Save(user) - require.Nil(t, err) + user, nErr := ss.User().Save(user) + require.Nil(t, nErr) // Create GroupMember _, err = ss.Group().UpsertMember(group.Id, user.Id) @@ -1339,7 +1339,7 @@ func testTeamMembersToAdd(t *testing.T, ss store.Store) { Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TEAM_OPEN, } - team, nErr := ss.Team().Save(team) + team, nErr = ss.Team().Save(team) require.Nil(t, nErr) // Create GroupTeam @@ -1490,22 +1490,22 @@ func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user1, err = ss.User().Save(user1) - require.Nil(t, err) + user1, nErr := ss.User().Save(user1) + require.Nil(t, nErr) user2 := &model.User{ Email: MakeEmail(), Username: model.NewId(), } - user2, err = ss.User().Save(user2) - require.Nil(t, err) + user2, nErr = ss.User().Save(user2) + require.Nil(t, nErr) user3 := &model.User{ Email: MakeEmail(), Username: model.NewId(), } - user3, err = ss.User().Save(user3) - require.Nil(t, err) + user3, nErr = ss.User().Save(user3) + require.Nil(t, nErr) for _, user := range []*model.User{user1, user2} { _, err = ss.Group().UpsertMember(group1.Id, user.Id) @@ -1524,7 +1524,7 @@ func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) { Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TEAM_OPEN, } - team1, nErr := ss.Team().Save(team1) + team1, nErr = ss.Team().Save(team1) require.Nil(t, nErr) team2 := &model.Team{ @@ -1574,8 +1574,8 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user, err = ss.User().Save(user) - require.Nil(t, err) + user, nErr := ss.User().Save(user) + require.Nil(t, nErr) // Create GroupMember _, err = ss.Group().UpsertMember(group.Id, user.Id) @@ -1588,7 +1588,7 @@ func testChannelMembersToAdd(t *testing.T, ss store.Store) { Name: model.NewId(), Type: model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter. } - channel, nErr := ss.Channel().Save(channel, 9999) + channel, nErr = ss.Channel().Save(channel, 9999) require.Nil(t, nErr) // Create GroupChannel @@ -1749,22 +1749,22 @@ func testChannelMembersToAddSingleChannel(t *testing.T, ss store.Store) { Email: MakeEmail(), Username: model.NewId(), } - user1, err = ss.User().Save(user1) - require.Nil(t, err) + user1, nErr := ss.User().Save(user1) + require.Nil(t, nErr) user2 := &model.User{ Email: MakeEmail(), Username: model.NewId(), } - user2, err = ss.User().Save(user2) - require.Nil(t, err) + user2, nErr = ss.User().Save(user2) + require.Nil(t, nErr) user3 := &model.User{ Email: MakeEmail(), Username: model.NewId(), } - user3, err = ss.User().Save(user3) - require.Nil(t, err) + user3, nErr = ss.User().Save(user3) + require.Nil(t, nErr) for _, user := range []*model.User{user1, user2} { _, err = ss.Group().UpsertMember(group1.Id, user.Id) @@ -1778,7 +1778,7 @@ func testChannelMembersToAddSingleChannel(t *testing.T, ss store.Store) { Name: "z-z-" + model.NewId() + "a", Type: model.CHANNEL_OPEN, } - channel1, nErr := ss.Channel().Save(channel1, 999) + channel1, nErr = ss.Channel().Save(channel1, 999) require.Nil(t, nErr) channel2 := &model.Channel{ @@ -2131,24 +2131,24 @@ func pendingMemberRemovalsDataSetup(t *testing.T, ss store.Store) *removalsData Email: MakeEmail(), Username: model.NewId(), } - userA, err = ss.User().Save(userA) - require.Nil(t, err) + userA, nErr := ss.User().Save(userA) + require.Nil(t, nErr) // userB will not get removed from the group userB := &model.User{ Email: MakeEmail(), Username: model.NewId(), } - userB, err = ss.User().Save(userB) - require.Nil(t, err) + userB, nErr = ss.User().Save(userB) + require.Nil(t, nErr) // userC was never in the group userC := &model.User{ Email: MakeEmail(), Username: model.NewId(), } - userC, err = ss.User().Save(userC) - require.Nil(t, err) + userC, nErr = ss.User().Save(userC) + require.Nil(t, nErr) // add users to group (but not userC) _, err = ss.Group().UpsertMember(group.Id, userA.Id) @@ -2165,7 +2165,7 @@ func pendingMemberRemovalsDataSetup(t *testing.T, ss store.Store) *removalsData Type: model.CHANNEL_PRIVATE, GroupConstrained: model.NewBool(true), } - channelConstrained, nErr := ss.Channel().Save(channelConstrained, 9999) + channelConstrained, nErr = ss.Channel().Save(channelConstrained, 9999) require.Nil(t, nErr) channelUnconstrained := &model.Channel{ @@ -3747,14 +3747,14 @@ func groupTestGetMemberCount(t *testing.T, ss store.Store) { require.Nil(t, err) var user *model.User - + var nErr error for i := 0; i < 2; i++ { user = &model.User{ Email: MakeEmail(), Username: fmt.Sprintf("%d_%s", i, model.NewId()), } - user, err = ss.User().Save(user) - require.Nil(t, err) + user, nErr = ss.User().Save(user) + require.Nil(t, nErr) _, err = ss.Group().UpsertMember(group.Id, user.Id) require.Nil(t, err) @@ -3765,8 +3765,8 @@ func groupTestGetMemberCount(t *testing.T, ss store.Store) { require.Equal(t, int64(2), count) user.DeleteAt = 1 - _, err = ss.User().Update(user, true) - require.Nil(t, err) + _, nErr = ss.User().Update(user, true) + require.Nil(t, nErr) count, err = ss.Group().GetMemberCount(group.Id) require.Nil(t, err) diff --git a/store/storetest/mocks/UserStore.go b/store/storetest/mocks/UserStore.go index 517dbea778..fd11cfdb6e 100644 --- a/store/storetest/mocks/UserStore.go +++ b/store/storetest/mocks/UserStore.go @@ -16,7 +16,7 @@ type UserStore struct { } // AnalyticsActiveCount provides a mock function with given fields: time, options -func (_m *UserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, *model.AppError) { +func (_m *UserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, error) { ret := _m.Called(time, options) var r0 int64 @@ -26,13 +26,11 @@ func (_m *UserStore) AnalyticsActiveCount(time int64, options model.UserCountOpt r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(int64, model.UserCountOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(int64, model.UserCountOptions) error); ok { r1 = rf(time, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 @@ -60,7 +58,7 @@ func (_m *UserStore) AnalyticsActiveCountForPeriod(startTime int64, endTime int6 } // AnalyticsGetExternalUsers provides a mock function with given fields: hostDomain -func (_m *UserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, *model.AppError) { +func (_m *UserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, error) { ret := _m.Called(hostDomain) var r0 bool @@ -70,20 +68,18 @@ func (_m *UserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, *model. r0 = ret.Get(0).(bool) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(hostDomain) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // AnalyticsGetGuestCount provides a mock function with given fields: -func (_m *UserStore) AnalyticsGetGuestCount() (int64, *model.AppError) { +func (_m *UserStore) AnalyticsGetGuestCount() (int64, error) { ret := _m.Called() var r0 int64 @@ -93,20 +89,18 @@ func (_m *UserStore) AnalyticsGetGuestCount() (int64, *model.AppError) { r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func() *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // AnalyticsGetInactiveUsersCount provides a mock function with given fields: -func (_m *UserStore) AnalyticsGetInactiveUsersCount() (int64, *model.AppError) { +func (_m *UserStore) AnalyticsGetInactiveUsersCount() (int64, error) { ret := _m.Called() var r0 int64 @@ -116,20 +110,18 @@ func (_m *UserStore) AnalyticsGetInactiveUsersCount() (int64, *model.AppError) { r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func() *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // AnalyticsGetSystemAdminCount provides a mock function with given fields: -func (_m *UserStore) AnalyticsGetSystemAdminCount() (int64, *model.AppError) { +func (_m *UserStore) AnalyticsGetSystemAdminCount() (int64, error) { ret := _m.Called() var r0 int64 @@ -139,20 +131,18 @@ func (_m *UserStore) AnalyticsGetSystemAdminCount() (int64, *model.AppError) { r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func() *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // AutocompleteUsersInChannel provides a mock function with given fields: teamId, channelId, term, options -func (_m *UserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, *model.AppError) { +func (_m *UserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) { ret := _m.Called(teamId, channelId, term, options) var r0 *model.UserAutocompleteInChannel @@ -164,29 +154,25 @@ func (_m *UserStore) AutocompleteUsersInChannel(teamId string, channelId string, } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, string, *model.UserSearchOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string, *model.UserSearchOptions) error); ok { r1 = rf(teamId, channelId, term, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // ClearAllCustomRoleAssignments provides a mock function with given fields: -func (_m *UserStore) ClearAllCustomRoleAssignments() *model.AppError { +func (_m *UserStore) ClearAllCustomRoleAssignments() error { ret := _m.Called() - var r0 *model.AppError - if rf, ok := ret.Get(0).(func() *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 @@ -198,7 +184,7 @@ func (_m *UserStore) ClearCaches() { } // Count provides a mock function with given fields: options -func (_m *UserStore) Count(options model.UserCountOptions) (int64, *model.AppError) { +func (_m *UserStore) Count(options model.UserCountOptions) (int64, error) { ret := _m.Called(options) var r0 int64 @@ -208,20 +194,18 @@ func (_m *UserStore) Count(options model.UserCountOptions) (int64, *model.AppErr r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(model.UserCountOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(model.UserCountOptions) error); ok { r1 = rf(options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // DeactivateGuests provides a mock function with given fields: -func (_m *UserStore) DeactivateGuests() ([]string, *model.AppError) { +func (_m *UserStore) DeactivateGuests() ([]string, error) { ret := _m.Called() var r0 []string @@ -233,36 +217,32 @@ func (_m *UserStore) DeactivateGuests() ([]string, *model.AppError) { } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func() *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // DemoteUserToGuest provides a mock function with given fields: userID -func (_m *UserStore) DemoteUserToGuest(userID string) *model.AppError { +func (_m *UserStore) DemoteUserToGuest(userID string) error { ret := _m.Called(userID) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { r0 = rf(userID) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // Get provides a mock function with given fields: id -func (_m *UserStore) Get(id string) (*model.User, *model.AppError) { +func (_m *UserStore) Get(id string) (*model.User, error) { ret := _m.Called(id) var r0 *model.User @@ -274,20 +254,18 @@ func (_m *UserStore) Get(id string) (*model.User, *model.AppError) { } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(id) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetAll provides a mock function with given fields: -func (_m *UserStore) GetAll() ([]*model.User, *model.AppError) { +func (_m *UserStore) GetAll() ([]*model.User, error) { ret := _m.Called() var r0 []*model.User @@ -299,20 +277,18 @@ func (_m *UserStore) GetAll() ([]*model.User, *model.AppError) { } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func() *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetAllAfter provides a mock function with given fields: limit, afterId -func (_m *UserStore) GetAllAfter(limit int, afterId string) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetAllAfter(limit int, afterId string) ([]*model.User, error) { ret := _m.Called(limit, afterId) var r0 []*model.User @@ -324,20 +300,18 @@ func (_m *UserStore) GetAllAfter(limit int, afterId string) ([]*model.User, *mod } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(int, string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(int, string) error); ok { r1 = rf(limit, afterId) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetAllNotInAuthService provides a mock function with given fields: authServices -func (_m *UserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, error) { ret := _m.Called(authServices) var r0 []*model.User @@ -349,20 +323,18 @@ func (_m *UserStore) GetAllNotInAuthService(authServices []string) ([]*model.Use } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func([]string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func([]string) error); ok { r1 = rf(authServices) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetAllProfiles provides a mock function with given fields: options -func (_m *UserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, error) { ret := _m.Called(options) var r0 []*model.User @@ -374,20 +346,18 @@ func (_m *UserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.Use } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*model.UserGetOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*model.UserGetOptions) error); ok { r1 = rf(options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetAllProfilesInChannel provides a mock function with given fields: channelId, allowFromCache -func (_m *UserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) { +func (_m *UserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, error) { ret := _m.Called(channelId, allowFromCache) var r0 map[string]*model.User @@ -399,20 +369,18 @@ func (_m *UserStore) GetAllProfilesInChannel(channelId string, allowFromCache bo } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, bool) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, bool) error); ok { r1 = rf(channelId, allowFromCache) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetAllUsingAuthService provides a mock function with given fields: authService -func (_m *UserStore) GetAllUsingAuthService(authService string) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetAllUsingAuthService(authService string) ([]*model.User, error) { ret := _m.Called(authService) var r0 []*model.User @@ -424,20 +392,18 @@ func (_m *UserStore) GetAllUsingAuthService(authService string) ([]*model.User, } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(authService) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetAnyUnreadPostCountForChannel provides a mock function with given fields: userId, channelId -func (_m *UserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (_m *UserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, error) { ret := _m.Called(userId, channelId) var r0 int64 @@ -447,20 +413,18 @@ func (_m *UserStore) GetAnyUnreadPostCountForChannel(userId string, channelId st r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { r1 = rf(userId, channelId) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetByAuth provides a mock function with given fields: authData, authService -func (_m *UserStore) GetByAuth(authData *string, authService string) (*model.User, *model.AppError) { +func (_m *UserStore) GetByAuth(authData *string, authService string) (*model.User, error) { ret := _m.Called(authData, authService) var r0 *model.User @@ -472,20 +436,18 @@ func (_m *UserStore) GetByAuth(authData *string, authService string) (*model.Use } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*string, string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*string, string) error); ok { r1 = rf(authData, authService) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetByEmail provides a mock function with given fields: email -func (_m *UserStore) GetByEmail(email string) (*model.User, *model.AppError) { +func (_m *UserStore) GetByEmail(email string) (*model.User, error) { ret := _m.Called(email) var r0 *model.User @@ -497,20 +459,18 @@ func (_m *UserStore) GetByEmail(email string) (*model.User, *model.AppError) { } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(email) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetByUsername provides a mock function with given fields: username -func (_m *UserStore) GetByUsername(username string) (*model.User, *model.AppError) { +func (_m *UserStore) GetByUsername(username string) (*model.User, error) { ret := _m.Called(username) var r0 *model.User @@ -522,20 +482,18 @@ func (_m *UserStore) GetByUsername(username string) (*model.User, *model.AppErro } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(username) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetChannelGroupUsers provides a mock function with given fields: channelID -func (_m *UserStore) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetChannelGroupUsers(channelID string) ([]*model.User, error) { ret := _m.Called(channelID) var r0 []*model.User @@ -547,13 +505,11 @@ func (_m *UserStore) GetChannelGroupUsers(channelID string) ([]*model.User, *mod } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(channelID) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 @@ -602,7 +558,7 @@ func (_m *UserStore) GetEtagForProfilesNotInTeam(teamId string) string { } // GetForLogin provides a mock function with given fields: loginId, allowSignInWithUsername, allowSignInWithEmail -func (_m *UserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, *model.AppError) { +func (_m *UserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, error) { ret := _m.Called(loginId, allowSignInWithUsername, allowSignInWithEmail) var r0 *model.User @@ -614,20 +570,18 @@ func (_m *UserStore) GetForLogin(loginId string, allowSignInWithUsername bool, a } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, bool, bool) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, bool, bool) error); ok { r1 = rf(loginId, allowSignInWithUsername, allowSignInWithEmail) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetKnownUsers provides a mock function with given fields: userID -func (_m *UserStore) GetKnownUsers(userID string) ([]string, *model.AppError) { +func (_m *UserStore) GetKnownUsers(userID string) ([]string, error) { ret := _m.Called(userID) var r0 []string @@ -639,20 +593,18 @@ func (_m *UserStore) GetKnownUsers(userID string) ([]string, *model.AppError) { } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(userID) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetNewUsersForTeam provides a mock function with given fields: teamId, offset, limit, viewRestrictions -func (_m *UserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { ret := _m.Called(teamId, offset, limit, viewRestrictions) var r0 []*model.User @@ -664,20 +616,18 @@ func (_m *UserStore) GetNewUsersForTeam(teamId string, offset int, limit int, vi } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, int, int, *model.ViewUsersRestrictions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, int, int, *model.ViewUsersRestrictions) error); ok { r1 = rf(teamId, offset, limit, viewRestrictions) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfileByGroupChannelIdsForUser provides a mock function with given fields: userId, channelIds -func (_m *UserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, *model.AppError) { +func (_m *UserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, error) { ret := _m.Called(userId, channelIds) var r0 map[string][]*model.User @@ -689,20 +639,18 @@ func (_m *UserStore) GetProfileByGroupChannelIdsForUser(userId string, channelId } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, []string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, []string) error); ok { r1 = rf(userId, channelIds) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfileByIds provides a mock function with given fields: userIds, options, allowFromCache -func (_m *UserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) { ret := _m.Called(userIds, options, allowFromCache) var r0 []*model.User @@ -714,20 +662,18 @@ func (_m *UserStore) GetProfileByIds(userIds []string, options *store.UserGetByI } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func([]string, *store.UserGetByIdsOpts, bool) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func([]string, *store.UserGetByIdsOpts, bool) error); ok { r1 = rf(userIds, options, allowFromCache) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfiles provides a mock function with given fields: options -func (_m *UserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, error) { ret := _m.Called(options) var r0 []*model.User @@ -739,20 +685,18 @@ func (_m *UserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*model.UserGetOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*model.UserGetOptions) error); ok { r1 = rf(options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfilesByUsernames provides a mock function with given fields: usernames, viewRestrictions -func (_m *UserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { ret := _m.Called(usernames, viewRestrictions) var r0 []*model.User @@ -764,20 +708,18 @@ func (_m *UserStore) GetProfilesByUsernames(usernames []string, viewRestrictions } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func([]string, *model.ViewUsersRestrictions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func([]string, *model.ViewUsersRestrictions) error); ok { r1 = rf(usernames, viewRestrictions) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfilesInChannel provides a mock function with given fields: options -func (_m *UserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, error) { ret := _m.Called(options) var r0 []*model.User @@ -789,20 +731,18 @@ func (_m *UserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*mod } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*model.UserGetOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*model.UserGetOptions) error); ok { r1 = rf(options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfilesInChannelByStatus provides a mock function with given fields: options -func (_m *UserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, error) { ret := _m.Called(options) var r0 []*model.User @@ -814,20 +754,18 @@ func (_m *UserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*model.UserGetOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*model.UserGetOptions) error); ok { r1 = rf(options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfilesNotInChannel provides a mock function with given fields: teamId, channelId, groupConstrained, offset, limit, viewRestrictions -func (_m *UserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { ret := _m.Called(teamId, channelId, groupConstrained, offset, limit, viewRestrictions) var r0 []*model.User @@ -839,20 +777,18 @@ func (_m *UserStore) GetProfilesNotInChannel(teamId string, channelId string, gr } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, bool, int, int, *model.ViewUsersRestrictions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, bool, int, int, *model.ViewUsersRestrictions) error); ok { r1 = rf(teamId, channelId, groupConstrained, offset, limit, viewRestrictions) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfilesNotInTeam provides a mock function with given fields: teamId, groupConstrained, offset, limit, viewRestrictions -func (_m *UserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { ret := _m.Called(teamId, groupConstrained, offset, limit, viewRestrictions) var r0 []*model.User @@ -864,20 +800,18 @@ func (_m *UserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, bool, int, int, *model.ViewUsersRestrictions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, bool, int, int, *model.ViewUsersRestrictions) error); ok { r1 = rf(teamId, groupConstrained, offset, limit, viewRestrictions) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetProfilesWithoutTeam provides a mock function with given fields: options -func (_m *UserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, error) { ret := _m.Called(options) var r0 []*model.User @@ -889,20 +823,18 @@ func (_m *UserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*m } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*model.UserGetOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*model.UserGetOptions) error); ok { r1 = rf(options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetRecentlyActiveUsersForTeam provides a mock function with given fields: teamId, offset, limit, viewRestrictions -func (_m *UserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { ret := _m.Called(teamId, offset, limit, viewRestrictions) var r0 []*model.User @@ -914,20 +846,18 @@ func (_m *UserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, li } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, int, int, *model.ViewUsersRestrictions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, int, int, *model.ViewUsersRestrictions) error); ok { r1 = rf(teamId, offset, limit, viewRestrictions) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetSystemAdminProfiles provides a mock function with given fields: -func (_m *UserStore) GetSystemAdminProfiles() (map[string]*model.User, *model.AppError) { +func (_m *UserStore) GetSystemAdminProfiles() (map[string]*model.User, error) { ret := _m.Called() var r0 map[string]*model.User @@ -939,20 +869,18 @@ func (_m *UserStore) GetSystemAdminProfiles() (map[string]*model.User, *model.Ap } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func() *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetTeamGroupUsers provides a mock function with given fields: teamID -func (_m *UserStore) GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) { +func (_m *UserStore) GetTeamGroupUsers(teamID string) ([]*model.User, error) { ret := _m.Called(teamID) var r0 []*model.User @@ -964,20 +892,18 @@ func (_m *UserStore) GetTeamGroupUsers(teamID string) ([]*model.User, *model.App } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(teamID) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetUnreadCount provides a mock function with given fields: userId -func (_m *UserStore) GetUnreadCount(userId string) (int64, *model.AppError) { +func (_m *UserStore) GetUnreadCount(userId string) (int64, error) { ret := _m.Called(userId) var r0 int64 @@ -987,20 +913,18 @@ func (_m *UserStore) GetUnreadCount(userId string) (int64, *model.AppError) { r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(userId) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetUnreadCountForChannel provides a mock function with given fields: userId, channelId -func (_m *UserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (_m *UserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, error) { ret := _m.Called(userId, channelId) var r0 int64 @@ -1010,20 +934,18 @@ func (_m *UserStore) GetUnreadCountForChannel(userId string, channelId string) ( r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { r1 = rf(userId, channelId) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // GetUsersBatchForIndexing provides a mock function with given fields: startTime, endTime, limit -func (_m *UserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, *model.AppError) { +func (_m *UserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, error) { ret := _m.Called(startTime, endTime, limit) var r0 []*model.UserForIndexing @@ -1035,20 +957,18 @@ func (_m *UserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, li } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(int64, int64, int) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(int64, int64, int) error); ok { r1 = rf(startTime, endTime, limit) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // InferSystemInstallDate provides a mock function with given fields: -func (_m *UserStore) InferSystemInstallDate() (int64, *model.AppError) { +func (_m *UserStore) InferSystemInstallDate() (int64, error) { ret := _m.Called() var r0 int64 @@ -1058,13 +978,11 @@ func (_m *UserStore) InferSystemInstallDate() (int64, *model.AppError) { r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func() *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 @@ -1086,55 +1004,49 @@ func (_m *UserStore) InvalidateProfilesInChannelCacheByUser(userId string) { } // PermanentDelete provides a mock function with given fields: userId -func (_m *UserStore) PermanentDelete(userId string) *model.AppError { +func (_m *UserStore) PermanentDelete(userId string) error { ret := _m.Called(userId) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { r0 = rf(userId) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // PromoteGuestToUser provides a mock function with given fields: userID -func (_m *UserStore) PromoteGuestToUser(userID string) *model.AppError { +func (_m *UserStore) PromoteGuestToUser(userID string) error { ret := _m.Called(userID) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { r0 = rf(userID) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // ResetLastPictureUpdate provides a mock function with given fields: userId -func (_m *UserStore) ResetLastPictureUpdate(userId string) *model.AppError { +func (_m *UserStore) ResetLastPictureUpdate(userId string) error { ret := _m.Called(userId) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { r0 = rf(userId) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // Save provides a mock function with given fields: user -func (_m *UserStore) Save(user *model.User) (*model.User, *model.AppError) { +func (_m *UserStore) Save(user *model.User) (*model.User, error) { ret := _m.Called(user) var r0 *model.User @@ -1146,20 +1058,18 @@ func (_m *UserStore) Save(user *model.User) (*model.User, *model.AppError) { } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*model.User) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*model.User) error); ok { r1 = rf(user) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // Search provides a mock function with given fields: teamId, term, options -func (_m *UserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { ret := _m.Called(teamId, term, options) var r0 []*model.User @@ -1171,20 +1081,18 @@ func (_m *UserStore) Search(teamId string, term string, options *model.UserSearc } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) error); ok { r1 = rf(teamId, term, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // SearchInChannel provides a mock function with given fields: channelId, term, options -func (_m *UserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { ret := _m.Called(channelId, term, options) var r0 []*model.User @@ -1196,20 +1104,18 @@ func (_m *UserStore) SearchInChannel(channelId string, term string, options *mod } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) error); ok { r1 = rf(channelId, term, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // SearchInGroup provides a mock function with given fields: groupID, term, options -func (_m *UserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) { ret := _m.Called(groupID, term, options) var r0 []*model.User @@ -1221,20 +1127,18 @@ func (_m *UserStore) SearchInGroup(groupID string, term string, options *model.U } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) error); ok { r1 = rf(groupID, term, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // SearchNotInChannel provides a mock function with given fields: teamId, channelId, term, options -func (_m *UserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { ret := _m.Called(teamId, channelId, term, options) var r0 []*model.User @@ -1246,20 +1150,18 @@ func (_m *UserStore) SearchNotInChannel(teamId string, channelId string, term st } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, string, *model.UserSearchOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string, *model.UserSearchOptions) error); ok { r1 = rf(teamId, channelId, term, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // SearchNotInTeam provides a mock function with given fields: notInTeamId, term, options -func (_m *UserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { ret := _m.Called(notInTeamId, term, options) var r0 []*model.User @@ -1271,20 +1173,18 @@ func (_m *UserStore) SearchNotInTeam(notInTeamId string, term string, options *m } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, *model.UserSearchOptions) error); ok { r1 = rf(notInTeamId, term, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // SearchWithoutTeam provides a mock function with given fields: term, options -func (_m *UserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (_m *UserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, error) { ret := _m.Called(term, options) var r0 []*model.User @@ -1296,20 +1196,18 @@ func (_m *UserStore) SearchWithoutTeam(term string, options *model.UserSearchOpt } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, *model.UserSearchOptions) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, *model.UserSearchOptions) error); ok { r1 = rf(term, options) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // Update provides a mock function with given fields: user, allowRoleUpdate -func (_m *UserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, *model.AppError) { +func (_m *UserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error) { ret := _m.Called(user, allowRoleUpdate) var r0 *model.UserUpdate @@ -1321,20 +1219,18 @@ func (_m *UserStore) Update(user *model.User, allowRoleUpdate bool) (*model.User } } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(*model.User, bool) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(*model.User, bool) error); ok { r1 = rf(user, allowRoleUpdate) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // UpdateAuthData provides a mock function with given fields: userId, service, authData, email, resetMfa -func (_m *UserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError) { +func (_m *UserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, error) { ret := _m.Called(userId, service, authData, email, resetMfa) var r0 string @@ -1344,100 +1240,88 @@ func (_m *UserStore) UpdateAuthData(userId string, service string, authData *str r0 = ret.Get(0).(string) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string, *string, string, bool) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string, *string, string, bool) error); ok { r1 = rf(userId, service, authData, email, resetMfa) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // UpdateFailedPasswordAttempts provides a mock function with given fields: userId, attempts -func (_m *UserStore) UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError { +func (_m *UserStore) UpdateFailedPasswordAttempts(userId string, attempts int) error { ret := _m.Called(userId, attempts) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string, int) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string, int) error); ok { r0 = rf(userId, attempts) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // UpdateLastPictureUpdate provides a mock function with given fields: userId -func (_m *UserStore) UpdateLastPictureUpdate(userId string) *model.AppError { +func (_m *UserStore) UpdateLastPictureUpdate(userId string) error { ret := _m.Called(userId) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { r0 = rf(userId) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // UpdateMfaActive provides a mock function with given fields: userId, active -func (_m *UserStore) UpdateMfaActive(userId string, active bool) *model.AppError { +func (_m *UserStore) UpdateMfaActive(userId string, active bool) error { ret := _m.Called(userId, active) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string, bool) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string, bool) error); ok { r0 = rf(userId, active) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // UpdateMfaSecret provides a mock function with given fields: userId, secret -func (_m *UserStore) UpdateMfaSecret(userId string, secret string) *model.AppError { +func (_m *UserStore) UpdateMfaSecret(userId string, secret string) error { ret := _m.Called(userId, secret) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string, string) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { r0 = rf(userId, secret) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // UpdatePassword provides a mock function with given fields: userId, newPassword -func (_m *UserStore) UpdatePassword(userId string, newPassword string) *model.AppError { +func (_m *UserStore) UpdatePassword(userId string, newPassword string) error { ret := _m.Called(userId, newPassword) - var r0 *model.AppError - if rf, ok := ret.Get(0).(func(string, string) *model.AppError); ok { + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { r0 = rf(userId, newPassword) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.AppError) - } + r0 = ret.Error(0) } return r0 } // UpdateUpdateAt provides a mock function with given fields: userId -func (_m *UserStore) UpdateUpdateAt(userId string) (int64, *model.AppError) { +func (_m *UserStore) UpdateUpdateAt(userId string) (int64, error) { ret := _m.Called(userId) var r0 int64 @@ -1447,20 +1331,18 @@ func (_m *UserStore) UpdateUpdateAt(userId string) (int64, *model.AppError) { r0 = ret.Get(0).(int64) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(userId) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 } // VerifyEmail provides a mock function with given fields: userId, email -func (_m *UserStore) VerifyEmail(userId string, email string) (string, *model.AppError) { +func (_m *UserStore) VerifyEmail(userId string, email string) (string, error) { ret := _m.Called(userId, email) var r0 string @@ -1470,13 +1352,11 @@ func (_m *UserStore) VerifyEmail(userId string, email string) (string, *model.Ap r0 = ret.Get(0).(string) } - var r1 *model.AppError - if rf, ok := ret.Get(1).(func(string, string) *model.AppError); ok { + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { r1 = rf(userId, email) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(*model.AppError) - } + r1 = ret.Error(1) } return r0, r1 diff --git a/store/storetest/team_store.go b/store/storetest/team_store.go index b802fa6bf2..025744744f 100644 --- a/store/storetest/team_store.go +++ b/store/storetest/team_store.go @@ -2785,17 +2785,17 @@ func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) { require.Nil(t, err) require.Equal(t, int(totalMemberCount), maxUsersPerTeam, "should start with 5 team members, had %v instead", totalMemberCount) - user, err := ss.User().Save(&model.User{ + user, nErr := ss.User().Save(&model.User{ Username: model.NewId(), Email: MakeEmail(), }) - require.Nil(t, err) + require.Nil(t, nErr) newUserId := user.Id defer func() { ss.User().PermanentDelete(newUserId) }() - _, nErr := ss.Team().SaveMember(&model.TeamMember{ + _, nErr = ss.Team().SaveMember(&model.TeamMember{ TeamId: team.Id, UserId: newUserId, }, maxUsersPerTeam) @@ -2827,17 +2827,17 @@ func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) { require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should have 5 team members again, had %v instead", totalMemberCount) // Deactivating a user should make them stop counting against max members - user2, err := ss.User().Get(userIds[1]) - require.Nil(t, err) + user2, nErr := ss.User().Get(userIds[1]) + require.Nil(t, nErr) user2.DeleteAt = 1234 - _, err = ss.User().Update(user2, true) - require.Nil(t, err) + _, nErr = ss.User().Update(user2, true) + require.Nil(t, nErr) - user, err = ss.User().Save(&model.User{ + user, nErr = ss.User().Save(&model.User{ Username: model.NewId(), Email: MakeEmail(), }) - require.Nil(t, err) + require.Nil(t, nErr) newUserId2 := user.Id _, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam) require.Nil(t, nErr, "should've been able to save new member after deleting one") diff --git a/store/storetest/user_store.go b/store/storetest/user_store.go index 1f9d90d9de..1e91add4e8 100644 --- a/store/storetest/user_store.go +++ b/store/storetest/user_store.go @@ -4,6 +4,7 @@ package storetest import ( + "errors" "strings" "testing" "time" @@ -1788,13 +1789,11 @@ func testUserStoreGetByEmail(t *testing.T, ss store.Store) { t.Run("get by empty email", func(t *testing.T) { _, err := ss.User().GetByEmail("") require.NotNil(t, err) - require.Equal(t, err.Id, store.MISSING_ACCOUNT_ERROR) }) t.Run("get by unknown", func(t *testing.T) { _, err := ss.User().GetByEmail("unknown") require.NotNil(t, err) - require.Equal(t, err.Id, store.MISSING_ACCOUNT_ERROR) }) } @@ -1857,21 +1856,24 @@ func testUserStoreGetByAuthData(t *testing.T, ss store.Store) { t.Run("get by u1 auth, unknown service", func(t *testing.T) { _, err := ss.User().GetByAuth(u1.AuthData, "unknown") require.NotNil(t, err) - require.Equal(t, err.Id, store.MISSING_AUTH_ACCOUNT_ERROR) + var nfErr *store.ErrNotFound + require.True(t, errors.As(err, &nfErr)) }) t.Run("get by unknown auth, u1 service", func(t *testing.T) { unknownAuth := "" _, err := ss.User().GetByAuth(&unknownAuth, u1.AuthService) require.NotNil(t, err) - require.Equal(t, err.Id, store.MISSING_AUTH_ACCOUNT_ERROR) + var invErr *store.ErrInvalidInput + require.True(t, errors.As(err, &invErr)) }) t.Run("get by unknown auth, unknown service", func(t *testing.T) { unknownAuth := "" _, err := ss.User().GetByAuth(&unknownAuth, "unknown") require.NotNil(t, err) - require.Equal(t, err.Id, store.MISSING_AUTH_ACCOUNT_ERROR) + var invErr *store.ErrInvalidInput + require.True(t, errors.As(err, &invErr)) }) } @@ -1934,13 +1936,15 @@ func testUserStoreGetByUsername(t *testing.T, ss store.Store) { t.Run("get by empty username", func(t *testing.T) { _, err := ss.User().GetByUsername("") require.NotNil(t, err) - require.Equal(t, err.Id, "store.sql_user.get_by_username.app_error") + var nfErr *store.ErrNotFound + require.True(t, errors.As(err, &nfErr)) }) t.Run("get by unknown", func(t *testing.T) { _, err := ss.User().GetByUsername("unknown") require.NotNil(t, err) - require.Equal(t, err.Id, "store.sql_user.get_by_username.app_error") + var nfErr *store.ErrNotFound + require.True(t, errors.As(err, &nfErr)) }) } @@ -2007,7 +2011,7 @@ func testUserStoreGetForLogin(t *testing.T, ss store.Store) { t.Run("get u1 by username, allow only email", func(t *testing.T) { _, err := ss.User().GetForLogin(u1.Username, false, true) require.NotNil(t, err) - require.Equal(t, err.Id, "store.sql_user.get_for_login.app_error") + require.Equal(t, "user not found", err.Error()) }) t.Run("get u1 by email, allow both", func(t *testing.T) { @@ -2025,7 +2029,7 @@ func testUserStoreGetForLogin(t *testing.T, ss store.Store) { t.Run("get u1 by email, allow only username", func(t *testing.T) { _, err := ss.User().GetForLogin(u1.Email, true, false) require.NotNil(t, err) - require.Equal(t, err.Id, "store.sql_user.get_for_login.app_error") + require.Equal(t, "user not found", err.Error()) }) t.Run("get u2 by username, allow both", func(t *testing.T) { @@ -2043,7 +2047,7 @@ func testUserStoreGetForLogin(t *testing.T, ss store.Store) { t.Run("get u2 by username, allow neither", func(t *testing.T) { _, err := ss.User().GetForLogin(u2.Username, false, false) require.NotNil(t, err) - require.Equal(t, err.Id, "store.sql_user.get_for_login.app_error") + require.Equal(t, "sign in with username and email are disabled", err.Error()) }) } @@ -3949,12 +3953,12 @@ func testUserStoreAnalyticsGetSystemAdminCount(t *testing.T, ss store.Store) { u2.Email = MakeEmail() u2.Username = model.NewId() - _, err = ss.User().Save(&u1) - require.Nil(t, err, "couldn't save user") + _, nErr := ss.User().Save(&u1) + require.Nil(t, nErr, "couldn't save user") defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() - _, err = ss.User().Save(&u2) - require.Nil(t, err, "couldn't save user") + _, nErr = ss.User().Save(&u2) + require.Nil(t, nErr, "couldn't save user") defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() @@ -3983,16 +3987,16 @@ func testUserStoreAnalyticsGetGuestCount(t *testing.T, ss store.Store) { u3.Username = model.NewId() u3.Roles = "system_guest" - _, err = ss.User().Save(&u1) - require.Nil(t, err, "couldn't save user") + _, nErr := ss.User().Save(&u1) + require.Nil(t, nErr, "couldn't save user") defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() - _, err = ss.User().Save(&u2) - require.Nil(t, err, "couldn't save user") + _, nErr = ss.User().Save(&u2) + require.Nil(t, nErr, "couldn't save user") defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() - _, err = ss.User().Save(&u3) - require.Nil(t, err, "couldn't save user") + _, nErr = ss.User().Save(&u3) + require.Nil(t, nErr, "couldn't save user") defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() result, err := ss.User().AnalyticsGetGuestCount() diff --git a/store/timerlayer/timerlayer.go b/store/timerlayer/timerlayer.go index 092a9eae84..c1f3a62d61 100644 --- a/store/timerlayer/timerlayer.go +++ b/store/timerlayer/timerlayer.go @@ -7207,7 +7207,7 @@ func (s *TimerLayerUploadSessionStore) Update(session *model.UploadSession) erro return err } -func (s *TimerLayerUserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, *model.AppError) { +func (s *TimerLayerUserStore) AnalyticsActiveCount(time int64, options model.UserCountOptions) (int64, error) { start := timemodule.Now() result, err := s.UserStore.AnalyticsActiveCount(time, options) @@ -7239,7 +7239,7 @@ func (s *TimerLayerUserStore) AnalyticsActiveCountForPeriod(startTime int64, end return result, err } -func (s *TimerLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, *model.AppError) { +func (s *TimerLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool, error) { start := timemodule.Now() result, err := s.UserStore.AnalyticsGetExternalUsers(hostDomain) @@ -7255,7 +7255,7 @@ func (s *TimerLayerUserStore) AnalyticsGetExternalUsers(hostDomain string) (bool return result, err } -func (s *TimerLayerUserStore) AnalyticsGetGuestCount() (int64, *model.AppError) { +func (s *TimerLayerUserStore) AnalyticsGetGuestCount() (int64, error) { start := timemodule.Now() result, err := s.UserStore.AnalyticsGetGuestCount() @@ -7271,7 +7271,7 @@ func (s *TimerLayerUserStore) AnalyticsGetGuestCount() (int64, *model.AppError) return result, err } -func (s *TimerLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, *model.AppError) { +func (s *TimerLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, error) { start := timemodule.Now() result, err := s.UserStore.AnalyticsGetInactiveUsersCount() @@ -7287,7 +7287,7 @@ func (s *TimerLayerUserStore) AnalyticsGetInactiveUsersCount() (int64, *model.Ap return result, err } -func (s *TimerLayerUserStore) AnalyticsGetSystemAdminCount() (int64, *model.AppError) { +func (s *TimerLayerUserStore) AnalyticsGetSystemAdminCount() (int64, error) { start := timemodule.Now() result, err := s.UserStore.AnalyticsGetSystemAdminCount() @@ -7303,7 +7303,7 @@ func (s *TimerLayerUserStore) AnalyticsGetSystemAdminCount() (int64, *model.AppE return result, err } -func (s *TimerLayerUserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, *model.AppError) { +func (s *TimerLayerUserStore) AutocompleteUsersInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) (*model.UserAutocompleteInChannel, error) { start := timemodule.Now() result, err := s.UserStore.AutocompleteUsersInChannel(teamId, channelId, term, options) @@ -7319,7 +7319,7 @@ func (s *TimerLayerUserStore) AutocompleteUsersInChannel(teamId string, channelI return result, err } -func (s *TimerLayerUserStore) ClearAllCustomRoleAssignments() *model.AppError { +func (s *TimerLayerUserStore) ClearAllCustomRoleAssignments() error { start := timemodule.Now() err := s.UserStore.ClearAllCustomRoleAssignments() @@ -7350,7 +7350,7 @@ func (s *TimerLayerUserStore) ClearCaches() { } } -func (s *TimerLayerUserStore) Count(options model.UserCountOptions) (int64, *model.AppError) { +func (s *TimerLayerUserStore) Count(options model.UserCountOptions) (int64, error) { start := timemodule.Now() result, err := s.UserStore.Count(options) @@ -7366,7 +7366,7 @@ func (s *TimerLayerUserStore) Count(options model.UserCountOptions) (int64, *mod return result, err } -func (s *TimerLayerUserStore) DeactivateGuests() ([]string, *model.AppError) { +func (s *TimerLayerUserStore) DeactivateGuests() ([]string, error) { start := timemodule.Now() result, err := s.UserStore.DeactivateGuests() @@ -7382,7 +7382,7 @@ func (s *TimerLayerUserStore) DeactivateGuests() ([]string, *model.AppError) { return result, err } -func (s *TimerLayerUserStore) DemoteUserToGuest(userID string) *model.AppError { +func (s *TimerLayerUserStore) DemoteUserToGuest(userID string) error { start := timemodule.Now() err := s.UserStore.DemoteUserToGuest(userID) @@ -7398,7 +7398,7 @@ func (s *TimerLayerUserStore) DemoteUserToGuest(userID string) *model.AppError { return err } -func (s *TimerLayerUserStore) Get(id string) (*model.User, *model.AppError) { +func (s *TimerLayerUserStore) Get(id string) (*model.User, error) { start := timemodule.Now() result, err := s.UserStore.Get(id) @@ -7414,7 +7414,7 @@ func (s *TimerLayerUserStore) Get(id string) (*model.User, *model.AppError) { return result, err } -func (s *TimerLayerUserStore) GetAll() ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetAll() ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetAll() @@ -7430,7 +7430,7 @@ func (s *TimerLayerUserStore) GetAll() ([]*model.User, *model.AppError) { return result, err } -func (s *TimerLayerUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetAllAfter(limit int, afterId string) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetAllAfter(limit, afterId) @@ -7446,7 +7446,7 @@ func (s *TimerLayerUserStore) GetAllAfter(limit int, afterId string) ([]*model.U return result, err } -func (s *TimerLayerUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetAllNotInAuthService(authServices []string) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetAllNotInAuthService(authServices) @@ -7462,7 +7462,7 @@ func (s *TimerLayerUserStore) GetAllNotInAuthService(authServices []string) ([]* return result, err } -func (s *TimerLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetAllProfiles(options) @@ -7478,7 +7478,7 @@ func (s *TimerLayerUserStore) GetAllProfiles(options *model.UserGetOptions) ([]* return result, err } -func (s *TimerLayerUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetAllProfilesInChannel(channelId string, allowFromCache bool) (map[string]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetAllProfilesInChannel(channelId, allowFromCache) @@ -7494,7 +7494,7 @@ func (s *TimerLayerUserStore) GetAllProfilesInChannel(channelId string, allowFro return result, err } -func (s *TimerLayerUserStore) GetAllUsingAuthService(authService string) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetAllUsingAuthService(authService string) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetAllUsingAuthService(authService) @@ -7510,7 +7510,7 @@ func (s *TimerLayerUserStore) GetAllUsingAuthService(authService string) ([]*mod return result, err } -func (s *TimerLayerUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (s *TimerLayerUserStore) GetAnyUnreadPostCountForChannel(userId string, channelId string) (int64, error) { start := timemodule.Now() result, err := s.UserStore.GetAnyUnreadPostCountForChannel(userId, channelId) @@ -7526,7 +7526,7 @@ func (s *TimerLayerUserStore) GetAnyUnreadPostCountForChannel(userId string, cha return result, err } -func (s *TimerLayerUserStore) GetByAuth(authData *string, authService string) (*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetByAuth(authData *string, authService string) (*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetByAuth(authData, authService) @@ -7542,7 +7542,7 @@ func (s *TimerLayerUserStore) GetByAuth(authData *string, authService string) (* return result, err } -func (s *TimerLayerUserStore) GetByEmail(email string) (*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetByEmail(email string) (*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetByEmail(email) @@ -7558,7 +7558,7 @@ func (s *TimerLayerUserStore) GetByEmail(email string) (*model.User, *model.AppE return result, err } -func (s *TimerLayerUserStore) GetByUsername(username string) (*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetByUsername(username string) (*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetByUsername(username) @@ -7574,7 +7574,7 @@ func (s *TimerLayerUserStore) GetByUsername(username string) (*model.User, *mode return result, err } -func (s *TimerLayerUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetChannelGroupUsers(channelID string) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetChannelGroupUsers(channelID) @@ -7638,7 +7638,7 @@ func (s *TimerLayerUserStore) GetEtagForProfilesNotInTeam(teamId string) string return result } -func (s *TimerLayerUserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetForLogin(loginId string, allowSignInWithUsername bool, allowSignInWithEmail bool) (*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetForLogin(loginId, allowSignInWithUsername, allowSignInWithEmail) @@ -7654,7 +7654,7 @@ func (s *TimerLayerUserStore) GetForLogin(loginId string, allowSignInWithUsernam return result, err } -func (s *TimerLayerUserStore) GetKnownUsers(userID string) ([]string, *model.AppError) { +func (s *TimerLayerUserStore) GetKnownUsers(userID string) ([]string, error) { start := timemodule.Now() result, err := s.UserStore.GetKnownUsers(userID) @@ -7670,7 +7670,7 @@ func (s *TimerLayerUserStore) GetKnownUsers(userID string) ([]string, *model.App return result, err } -func (s *TimerLayerUserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetNewUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetNewUsersForTeam(teamId, offset, limit, viewRestrictions) @@ -7686,7 +7686,7 @@ func (s *TimerLayerUserStore) GetNewUsersForTeam(teamId string, offset int, limi return result, err } -func (s *TimerLayerUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfileByGroupChannelIdsForUser(userId string, channelIds []string) (map[string][]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfileByGroupChannelIdsForUser(userId, channelIds) @@ -7702,7 +7702,7 @@ func (s *TimerLayerUserStore) GetProfileByGroupChannelIdsForUser(userId string, return result, err } -func (s *TimerLayerUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfileByIds(userIds []string, options *store.UserGetByIdsOpts, allowFromCache bool) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfileByIds(userIds, options, allowFromCache) @@ -7718,7 +7718,7 @@ func (s *TimerLayerUserStore) GetProfileByIds(userIds []string, options *store.U return result, err } -func (s *TimerLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfiles(options) @@ -7734,7 +7734,7 @@ func (s *TimerLayerUserStore) GetProfiles(options *model.UserGetOptions) ([]*mod return result, err } -func (s *TimerLayerUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfilesByUsernames(usernames []string, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfilesByUsernames(usernames, viewRestrictions) @@ -7750,7 +7750,7 @@ func (s *TimerLayerUserStore) GetProfilesByUsernames(usernames []string, viewRes return result, err } -func (s *TimerLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfilesInChannel(options) @@ -7766,7 +7766,7 @@ func (s *TimerLayerUserStore) GetProfilesInChannel(options *model.UserGetOptions return result, err } -func (s *TimerLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGetOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfilesInChannelByStatus(options) @@ -7782,7 +7782,7 @@ func (s *TimerLayerUserStore) GetProfilesInChannelByStatus(options *model.UserGe return result, err } -func (s *TimerLayerUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfilesNotInChannel(teamId string, channelId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfilesNotInChannel(teamId, channelId, groupConstrained, offset, limit, viewRestrictions) @@ -7798,7 +7798,7 @@ func (s *TimerLayerUserStore) GetProfilesNotInChannel(teamId string, channelId s return result, err } -func (s *TimerLayerUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfilesNotInTeam(teamId string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfilesNotInTeam(teamId, groupConstrained, offset, limit, viewRestrictions) @@ -7814,7 +7814,7 @@ func (s *TimerLayerUserStore) GetProfilesNotInTeam(teamId string, groupConstrain return result, err } -func (s *TimerLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetProfilesWithoutTeam(options) @@ -7830,7 +7830,7 @@ func (s *TimerLayerUserStore) GetProfilesWithoutTeam(options *model.UserGetOptio return result, err } -func (s *TimerLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetRecentlyActiveUsersForTeam(teamId, offset, limit, viewRestrictions) @@ -7846,7 +7846,7 @@ func (s *TimerLayerUserStore) GetRecentlyActiveUsersForTeam(teamId string, offse return result, err } -func (s *TimerLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetSystemAdminProfiles() @@ -7862,7 +7862,7 @@ func (s *TimerLayerUserStore) GetSystemAdminProfiles() (map[string]*model.User, return result, err } -func (s *TimerLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.GetTeamGroupUsers(teamID) @@ -7878,7 +7878,7 @@ func (s *TimerLayerUserStore) GetTeamGroupUsers(teamID string) ([]*model.User, * return result, err } -func (s *TimerLayerUserStore) GetUnreadCount(userId string) (int64, *model.AppError) { +func (s *TimerLayerUserStore) GetUnreadCount(userId string) (int64, error) { start := timemodule.Now() result, err := s.UserStore.GetUnreadCount(userId) @@ -7894,7 +7894,7 @@ func (s *TimerLayerUserStore) GetUnreadCount(userId string) (int64, *model.AppEr return result, err } -func (s *TimerLayerUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, *model.AppError) { +func (s *TimerLayerUserStore) GetUnreadCountForChannel(userId string, channelId string) (int64, error) { start := timemodule.Now() result, err := s.UserStore.GetUnreadCountForChannel(userId, channelId) @@ -7910,7 +7910,7 @@ func (s *TimerLayerUserStore) GetUnreadCountForChannel(userId string, channelId return result, err } -func (s *TimerLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, *model.AppError) { +func (s *TimerLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime int64, limit int) ([]*model.UserForIndexing, error) { start := timemodule.Now() result, err := s.UserStore.GetUsersBatchForIndexing(startTime, endTime, limit) @@ -7926,7 +7926,7 @@ func (s *TimerLayerUserStore) GetUsersBatchForIndexing(startTime int64, endTime return result, err } -func (s *TimerLayerUserStore) InferSystemInstallDate() (int64, *model.AppError) { +func (s *TimerLayerUserStore) InferSystemInstallDate() (int64, error) { start := timemodule.Now() result, err := s.UserStore.InferSystemInstallDate() @@ -7987,7 +7987,7 @@ func (s *TimerLayerUserStore) InvalidateProfilesInChannelCacheByUser(userId stri } } -func (s *TimerLayerUserStore) PermanentDelete(userId string) *model.AppError { +func (s *TimerLayerUserStore) PermanentDelete(userId string) error { start := timemodule.Now() err := s.UserStore.PermanentDelete(userId) @@ -8003,7 +8003,7 @@ func (s *TimerLayerUserStore) PermanentDelete(userId string) *model.AppError { return err } -func (s *TimerLayerUserStore) PromoteGuestToUser(userID string) *model.AppError { +func (s *TimerLayerUserStore) PromoteGuestToUser(userID string) error { start := timemodule.Now() err := s.UserStore.PromoteGuestToUser(userID) @@ -8019,7 +8019,7 @@ func (s *TimerLayerUserStore) PromoteGuestToUser(userID string) *model.AppError return err } -func (s *TimerLayerUserStore) ResetLastPictureUpdate(userId string) *model.AppError { +func (s *TimerLayerUserStore) ResetLastPictureUpdate(userId string) error { start := timemodule.Now() err := s.UserStore.ResetLastPictureUpdate(userId) @@ -8035,7 +8035,7 @@ func (s *TimerLayerUserStore) ResetLastPictureUpdate(userId string) *model.AppEr return err } -func (s *TimerLayerUserStore) Save(user *model.User) (*model.User, *model.AppError) { +func (s *TimerLayerUserStore) Save(user *model.User) (*model.User, error) { start := timemodule.Now() result, err := s.UserStore.Save(user) @@ -8051,7 +8051,7 @@ func (s *TimerLayerUserStore) Save(user *model.User) (*model.User, *model.AppErr return result, err } -func (s *TimerLayerUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) Search(teamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.Search(teamId, term, options) @@ -8067,7 +8067,7 @@ func (s *TimerLayerUserStore) Search(teamId string, term string, options *model. return result, err } -func (s *TimerLayerUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) SearchInChannel(channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.SearchInChannel(channelId, term, options) @@ -8083,7 +8083,7 @@ func (s *TimerLayerUserStore) SearchInChannel(channelId string, term string, opt return result, err } -func (s *TimerLayerUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) SearchInGroup(groupID string, term string, options *model.UserSearchOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.SearchInGroup(groupID, term, options) @@ -8099,7 +8099,7 @@ func (s *TimerLayerUserStore) SearchInGroup(groupID string, term string, options return result, err } -func (s *TimerLayerUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) SearchNotInChannel(teamId string, channelId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.SearchNotInChannel(teamId, channelId, term, options) @@ -8115,7 +8115,7 @@ func (s *TimerLayerUserStore) SearchNotInChannel(teamId string, channelId string return result, err } -func (s *TimerLayerUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) SearchNotInTeam(notInTeamId string, term string, options *model.UserSearchOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.SearchNotInTeam(notInTeamId, term, options) @@ -8131,7 +8131,7 @@ func (s *TimerLayerUserStore) SearchNotInTeam(notInTeamId string, term string, o return result, err } -func (s *TimerLayerUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, *model.AppError) { +func (s *TimerLayerUserStore) SearchWithoutTeam(term string, options *model.UserSearchOptions) ([]*model.User, error) { start := timemodule.Now() result, err := s.UserStore.SearchWithoutTeam(term, options) @@ -8147,7 +8147,7 @@ func (s *TimerLayerUserStore) SearchWithoutTeam(term string, options *model.User return result, err } -func (s *TimerLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, *model.AppError) { +func (s *TimerLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*model.UserUpdate, error) { start := timemodule.Now() result, err := s.UserStore.Update(user, allowRoleUpdate) @@ -8163,7 +8163,7 @@ func (s *TimerLayerUserStore) Update(user *model.User, allowRoleUpdate bool) (*m return result, err } -func (s *TimerLayerUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, *model.AppError) { +func (s *TimerLayerUserStore) UpdateAuthData(userId string, service string, authData *string, email string, resetMfa bool) (string, error) { start := timemodule.Now() result, err := s.UserStore.UpdateAuthData(userId, service, authData, email, resetMfa) @@ -8179,7 +8179,7 @@ func (s *TimerLayerUserStore) UpdateAuthData(userId string, service string, auth return result, err } -func (s *TimerLayerUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) *model.AppError { +func (s *TimerLayerUserStore) UpdateFailedPasswordAttempts(userId string, attempts int) error { start := timemodule.Now() err := s.UserStore.UpdateFailedPasswordAttempts(userId, attempts) @@ -8195,7 +8195,7 @@ func (s *TimerLayerUserStore) UpdateFailedPasswordAttempts(userId string, attemp return err } -func (s *TimerLayerUserStore) UpdateLastPictureUpdate(userId string) *model.AppError { +func (s *TimerLayerUserStore) UpdateLastPictureUpdate(userId string) error { start := timemodule.Now() err := s.UserStore.UpdateLastPictureUpdate(userId) @@ -8211,7 +8211,7 @@ func (s *TimerLayerUserStore) UpdateLastPictureUpdate(userId string) *model.AppE return err } -func (s *TimerLayerUserStore) UpdateMfaActive(userId string, active bool) *model.AppError { +func (s *TimerLayerUserStore) UpdateMfaActive(userId string, active bool) error { start := timemodule.Now() err := s.UserStore.UpdateMfaActive(userId, active) @@ -8227,7 +8227,7 @@ func (s *TimerLayerUserStore) UpdateMfaActive(userId string, active bool) *model return err } -func (s *TimerLayerUserStore) UpdateMfaSecret(userId string, secret string) *model.AppError { +func (s *TimerLayerUserStore) UpdateMfaSecret(userId string, secret string) error { start := timemodule.Now() err := s.UserStore.UpdateMfaSecret(userId, secret) @@ -8243,7 +8243,7 @@ func (s *TimerLayerUserStore) UpdateMfaSecret(userId string, secret string) *mod return err } -func (s *TimerLayerUserStore) UpdatePassword(userId string, newPassword string) *model.AppError { +func (s *TimerLayerUserStore) UpdatePassword(userId string, newPassword string) error { start := timemodule.Now() err := s.UserStore.UpdatePassword(userId, newPassword) @@ -8259,7 +8259,7 @@ func (s *TimerLayerUserStore) UpdatePassword(userId string, newPassword string) return err } -func (s *TimerLayerUserStore) UpdateUpdateAt(userId string) (int64, *model.AppError) { +func (s *TimerLayerUserStore) UpdateUpdateAt(userId string) (int64, error) { start := timemodule.Now() result, err := s.UserStore.UpdateUpdateAt(userId) @@ -8275,7 +8275,7 @@ func (s *TimerLayerUserStore) UpdateUpdateAt(userId string) (int64, *model.AppEr return result, err } -func (s *TimerLayerUserStore) VerifyEmail(userId string, email string) (string, *model.AppError) { +func (s *TimerLayerUserStore) VerifyEmail(userId string, email string) (string, error) { start := timemodule.Now() result, err := s.UserStore.VerifyEmail(userId, email) diff --git a/web/oauth_test.go b/web/oauth_test.go index 2dcafe465d..d9241f2c03 100644 --- a/web/oauth_test.go +++ b/web/oauth_test.go @@ -473,9 +473,9 @@ func TestOAuthComplete(t *testing.T) { closeBody(r) } - _, err = th.App.Srv().Store.User().UpdateAuthData( + _, nErr := th.App.Srv().Store.User().UpdateAuthData( th.BasicUser.Id, model.SERVICE_GITLAB, &th.BasicUser.Email, th.BasicUser.Email, true) - require.Nil(t, err) + require.Nil(t, nErr) redirect, resp = ApiClient.AuthorizeOAuthApp(authRequest) require.Nil(t, resp.Error)