MM-63728: simplify category store with graphql gone (#30848)

* move category permissions to api

In https://github.com/mattermost/mattermost/pull/21038, we changed the
behaviour of the channel category store to filter out deleted teams and
teams for which the user was not a member. This was necessary in part
due to querying multiple teams via GraphQL.

With GraphQL no longer supported, let's move the permissions to the
API instead and remove the `JOIN` to filter out teams in the store.

Note that we /don't/ prevent access to deleted teams. For better or
worse, deleted teams remain largely accessible via other API endpoints
anyway.

* remove ExcludeTeam / GraphQL support

As part of https://github.com/mattermost/mattermost/pull/20353, we added
`ExcludeTeam` and the associated logic to support a GraphQL API.

With GraphQL no longer supported, let's simplify this logic and remove
the filtering and associated complexity.

* Fix shadow variable declaration in channel_store_categories.go

Fixed golangci-lint error by reusing existing err variable rather than shadowing it.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix build issue

* Remove SidebarCategorySearchOpts and simplify API to use teamID string

Per code review feedback, this change removes the SidebarCategorySearchOpts
struct entirely since the Type field was never used in the store implementation.
All methods now accept a simple teamID string parameter instead of the struct,
which simplifies the API and makes the code clearer.

Changes:
- Remove SidebarCategorySearchOpts struct from store.go
- Update CreateInitialSidebarCategories and GetSidebarCategories signatures
- Update all implementations (sqlstore, retrylayer, timerlayer, mocks)
- Update all callers to pass teamID string directly
- Clean up unused imports

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Этот коммит содержится в:
Jesse Hallam
2025-06-19 21:48:12 -03:00
коммит произвёл GitHub
родитель b69412d23f
Коммит dcc72c4c61
12 изменённых файлов: 517 добавлений и 449 удалений

Просмотреть файл

@@ -23,6 +23,11 @@ func getCategoriesForTeamForUser(c *Context, w http.ResponseWriter, r *http.Requ
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
categories, appErr := c.App.GetSidebarCategoriesForTeamForUser(c.AppContext, c.Params.UserId, c.Params.TeamId) categories, appErr := c.App.GetSidebarCategoriesForTeamForUser(c.AppContext, c.Params.UserId, c.Params.TeamId)
if appErr != nil { if appErr != nil {
c.Err = appErr c.Err = appErr
@@ -51,6 +56,11 @@ func createCategoryForTeamForUser(c *Context, w http.ResponseWriter, r *http.Req
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
auditRec := c.MakeAuditRecord("createCategoryForTeamForUser", audit.Fail) auditRec := c.MakeAuditRecord("createCategoryForTeamForUser", audit.Fail)
defer c.LogAuditRec(auditRec) defer c.LogAuditRec(auditRec)
@@ -96,6 +106,11 @@ func getCategoryOrderForTeamForUser(c *Context, w http.ResponseWriter, r *http.R
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
order, appErr := c.App.GetSidebarCategoryOrder(c.AppContext, c.Params.UserId, c.Params.TeamId) order, appErr := c.App.GetSidebarCategoryOrder(c.AppContext, c.Params.UserId, c.Params.TeamId)
if appErr != nil { if appErr != nil {
c.Err = appErr c.Err = appErr
@@ -119,6 +134,11 @@ func updateCategoryOrderForTeamForUser(c *Context, w http.ResponseWriter, r *htt
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
auditRec := c.MakeAuditRecord("updateCategoryOrderForTeamForUser", audit.Fail) auditRec := c.MakeAuditRecord("updateCategoryOrderForTeamForUser", audit.Fail)
defer c.LogAuditRec(auditRec) defer c.LogAuditRec(auditRec)
@@ -159,6 +179,11 @@ func getCategoryForTeamForUser(c *Context, w http.ResponseWriter, r *http.Reques
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
categories, appErr := c.App.GetSidebarCategory(c.AppContext, c.Params.CategoryId) categories, appErr := c.App.GetSidebarCategory(c.AppContext, c.Params.CategoryId)
if appErr != nil { if appErr != nil {
c.Err = appErr c.Err = appErr
@@ -187,6 +212,11 @@ func updateCategoriesForTeamForUser(c *Context, w http.ResponseWriter, r *http.R
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
auditRec := c.MakeAuditRecord("updateCategoriesForTeamForUser", audit.Fail) auditRec := c.MakeAuditRecord("updateCategoriesForTeamForUser", audit.Fail)
defer c.LogAuditRec(auditRec) defer c.LogAuditRec(auditRec)
@@ -296,6 +326,11 @@ func updateCategoryForTeamForUser(c *Context, w http.ResponseWriter, r *http.Req
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
auditRec := c.MakeAuditRecord("updateCategoryForTeamForUser", audit.Fail) auditRec := c.MakeAuditRecord("updateCategoryForTeamForUser", audit.Fail)
defer c.LogAuditRec(auditRec) defer c.LogAuditRec(auditRec)
@@ -342,6 +377,11 @@ func deleteCategoryForTeamForUser(c *Context, w http.ResponseWriter, r *http.Req
return return
} }
if !c.App.SessionHasPermissionToTeam(*c.AppContext.Session(), c.Params.TeamId, model.PermissionViewTeam) {
c.SetPermissionError(model.PermissionViewTeam)
return
}
auditRec := c.MakeAuditRecord("deleteCategoryForTeamForUser", audit.Fail) auditRec := c.MakeAuditRecord("deleteCategoryForTeamForUser", audit.Fail)
defer c.LogAuditRec(auditRec) defer c.LogAuditRec(auditRec)

Просмотреть файл

@@ -106,6 +106,49 @@ func TestCreateCategoryForTeamForUser(t *testing.T) {
}) })
}) })
t.Run("should return error when user tries to create a category for a team they're not a member of", func(t *testing.T) {
// Create a user
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
// Create a team and add the user to it
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
th.LinkUserToTeam(user, team)
// Create a client and log in
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Now remove the user from the team
appErr = th.App.RemoveUserFromTeam(th.Context, team.Id, user.Id, th.SystemAdminUser.Id)
require.Nil(t, appErr)
// Attempt to create a category for the team the user is no longer a member of
category := &model.SidebarCategoryWithChannels{
SidebarCategory: model.SidebarCategory{
UserId: user.Id,
TeamId: team.Id,
DisplayName: "test category",
},
}
_, resp, err := client.CreateSidebarCategoryForTeamForUser(context.Background(), user.Id, team.Id, category)
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
t.Run("should publish expected WS payload", func(t *testing.T) { t.Run("should publish expected WS payload", func(t *testing.T) {
userWSClient := th.CreateConnectedWebSocketClient(t) userWSClient := th.CreateConnectedWebSocketClient(t)
@@ -450,6 +493,58 @@ func TestUpdateCategoryForTeamForUser(t *testing.T) {
closeBody(r) closeBody(r)
}) })
}) })
t.Run("should return error when user tries to update a category for a team they're not a member of", func(t *testing.T) {
// Create a user
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
// Create a team and add the user to it
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
th.LinkUserToTeam(user, team)
// Create a client and log in
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Get categories to have valid category IDs
categories, _, err := client.GetSidebarCategoriesForTeamForUser(context.Background(), user.Id, team.Id, "")
require.NoError(t, err)
require.NotEmpty(t, categories.Categories)
// Store a category to use after team membership is revoked
categoryToUpdate := &model.SidebarCategoryWithChannels{
SidebarCategory: model.SidebarCategory{
Id: categories.Categories[0].Id,
UserId: user.Id,
TeamId: team.Id,
DisplayName: "Updated Category",
Type: categories.Categories[0].Type,
},
Channels: categories.Categories[0].Channels,
}
// Remove the user from the team
appErr = th.App.RemoveUserFromTeam(th.Context, team.Id, user.Id, th.SystemAdminUser.Id)
require.Nil(t, appErr)
// Attempt to update a category for the team after being removed
_, resp, err := client.UpdateSidebarCategoryForTeamForUser(context.Background(), user.Id, team.Id, categoryToUpdate.Id, categoryToUpdate)
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
} }
func TestUpdateCategoriesForTeamForUser(t *testing.T) { func TestUpdateCategoriesForTeamForUser(t *testing.T) {
@@ -548,6 +643,60 @@ func TestUpdateCategoriesForTeamForUser(t *testing.T) {
_, _, err = client.UpdateSidebarCategoryOrderForTeamForUser(context.Background(), user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0], "asd"}) _, _, err = client.UpdateSidebarCategoryOrderForTeamForUser(context.Background(), user.Id, th.BasicTeam.Id, []string{categories.Order[1], categories.Order[0], "asd"})
require.Error(t, err) require.Error(t, err)
}) })
t.Run("should return error when user tries to update categories for a team they're not a member of", func(t *testing.T) {
// Create a user
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
// Create a team and add the user to it
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
th.LinkUserToTeam(user, team)
// Create a client and log in
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Get categories to have valid category IDs
existingCategories, _, err := client.GetSidebarCategoriesForTeamForUser(context.Background(), user.Id, team.Id, "")
require.NoError(t, err)
require.NotEmpty(t, existingCategories.Categories)
// Prepare categories to update after team membership is revoked
categoriesToUpdate := []*model.SidebarCategoryWithChannels{
{
SidebarCategory: model.SidebarCategory{
Id: existingCategories.Categories[0].Id,
UserId: user.Id,
TeamId: team.Id,
DisplayName: "Updated Category",
Type: existingCategories.Categories[0].Type,
},
Channels: existingCategories.Categories[0].Channels,
},
}
// Remove the user from the team
appErr = th.App.RemoveUserFromTeam(th.Context, team.Id, user.Id, th.SystemAdminUser.Id)
require.Nil(t, appErr)
// Attempt to update categories for the team after being removed
_, resp, err := client.UpdateSidebarCategoriesForTeamForUser(context.Background(), user.Id, team.Id, categoriesToUpdate)
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
} }
func TestGetCategoriesForTeamForUser(t *testing.T) { func TestGetCategoriesForTeamForUser(t *testing.T) {
@@ -583,6 +732,34 @@ func TestGetCategoriesForTeamForUser(t *testing.T) {
require.Equal(t, http.StatusForbidden, resp.StatusCode) require.Equal(t, http.StatusForbidden, resp.StatusCode)
}) })
t.Run("should return error for a team the user is not a member of", func(t *testing.T) {
// Create a new user and team
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
// Log in as the new user
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Attempt to get categories for a team the user is not a member of
_, resp, err := client.GetSidebarCategoriesForTeamForUser(context.Background(), user.Id, team.Id, "")
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
t.Run("should return error with invalid user id", func(t *testing.T) { t.Run("should return error with invalid user id", func(t *testing.T) {
_, resp, err := th.Client.GetSidebarCategoriesForTeamForUser(context.Background(), "invalid_user_id", th.BasicTeam.Id, "") _, resp, err := th.Client.GetSidebarCategoriesForTeamForUser(context.Background(), "invalid_user_id", th.BasicTeam.Id, "")
require.Error(t, err) require.Error(t, err)
@@ -660,6 +837,45 @@ func TestGetCategoryOrderForTeamForUser(t *testing.T) {
require.Error(t, err) require.Error(t, err)
require.Equal(t, http.StatusUnauthorized, resp.StatusCode) require.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
t.Run("should return error when user tries to get category order for a team they're not a member of", func(t *testing.T) {
// Create a user
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
// Create a team and add the user to it
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
th.LinkUserToTeam(user, team)
// Create a client and log in
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Verify the user can access categories initially
_, _, err = client.GetSidebarCategoriesForTeamForUser(context.Background(), user.Id, team.Id, "")
require.NoError(t, err)
// Remove the user from the team
appErr = th.App.RemoveUserFromTeam(th.Context, team.Id, user.Id, th.SystemAdminUser.Id)
require.Nil(t, appErr)
// Attempt to get the category order for the team after being removed
_, resp, err := client.GetSidebarCategoryOrderForTeamForUser(context.Background(), user.Id, team.Id, "")
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
} }
func TestUpdateCategoryOrderForTeamForUser(t *testing.T) { func TestUpdateCategoryOrderForTeamForUser(t *testing.T) {
@@ -779,6 +995,46 @@ func TestUpdateCategoryOrderForTeamForUser(t *testing.T) {
closeBody(r) closeBody(r)
}) })
}) })
t.Run("should return error when user tries to update category order for a team they're not a member of", func(t *testing.T) {
// Create a user
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
// Create a team and add the user to it
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
th.LinkUserToTeam(user, team)
// Create a client and log in
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Get categories to have a valid order
categories, _, err := client.GetSidebarCategoriesForTeamForUser(context.Background(), user.Id, team.Id, "")
require.NoError(t, err)
require.NotEmpty(t, categories.Order)
// Remove the user from the team
appErr = th.App.RemoveUserFromTeam(th.Context, team.Id, user.Id, th.SystemAdminUser.Id)
require.Nil(t, appErr)
// Attempt to update the category order for the team after being removed
_, resp, err := client.UpdateSidebarCategoryOrderForTeamForUser(context.Background(), user.Id, team.Id, categories.Order)
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
} }
func TestGetCategoryForTeamForUser(t *testing.T) { func TestGetCategoryForTeamForUser(t *testing.T) {
@@ -878,6 +1134,49 @@ func TestGetCategoryForTeamForUser(t *testing.T) {
closeBody(r) closeBody(r)
}) })
}) })
t.Run("should return error when user tries to get category for a team they're not a member of", func(t *testing.T) {
// Create a user
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
// Create a team and add the user to it
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
th.LinkUserToTeam(user, team)
// Create a client and log in
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Get categories to have valid category IDs
categories, _, err := client.GetSidebarCategoriesForTeamForUser(context.Background(), user.Id, team.Id, "")
require.NoError(t, err)
require.NotEmpty(t, categories.Categories)
// Store a category ID to use after team membership is revoked
categoryID := categories.Categories[0].Id
// Remove the user from the team
appErr = th.App.RemoveUserFromTeam(th.Context, team.Id, user.Id, th.SystemAdminUser.Id)
require.Nil(t, appErr)
// Attempt to get a category for the team after being removed
_, resp, err := client.GetSidebarCategoryForTeamForUser(context.Background(), user.Id, team.Id, categoryID, "")
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
} }
func TestValidateSidebarCategory(t *testing.T) { func TestValidateSidebarCategory(t *testing.T) {
@@ -1259,6 +1558,53 @@ func TestDeleteCategoryForTeamForUser(t *testing.T) {
} }
} }
}) })
t.Run("should return error when user tries to delete a category for a team they're not a member of", func(t *testing.T) {
// Create a user
user, appErr := th.App.CreateUser(th.Context, &model.User{
Email: th.GenerateTestEmail(),
Username: "user_" + model.NewId(),
Password: "password",
})
require.Nil(t, appErr)
// Create a team and add the user to it
team, appErr := th.App.CreateTeam(th.Context, &model.Team{
DisplayName: "Team for testing",
Name: "test-team-" + model.NewId(),
Email: th.GenerateTestEmail(),
Type: model.TeamOpen,
})
require.Nil(t, appErr)
th.LinkUserToTeam(user, team)
// Create a client and log in
client := th.CreateClient()
_, _, err := client.Login(context.Background(), user.Email, "password")
require.NoError(t, err)
// Create a custom category
customCategory, _, err := client.CreateSidebarCategoryForTeamForUser(context.Background(), user.Id, team.Id, &model.SidebarCategoryWithChannels{
SidebarCategory: model.SidebarCategory{
UserId: user.Id,
TeamId: team.Id,
DisplayName: "Custom Category",
Type: model.SidebarCategoryCustom,
},
})
require.NoError(t, err)
require.NotNil(t, customCategory)
// Remove the user from the team
appErr = th.App.RemoveUserFromTeam(th.Context, team.Id, user.Id, th.SystemAdminUser.Id)
require.Nil(t, appErr)
// Attempt to delete the category for the team after being removed
resp, err := client.DeleteSidebarCategoryForTeamForUser(context.Background(), user.Id, team.Id, customCategory.Id)
require.Error(t, err)
require.Equal(t, http.StatusForbidden, resp.StatusCode)
})
} }
func setupUserForSubtest(t *testing.T, th *TestHelper) (*model.User, *model.Client4) { func setupUserForSubtest(t *testing.T, th *TestHelper) (*model.User, *model.Client4) {

Просмотреть файл

@@ -3815,10 +3815,7 @@ func (a *App) setSidebarCategoriesForConvertedGroupMessage(c request.CTX, gmConv
// Now that we've deleted existing entries, we can set the channel in default "Channels" category // Now that we've deleted existing entries, we can set the channel in default "Channels" category
// for all GM members // for all GM members
for _, user := range channelUsers { for _, user := range channelUsers {
categories, appErr := a.GetSidebarCategories(c, user.Id, &store.SidebarCategorySearchOpts{ categories, appErr := a.GetSidebarCategories(c, user.Id, gmConversionRequest.TeamID)
TeamID: gmConversionRequest.TeamID,
Type: model.SidebarCategoryChannels,
})
if appErr != nil { if appErr != nil {
c.Logger().Error("Failed to search sidebar categories for user for adding converted GM") c.Logger().Error("Failed to search sidebar categories for user for adding converted GM")

Просмотреть файл

@@ -14,8 +14,8 @@ import (
"github.com/mattermost/mattermost/server/v8/channels/store" "github.com/mattermost/mattermost/server/v8/channels/store"
) )
func (a *App) createInitialSidebarCategories(c request.CTX, userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, *model.AppError) { func (a *App) createInitialSidebarCategories(c request.CTX, userID string, teamID string) (*model.OrderedSidebarCategories, *model.AppError) {
categories, nErr := a.Srv().Store().Channel().CreateInitialSidebarCategories(c, userID, opts) categories, nErr := a.Srv().Store().Channel().CreateInitialSidebarCategories(c, userID, teamID)
if nErr != nil { if nErr != nil {
return nil, model.NewAppError("createInitialSidebarCategories", "app.channel.create_initial_sidebar_categories.internal_error", nil, "", http.StatusInternalServerError).Wrap(nErr) return nil, model.NewAppError("createInitialSidebarCategories", "app.channel.create_initial_sidebar_categories.internal_error", nil, "", http.StatusInternalServerError).Wrap(nErr)
} }
@@ -28,10 +28,7 @@ func (a *App) GetSidebarCategoriesForTeamForUser(c request.CTX, userID, teamID s
categories, err := a.Srv().Store().Channel().GetSidebarCategoriesForTeamForUser(userID, teamID) categories, err := a.Srv().Store().Channel().GetSidebarCategoriesForTeamForUser(userID, teamID)
if err == nil && len(categories.Categories) == 0 { if err == nil && len(categories.Categories) == 0 {
// A user must always have categories, so migration must not have happened yet, and we should run it ourselves // A user must always have categories, so migration must not have happened yet, and we should run it ourselves
categories, appErr = a.createInitialSidebarCategories(c, userID, &store.SidebarCategorySearchOpts{ categories, appErr = a.createInitialSidebarCategories(c, userID, teamID)
TeamID: teamID,
ExcludeTeam: false,
})
if appErr != nil { if appErr != nil {
return nil, appErr return nil, appErr
} }
@@ -50,12 +47,12 @@ func (a *App) GetSidebarCategoriesForTeamForUser(c request.CTX, userID, teamID s
return categories, nil return categories, nil
} }
func (a *App) GetSidebarCategories(c request.CTX, userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, *model.AppError) { func (a *App) GetSidebarCategories(c request.CTX, userID string, teamID string) (*model.OrderedSidebarCategories, *model.AppError) {
var appErr *model.AppError var appErr *model.AppError
categories, err := a.Srv().Store().Channel().GetSidebarCategories(userID, opts) categories, err := a.Srv().Store().Channel().GetSidebarCategories(userID, teamID)
if err == nil && len(categories.Categories) == 0 { if err == nil && len(categories.Categories) == 0 {
// A user must always have categories, so migration must not have happened yet, and we should run it ourselves // A user must always have categories, so migration must not have happened yet, and we should run it ourselves
categories, appErr = a.createInitialSidebarCategories(c, userID, opts) categories, appErr = a.createInitialSidebarCategories(c, userID, teamID)
if appErr != nil { if appErr != nil {
return nil, appErr return nil, appErr
} }

Просмотреть файл

@@ -14,8 +14,6 @@ import (
"testing" "testing"
"time" "time"
"github.com/mattermost/mattermost/server/v8/channels/store"
"github.com/mattermost/mattermost/server/v8/channels/app/teams" "github.com/mattermost/mattermost/server/v8/channels/app/teams"
"github.com/mattermost/mattermost/server/v8/channels/app/users" "github.com/mattermost/mattermost/server/v8/channels/app/users"
"github.com/mattermost/mattermost/server/v8/channels/store/sqlstore" "github.com/mattermost/mattermost/server/v8/channels/store/sqlstore"
@@ -2957,7 +2955,7 @@ func TestConvertGroupMessageToChannel(t *testing.T) {
mockChannelStore.On("GetAllChannelMembersNotifyPropsForChannel", "channelidchannelidchanneli", true).Return(map[string]model.StringMap{}, nil) mockChannelStore.On("GetAllChannelMembersNotifyPropsForChannel", "channelidchannelidchanneli", true).Return(map[string]model.StringMap{}, nil)
mockChannelStore.On("IncrementMentionCount", "", []string{}, true, false).Return(nil) mockChannelStore.On("IncrementMentionCount", "", []string{}, true, false).Return(nil)
mockChannelStore.On("DeleteAllSidebarChannelForChannel", "channelidchannelidchanneli").Return(nil) mockChannelStore.On("DeleteAllSidebarChannelForChannel", "channelidchannelidchanneli").Return(nil)
mockChannelStore.On("GetSidebarCategories", "user_id_1", &store.SidebarCategorySearchOpts{TeamID: "team_id_1", ExcludeTeam: false, Type: "channels"}).Return( mockChannelStore.On("GetSidebarCategories", "user_id_1", "team_id_1").Return(
&model.OrderedSidebarCategories{ &model.OrderedSidebarCategories{
Categories: model.SidebarCategoriesWithChannels{ Categories: model.SidebarCategoriesWithChannels{
{ {
@@ -2967,7 +2965,7 @@ func TestConvertGroupMessageToChannel(t *testing.T) {
}, },
}, },
}, nil) }, nil)
mockChannelStore.On("GetSidebarCategories", "user_id_2", &store.SidebarCategorySearchOpts{TeamID: "team_id_1", ExcludeTeam: false, Type: "channels"}).Return( mockChannelStore.On("GetSidebarCategories", "user_id_2", "team_id_1").Return(
&model.OrderedSidebarCategories{ &model.OrderedSidebarCategories{
Categories: model.SidebarCategoriesWithChannels{ Categories: model.SidebarCategoriesWithChannels{
{ {

Просмотреть файл

@@ -767,11 +767,7 @@ func (a *App) JoinUserToTeam(c request.CTX, team *model.Team, user *model.User,
return nil, model.NewAppError("JoinUserToTeam", "app.user.update_update.app_error", nil, "", http.StatusInternalServerError).Wrap(err) return nil, model.NewAppError("JoinUserToTeam", "app.user.update_update.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
} }
opts := &store.SidebarCategorySearchOpts{ if _, err := a.createInitialSidebarCategories(c, user.Id, team.Id); err != nil {
TeamID: team.Id,
ExcludeTeam: false,
}
if _, err := a.createInitialSidebarCategories(c, user.Id, opts); err != nil {
c.Logger().Warn( c.Logger().Warn(
"Encountered an issue creating default sidebar categories.", "Encountered an issue creating default sidebar categories.",
mlog.String("user_id", user.Id), mlog.String("user_id", user.Id),

Просмотреть файл

@@ -1193,11 +1193,11 @@ func (s *RetryLayerChannelStore) CreateDirectChannel(ctx request.CTX, userID *mo
} }
func (s *RetryLayerChannelStore) CreateInitialSidebarCategories(c request.CTX, userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (s *RetryLayerChannelStore) CreateInitialSidebarCategories(c request.CTX, userID string, teamID string) (*model.OrderedSidebarCategories, error) {
tries := 0 tries := 0
for { for {
result, err := s.ChannelStore.CreateInitialSidebarCategories(c, userID, opts) result, err := s.ChannelStore.CreateInitialSidebarCategories(c, userID, teamID)
if err == nil { if err == nil {
return result, nil return result, nil
} }
@@ -2354,11 +2354,11 @@ func (s *RetryLayerChannelStore) GetPublicChannelsForTeam(teamID string, offset
} }
func (s *RetryLayerChannelStore) GetSidebarCategories(userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (s *RetryLayerChannelStore) GetSidebarCategories(userID string, teamID string) (*model.OrderedSidebarCategories, error) {
tries := 0 tries := 0
for { for {
result, err := s.ChannelStore.GetSidebarCategories(userID, opts) result, err := s.ChannelStore.GetSidebarCategories(userID, teamID)
if err == nil { if err == nil {
return result, nil return result, nil
} }

Просмотреть файл

@@ -16,27 +16,18 @@ import (
"github.com/mattermost/mattermost/server/v8/channels/store" "github.com/mattermost/mattermost/server/v8/channels/store"
) )
func (s SqlChannelStore) CreateInitialSidebarCategories(c request.CTX, userId string, opts *store.SidebarCategorySearchOpts) (_ *model.OrderedSidebarCategories, err error) { func (s SqlChannelStore) CreateInitialSidebarCategories(c request.CTX, userId string, teamID string) (_ *model.OrderedSidebarCategories, err error) {
transaction, err := s.GetMaster().Beginx() transaction, err := s.GetMaster().Beginx()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "CreateInitialSidebarCategories: begin_transaction") return nil, errors.Wrap(err, "CreateInitialSidebarCategories: begin_transaction")
} }
defer finalizeTransactionX(transaction, &err) defer finalizeTransactionX(transaction, &err)
teamsWithExclude, err := s.SqlStore.stores.team.GetTeamsForUser(c, userId, opts.TeamID, false) if err = s.createInitialSidebarCategoriesT(transaction, userId, teamID); err != nil {
if err != nil {
return nil, errors.Wrap(err, "CreateInitialSidebarCategories: GetTeamsForUser")
}
excludedTeamIDs := make([]string, 0, len(teamsWithExclude))
for _, tm := range teamsWithExclude {
excludedTeamIDs = append(excludedTeamIDs, tm.TeamId)
}
if err = s.createInitialSidebarCategoriesT(transaction, userId, excludedTeamIDs, opts); err != nil {
return nil, errors.Wrap(err, "CreateInitialSidebarCategories: createInitialSidebarCategoriesT") return nil, errors.Wrap(err, "CreateInitialSidebarCategories: createInitialSidebarCategoriesT")
} }
oc, err := s.getSidebarCategoriesT(transaction, userId, opts) oc, err := s.getSidebarCategoriesT(transaction, userId, teamID)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "CreateInitialSidebarCategories: getSidebarCategoriesT") return nil, errors.Wrap(err, "CreateInitialSidebarCategories: getSidebarCategoriesT")
} }
@@ -48,9 +39,9 @@ func (s SqlChannelStore) CreateInitialSidebarCategories(c request.CTX, userId st
return oc, nil return oc, nil
} }
func (s SqlChannelStore) createInitialSidebarCategoriesT(transaction *sqlxTxWrapper, userId string, excludedTeamIDs []string, opts *store.SidebarCategorySearchOpts) error { func (s SqlChannelStore) createInitialSidebarCategoriesT(transaction *sqlxTxWrapper, userId, teamId string) error {
query := s.getQueryBuilder(). query := s.getQueryBuilder().
Select("SidebarCategories.Type, SidebarCategories.TeamId"). Select("SidebarCategories.Type").
From("SidebarCategories"). From("SidebarCategories").
Where(sq.Eq{ Where(sq.Eq{
"SidebarCategories.UserId": userId, "SidebarCategories.UserId": userId,
@@ -59,34 +50,18 @@ func (s SqlChannelStore) createInitialSidebarCategoriesT(transaction *sqlxTxWrap
model.SidebarCategoryChannels, model.SidebarCategoryChannels,
model.SidebarCategoryDirectMessages, model.SidebarCategoryDirectMessages,
}, },
"SidebarCategories.TeamId": teamId,
}) })
if !opts.ExcludeTeam { existingTypes := []model.SidebarCategoryType{}
query = query.Where(sq.Eq{"SidebarCategories.TeamId": opts.TeamID}) err := transaction.SelectBuilder(&existingTypes, query)
} else {
query = query.Where(sq.NotEq{"SidebarCategories.TeamId": opts.TeamID})
}
selectQuery, selectParams, err := query.ToSql()
if err != nil {
return errors.Wrap(err, "createInitialSidebarCategoriesT_Tosql")
}
existingTypes := []struct {
Type model.SidebarCategoryType
TeamId string
}{}
err = transaction.Select(&existingTypes, selectQuery, selectParams...)
if err != nil { if err != nil {
return errors.Wrap(err, "createInitialSidebarCategoriesT: failed to select existing categories") return errors.Wrap(err, "createInitialSidebarCategoriesT: failed to select existing categories")
} }
hasCategoryOfType := make(map[model.SidebarCategoryType]map[string]bool, len(existingTypes)) hasCategoryOfType := make(map[model.SidebarCategoryType]bool, len(existingTypes))
for _, existingType := range existingTypes { for _, existingType := range existingTypes {
if hasCategoryOfType[existingType.Type] == nil { hasCategoryOfType[existingType] = true
hasCategoryOfType[existingType.Type] = make(map[string]bool)
hasCategoryOfType[existingType.Type][existingType.TeamId] = true
}
} }
insertBuilder := s.getQueryBuilder().Insert("SidebarCategories"). insertBuilder := s.getQueryBuilder().Insert("SidebarCategories").
@@ -94,71 +69,33 @@ func (s SqlChannelStore) createInitialSidebarCategoriesT(transaction *sqlxTxWrap
hasInsert := false hasInsert := false
getRequiredTeamIDs := func(category model.SidebarCategoryType, opts *store.SidebarCategorySearchOpts) []string { if !hasCategoryOfType[model.SidebarCategoryFavorites] {
// if category == nil - nothing
// if not exclude - just that team
// otherwise get all teams excluding that team
// if != nil - then partial
// if not exclude, and team exists in map then skip.
// otherwise, get all teams excluding that team, subtract all items from map.
if hasCategoryOfType[category] == nil {
// If not exclude, do for only single team
// if exclude, get all teams, excluding that team
if !opts.ExcludeTeam {
return []string{opts.TeamID}
}
return excludedTeamIDs
}
mapEntry := hasCategoryOfType[category]
if !opts.ExcludeTeam && mapEntry[opts.TeamID] {
// continue, nothing to do since entry already exists.
} else {
for i, tID := range excludedTeamIDs {
if mapEntry[tID] {
// remove from slice
copy(excludedTeamIDs[i:], excludedTeamIDs[i+1:])
excludedTeamIDs[len(excludedTeamIDs)-1] = ""
excludedTeamIDs = excludedTeamIDs[:len(excludedTeamIDs)-1]
}
}
return excludedTeamIDs
}
return []string{}
}
teamIDs := getRequiredTeamIDs(model.SidebarCategoryFavorites, opts)
for _, teamID := range teamIDs {
// Use deterministic IDs for default categories to prevent potentially creating multiple copies of a default category // Use deterministic IDs for default categories to prevent potentially creating multiple copies of a default category
favoritesCategoryId := fmt.Sprintf("%s_%s_%s", model.SidebarCategoryFavorites, userId, teamID) favoritesCategoryId := fmt.Sprintf("%s_%s_%s", model.SidebarCategoryFavorites, userId, teamId)
// Create the SidebarChannels first since there's more opportunity for something to fail here // Create the SidebarChannels first since there's more opportunity for something to fail here
if err := s.migrateFavoritesToSidebarT(transaction, userId, teamID, favoritesCategoryId); err != nil { err = s.migrateFavoritesToSidebarT(transaction, userId, teamId, favoritesCategoryId)
if err != nil {
return errors.Wrap(err, "createInitialSidebarCategoriesT: failed to migrate favorites to sidebar") return errors.Wrap(err, "createInitialSidebarCategoriesT: failed to migrate favorites to sidebar")
} }
insertBuilder = insertBuilder.Values(favoritesCategoryId, userId, teamID, model.DefaultSidebarSortOrderFavorites, model.SidebarCategorySortDefault, model.SidebarCategoryFavorites, "Favorites" /* This will be retranslated by the client into the user's locale */, false, false) insertBuilder = insertBuilder.Values(favoritesCategoryId, userId, teamId, model.DefaultSidebarSortOrderFavorites, model.SidebarCategorySortDefault, model.SidebarCategoryFavorites, "Favorites" /* This will be retranslated by the client into the user's locale */, false, false)
hasInsert = true hasInsert = true
} }
teamIDs = getRequiredTeamIDs(model.SidebarCategoryChannels, opts) if !hasCategoryOfType[model.SidebarCategoryChannels] {
for _, teamID := range teamIDs { channelsCategoryId := fmt.Sprintf("%s_%s_%s", model.SidebarCategoryChannels, userId, teamId)
channelsCategoryId := fmt.Sprintf("%s_%s_%s", model.SidebarCategoryChannels, userId, teamID) insertBuilder = insertBuilder.Values(channelsCategoryId, userId, teamId, model.DefaultSidebarSortOrderChannels, model.SidebarCategorySortDefault, model.SidebarCategoryChannels, "Channels" /* This will be retranslated by the client into the user's locale */, false, false)
insertBuilder = insertBuilder.Values(channelsCategoryId, userId, teamID, model.DefaultSidebarSortOrderChannels, model.SidebarCategorySortDefault, model.SidebarCategoryChannels, "Channels" /* This will be retranslated by the client into the user's locale */, false, false)
hasInsert = true hasInsert = true
} }
teamIDs = getRequiredTeamIDs(model.SidebarCategoryDirectMessages, opts) if !hasCategoryOfType[model.SidebarCategoryDirectMessages] {
for _, teamID := range teamIDs { directMessagesCategoryId := fmt.Sprintf("%s_%s_%s", model.SidebarCategoryDirectMessages, userId, teamId)
directMessagesCategoryId := fmt.Sprintf("%s_%s_%s", model.SidebarCategoryDirectMessages, userId, teamID) insertBuilder = insertBuilder.Values(directMessagesCategoryId, userId, teamId, model.DefaultSidebarSortOrderDMs, model.SidebarCategorySortRecent, model.SidebarCategoryDirectMessages, "Direct Messages" /* This will be retranslated by the client into the user's locale */, false, false)
insertBuilder = insertBuilder.Values(directMessagesCategoryId, userId, teamID, model.DefaultSidebarSortOrderDMs, model.SidebarCategorySortRecent, model.SidebarCategoryDirectMessages, "Direct Messages" /* This will be retranslated by the client into the user's locale */, false, false)
hasInsert = true hasInsert = true
} }
if hasInsert { if hasInsert {
sql, args, err := insertBuilder.ToSql() _, err = transaction.ExecBuilder(insertBuilder)
if err != nil {
return errors.Wrap(err, "insertSidebarCategories_Tosql")
}
_, err = transaction.Exec(sql, args...)
if err != nil { if err != nil {
return errors.Wrap(err, "createInitialSidebarCategoriesT: failed to insert categories") return errors.Wrap(err, "createInitialSidebarCategoriesT: failed to insert categories")
} }
@@ -300,11 +237,7 @@ func (s SqlChannelStore) CreateSidebarCategory(userId, teamId string, newCategor
defer finalizeTransactionX(transaction, &err) defer finalizeTransactionX(transaction, &err)
opts := &store.SidebarCategorySearchOpts{ categoriesWithOrder, err := s.getSidebarCategoriesT(transaction, userId, teamId)
TeamID: teamId,
ExcludeTeam: false,
}
categoriesWithOrder, err := s.getSidebarCategoriesT(transaction, userId, opts)
if err != nil { if err != nil {
return nil, err return nil, err
} else if len(categoriesWithOrder.Categories) == 0 { } else if len(categoriesWithOrder.Categories) == 0 {
@@ -590,7 +523,7 @@ func (s SqlChannelStore) getSidebarCategoryT(db sqlxExecutor, categoryId string)
return s.completePopulatingCategoryT(db, result) return s.completePopulatingCategoryT(db, result)
} }
func (s SqlChannelStore) getSidebarCategoriesT(db sqlxExecutor, userId string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (s SqlChannelStore) getSidebarCategoriesT(db sqlxExecutor, userId, teamId string) (*model.OrderedSidebarCategories, error) {
oc := model.OrderedSidebarCategories{ oc := model.OrderedSidebarCategories{
Categories: make(model.SidebarCategoriesWithChannels, 0), Categories: make(model.SidebarCategoriesWithChannels, 0),
Order: make([]string, 0), Order: make([]string, 0),
@@ -600,35 +533,18 @@ func (s SqlChannelStore) getSidebarCategoriesT(db sqlxExecutor, userId string, o
query := s.sidebarCategorySelectQuery. query := s.sidebarCategorySelectQuery.
Columns("SidebarChannels.ChannelId"). Columns("SidebarChannels.ChannelId").
LeftJoin("SidebarChannels ON SidebarChannels.CategoryId=SidebarCategories.Id"). LeftJoin("SidebarChannels ON SidebarChannels.CategoryId=SidebarCategories.Id").
InnerJoin("Teams ON Teams.Id=SidebarCategories.TeamId").
InnerJoin("TeamMembers ON TeamMembers.TeamId=SidebarCategories.TeamId").
Where(sq.And{
sq.Eq{"TeamMembers.UserId": userId},
sq.Eq{"TeamMembers.DeleteAt": 0},
sq.Eq{"Teams.DeleteAt": 0},
}).
Where(sq.And{ Where(sq.And{
sq.Eq{"SidebarCategories.UserId": userId}, sq.Eq{"SidebarCategories.UserId": userId},
sq.Eq{"SidebarCategories.TeamId": teamId},
}). }).
OrderBy("SidebarCategories.SortOrder ASC, SidebarChannels.SortOrder ASC") OrderBy("SidebarCategories.SortOrder ASC, SidebarChannels.SortOrder ASC")
if opts.ExcludeTeam {
query = query.Where(sq.NotEq{"SidebarCategories.TeamId": opts.TeamID})
} else {
query = query.Where(sq.Eq{"SidebarCategories.TeamId": opts.TeamID})
}
if opts.Type != "" {
query = query.Where(sq.Eq{"SidebarCategories.Type": opts.Type})
}
sql, args, err := query.ToSql() sql, args, err := query.ToSql()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "sidebar_categories_tosql") return nil, errors.Wrap(err, "sidebar_categories_tosql")
} }
if err := db.Select(&categories, sql, args...); err != nil { if err := db.Select(&categories, sql, args...); err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("failed to get categories for userId=%s, teamId=%s", userId, opts.TeamID)) return nil, errors.Wrap(err, fmt.Sprintf("failed to get categories for userId=%s, teamId=%s", userId, teamId))
} }
for _, category := range categories { for _, category := range categories {
@@ -660,15 +576,11 @@ func (s SqlChannelStore) getSidebarCategoriesT(db sqlxExecutor, userId string, o
} }
func (s SqlChannelStore) GetSidebarCategoriesForTeamForUser(userId, teamId string) (*model.OrderedSidebarCategories, error) { func (s SqlChannelStore) GetSidebarCategoriesForTeamForUser(userId, teamId string) (*model.OrderedSidebarCategories, error) {
opts := &store.SidebarCategorySearchOpts{ return s.getSidebarCategoriesT(s.GetReplica(), userId, teamId)
TeamID: teamId,
ExcludeTeam: false,
}
return s.getSidebarCategoriesT(s.GetReplica(), userId, opts)
} }
func (s SqlChannelStore) GetSidebarCategories(userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (s SqlChannelStore) GetSidebarCategories(userID string, teamID string) (*model.OrderedSidebarCategories, error) {
return s.getSidebarCategoriesT(s.GetReplica(), userID, opts) return s.getSidebarCategoriesT(s.GetReplica(), userID, teamID)
} }
func (s SqlChannelStore) GetSidebarCategoryOrder(userId, teamId string) ([]string, error) { func (s SqlChannelStore) GetSidebarCategoryOrder(userId, teamId string) ([]string, error) {

Просмотреть файл

@@ -289,9 +289,9 @@ type ChannelStore interface {
MigrateChannelMembers(fromChannelID string, fromUserID string) (map[string]string, error) MigrateChannelMembers(fromChannelID string, fromUserID string) (map[string]string, error)
ResetAllChannelSchemes() error ResetAllChannelSchemes() error
ClearAllCustomRoleAssignments() error ClearAllCustomRoleAssignments() error
CreateInitialSidebarCategories(c request.CTX, userID string, opts *SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) CreateInitialSidebarCategories(c request.CTX, userID string, teamID string) (*model.OrderedSidebarCategories, error)
GetSidebarCategoriesForTeamForUser(userID, teamID string) (*model.OrderedSidebarCategories, error) GetSidebarCategoriesForTeamForUser(userID, teamID string) (*model.OrderedSidebarCategories, error)
GetSidebarCategories(userID string, opts *SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) GetSidebarCategories(userID string, teamID string) (*model.OrderedSidebarCategories, error)
GetSidebarCategory(categoryID string) (*model.SidebarCategoryWithChannels, error) GetSidebarCategory(categoryID string) (*model.SidebarCategoryWithChannels, error)
GetSidebarCategoryOrder(userID, teamID string) ([]string, error) GetSidebarCategoryOrder(userID, teamID string) ([]string, error)
CreateSidebarCategory(userID, teamID string, newCategory *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) CreateSidebarCategory(userID, teamID string, newCategory *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error)
@@ -1220,14 +1220,6 @@ type PostReminderMetadata struct {
Username string Username string
} }
// SidebarCategorySearchOpts contains the options for a graphQL query
// to get the sidebar categories.
type SidebarCategorySearchOpts struct {
TeamID string
ExcludeTeam bool
Type model.SidebarCategoryType
}
type ThreadMembershipImportData struct { type ThreadMembershipImportData struct {
// LastViewed is the timestamp to set the LastViewed field to. // LastViewed is the timestamp to set the LastViewed field to.
LastViewed int64 LastViewed int64

Просмотреть файл

@@ -63,12 +63,7 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
assert.NoError(t, nErr) assert.NoError(t, nErr)
require.Len(t, res.Categories, 3) require.Len(t, res.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
@@ -86,15 +81,11 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
team := setupTeam(t, rctx, ss, userID, userID2) team := setupTeam(t, rctx, ss, userID, userID2)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID2, opts) res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID2, team.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.Len(t, res.Categories, 3) assert.Len(t, res.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
@@ -112,19 +103,11 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
team2 := setupTeam(t, rctx, ss, userID) team2 := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
opts = &store.SidebarCategorySearchOpts{ res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, team2.Id)
TeamID: team2.Id,
ExcludeTeam: false,
}
res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.Len(t, res.Categories, 3) assert.Len(t, res.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
@@ -141,11 +124,7 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -154,7 +133,7 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
require.Equal(t, res, initialCategories) require.Equal(t, res, initialCategories)
// Calling CreateInitialSidebarCategories a second time shouldn't create any new categories // Calling CreateInitialSidebarCategories a second time shouldn't create any new categories
res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts) res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
assert.NoError(t, nErr) assert.NoError(t, nErr)
assert.NotEmpty(t, res) assert.NotEmpty(t, res)
@@ -176,11 +155,7 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
go func() { go func() {
defer wg.Done() defer wg.Done()
opts := &store.SidebarCategorySearchOpts{ _, _ = ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
_, _ = ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
}() }()
} }
@@ -234,11 +209,8 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
require.NoError(t, nErr) require.NoError(t, nErr)
// Create the categories // Create the categories
opts := &store.SidebarCategorySearchOpts{ // Create the categories
TeamID: team.Id, categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
@@ -303,11 +275,8 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
require.NoError(t, nErr) require.NoError(t, nErr)
// Create the categories // Create the categories
opts := &store.SidebarCategorySearchOpts{ // Create the categories
TeamID: team.Id, categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
@@ -371,11 +340,8 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
require.NoError(t, err) require.NoError(t, err)
// Create the categories // Create the categories
opts := &store.SidebarCategorySearchOpts{ // Create the categories
TeamID: team.Id, categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
@@ -420,11 +386,8 @@ func testCreateInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store
require.NoError(t, nErr) require.NoError(t, nErr)
// Create the categories // Create the categories
opts := &store.SidebarCategorySearchOpts{ // Create the categories
TeamID: team.Id, categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
categories, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.Len(t, categories.Categories, 3) require.Len(t, categories.Categories, 3)
assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type) assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
@@ -461,11 +424,7 @@ func testCreateSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store) {
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -491,11 +450,7 @@ func testCreateSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store) {
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -532,11 +487,7 @@ func testCreateSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store) {
userID := model.NewId() userID := model.NewId()
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -574,11 +525,7 @@ func testCreateSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store) {
userID := model.NewId() userID := model.NewId()
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -639,11 +586,7 @@ func testCreateSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store) {
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
// Create the category // Create the category
@@ -676,11 +619,7 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
channelID2 := model.NewId() channelID2 := model.NewId()
channelID3 := model.NewId() channelID3 := model.NewId()
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -710,11 +649,8 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the channels category // Create the initial categories and find the channels category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the channels category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -778,11 +714,8 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the channels category // Create the initial categories and find the channels category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the channels category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -820,12 +753,8 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
userID := model.NewId() userID := model.NewId()
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{
TeamID: team.Id,
ExcludeTeam: false,
}
// Create the initial categories and find the channels category // Create the initial categories and find the channels category
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts) res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -888,11 +817,8 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the DMs category // Create the initial categories and find the DMs category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the DMs category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -933,11 +859,8 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the DMs category // Create the initial categories and find the DMs category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the DMs category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -975,11 +898,8 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the DMs category // Create the initial categories and find the DMs category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the DMs category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1009,11 +929,7 @@ func testGetSidebarCategory(t *testing.T, rctx request.CTX, ss store.Store, s Sq
// Create another team and assign the DM to a custom category on that team // Create another team and assign the DM to a custom category on that team
otherTeam := setupTeam(t, rctx, ss, userID) otherTeam := setupTeam(t, rctx, ss, userID)
opts = &store.SidebarCategorySearchOpts{ res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, otherTeam.Id)
TeamID: otherTeam.Id,
ExcludeTeam: false,
}
res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1040,11 +956,7 @@ func testGetSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store) {
userID := model.NewId() userID := model.NewId()
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1074,66 +986,6 @@ func testGetSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store) {
assert.Equal(t, gotCategory.Channels, res.Categories[1].Channels) assert.Equal(t, gotCategory.Channels, res.Categories[1].Channels)
assert.Equal(t, channelIds, res.Categories[1].Channels) assert.Equal(t, channelIds, res.Categories[1].Channels)
}) })
t.Run("should not return categories for teams deleted, or no longer a member", func(t *testing.T) {
userID := model.NewId()
teamMember1 := setupTeam(t, rctx, ss, userID)
teamMember2 := setupTeam(t, rctx, ss, userID)
teamDeleted := setupTeam(t, rctx, ss, userID)
teamDeleted.DeleteAt = model.GetMillis()
ss.Team().Update(teamDeleted)
teamNotMember := setupTeam(t, rctx, ss)
teamDeletedMember := setupTeam(t, rctx, ss, userID)
members, err := ss.Team().GetMembersByIds(teamDeletedMember.Id, []string{userID}, nil)
require.NoError(t, err)
require.NotEmpty(t, members)
member := members[0]
member.DeleteAt = model.GetMillis()
ss.Team().UpdateMember(rctx, member)
teamIds := []string{
teamMember1.Id,
teamMember2.Id,
teamDeleted.Id,
teamNotMember.Id,
teamDeletedMember.Id,
}
for _, id := range teamIds {
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, &store.SidebarCategorySearchOpts{TeamID: id})
require.NoError(t, nErr)
require.NotEmpty(t, res)
}
opts := &store.SidebarCategorySearchOpts{
TeamID: teamMember1.Id,
ExcludeTeam: false,
}
// Team member and not exclude
res, err := ss.Channel().GetSidebarCategories(userID, opts)
require.NoError(t, err)
assert.Equal(t, 3, len(res.Categories))
// No team member and not exclude
opts.TeamID = teamDeleted.Id
res, err = ss.Channel().GetSidebarCategories(userID, opts)
require.NoError(t, err)
assert.Equal(t, 0, len(res.Categories))
// No team member and exclude
opts.ExcludeTeam = true
res, err = ss.Channel().GetSidebarCategories(userID, opts)
require.NoError(t, err)
assert.Equal(t, 6, len(res.Categories))
// Team member and exclude
opts.TeamID = teamMember1.Id
res, err = ss.Channel().GetSidebarCategories(userID, opts)
require.NoError(t, err)
assert.Equal(t, 3, len(res.Categories))
})
} }
func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store) { func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store) {
@@ -1142,11 +994,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories // Create the initial categories
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories
TeamID: team.Id, res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1180,11 +1029,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories // Create the initial categories
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories
TeamID: team.Id, res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1211,11 +1057,7 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
userID := model.NewId() userID := model.NewId()
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1282,11 +1124,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the favorites category // Create the initial categories and find the favorites category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the favorites category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1347,11 +1186,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the favorites category // Create the initial categories and find the favorites category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the favorites category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1418,11 +1254,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
team2 := setupTeam(t, rctx, ss, userID) team2 := setupTeam(t, rctx, ss, userID)
// Create the initial categories and find the favorites categories in each team // Create the initial categories and find the favorites categories in each team
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the favorites categories in each team
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1432,11 +1265,7 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
favoritesCategory := categories.Categories[0] favoritesCategory := categories.Categories[0]
require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type) require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
opts = &store.SidebarCategorySearchOpts{ res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, team2.Id)
TeamID: team2.Id,
ExcludeTeam: false,
}
res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1527,11 +1356,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
team := setupTeam(t, rctx, ss, userID, userID2) team := setupTeam(t, rctx, ss, userID, userID2)
// Create the initial categories and find the favorites category // Create the initial categories and find the favorites category
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories and find the favorites category
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1544,7 +1370,7 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type) require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
// Create the other users' categories // Create the other users' categories
res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID2, opts) res, nErr = ss.Channel().CreateInitialSidebarCategories(rctx, userID2, team.Id)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1701,11 +1527,7 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
) )
require.NoError(t, nErr) require.NoError(t, nErr)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1760,11 +1582,7 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
) )
require.NoError(t, nErr) require.NoError(t, nErr)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1852,11 +1670,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
require.NoError(t, err) require.NoError(t, err)
// And then create the initial categories so that it includes the channel // And then create the initial categories so that it includes the channel
opts := &store.SidebarCategorySearchOpts{ // And then create the initial categories so that it includes the channel
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1920,11 +1735,8 @@ func testUpdateSidebarCategories(t *testing.T, rctx request.CTX, ss store.Store)
require.NoError(t, err) require.NoError(t, err)
// And then create the initial categories so that Channels includes the channel // And then create the initial categories so that Channels includes the channel
opts := &store.SidebarCategorySearchOpts{ // And then create the initial categories so that Channels includes the channel
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -1982,11 +1794,7 @@ func setupInitialSidebarCategories(t *testing.T, rctx request.CTX, ss store.Stor
userID := model.NewId() userID := model.NewId()
team := setupTeam(t, rctx, ss, userID) team := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
TeamID: team.Id,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -2109,11 +1917,7 @@ func testClearSidebarOnTeamLeave(t *testing.T, rctx request.CTX, ss store.Store,
// Create a second team and set up the sidebar categories for it // Create a second team and set up the sidebar categories for it
team2 := setupTeam(t, rctx, ss, userID) team2 := setupTeam(t, rctx, ss, userID)
opts := &store.SidebarCategorySearchOpts{ res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team2.Id)
TeamID: team2.Id,
ExcludeTeam: false,
}
res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -2300,11 +2104,7 @@ func testUpdateSidebarChannelsByPreferences(t *testing.T, rctx request.CTX, ss s
userID := model.NewId() userID := model.NewId()
teamID := model.NewId() teamID := model.NewId()
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, teamID)
TeamID: teamID,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -2329,11 +2129,7 @@ func testUpdateSidebarChannelsByPreferences(t *testing.T, rctx request.CTX, ss s
userID := model.NewId() userID := model.NewId()
teamID := model.NewId() teamID := model.NewId()
opts := &store.SidebarCategorySearchOpts{ res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, teamID)
TeamID: teamID,
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
assert.NoError(t, nErr) assert.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -2371,11 +2167,8 @@ func testSidebarCategoryDeadlock(t *testing.T, rctx request.CTX, ss store.Store)
require.NoError(t, err) require.NoError(t, err)
// And then create the initial categories so that it includes the channel // And then create the initial categories so that it includes the channel
opts := &store.SidebarCategorySearchOpts{ // And then create the initial categories so that it includes the channel
TeamID: team.Id, res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, err := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res) require.NotEmpty(t, res)
@@ -2482,11 +2275,8 @@ func doTestSidebarCategoryConcurrentAccess(t *testing.T, rctx request.CTX, ss st
} }
// Create the initial categories // Create the initial categories
opts := &store.SidebarCategorySearchOpts{ // Create the initial categories
TeamID: team.Id, res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, team.Id)
ExcludeTeam: false,
}
res, nErr := ss.Channel().CreateInitialSidebarCategories(rctx, userID, opts)
require.NoError(t, nErr) require.NoError(t, nErr)
require.NotEmpty(t, res) require.NotEmpty(t, res)

Просмотреть файл

@@ -342,9 +342,9 @@ func (_m *ChannelStore) CreateDirectChannel(ctx request.CTX, userID *model.User,
return r0, r1 return r0, r1
} }
// CreateInitialSidebarCategories provides a mock function with given fields: c, userID, opts // CreateInitialSidebarCategories provides a mock function with given fields: c, userID, teamID
func (_m *ChannelStore) CreateInitialSidebarCategories(c request.CTX, userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (_m *ChannelStore) CreateInitialSidebarCategories(c request.CTX, userID string, teamID string) (*model.OrderedSidebarCategories, error) {
ret := _m.Called(c, userID, opts) ret := _m.Called(c, userID, teamID)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for CreateInitialSidebarCategories") panic("no return value specified for CreateInitialSidebarCategories")
@@ -352,19 +352,19 @@ func (_m *ChannelStore) CreateInitialSidebarCategories(c request.CTX, userID str
var r0 *model.OrderedSidebarCategories var r0 *model.OrderedSidebarCategories
var r1 error var r1 error
if rf, ok := ret.Get(0).(func(request.CTX, string, *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error)); ok { if rf, ok := ret.Get(0).(func(request.CTX, string, string) (*model.OrderedSidebarCategories, error)); ok {
return rf(c, userID, opts) return rf(c, userID, teamID)
} }
if rf, ok := ret.Get(0).(func(request.CTX, string, *store.SidebarCategorySearchOpts) *model.OrderedSidebarCategories); ok { if rf, ok := ret.Get(0).(func(request.CTX, string, string) *model.OrderedSidebarCategories); ok {
r0 = rf(c, userID, opts) r0 = rf(c, userID, teamID)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.OrderedSidebarCategories) r0 = ret.Get(0).(*model.OrderedSidebarCategories)
} }
} }
if rf, ok := ret.Get(1).(func(request.CTX, string, *store.SidebarCategorySearchOpts) error); ok { if rf, ok := ret.Get(1).(func(request.CTX, string, string) error); ok {
r1 = rf(c, userID, opts) r1 = rf(c, userID, teamID)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
@@ -1968,9 +1968,9 @@ func (_m *ChannelStore) GetPublicChannelsForTeam(teamID string, offset int, limi
return r0, r1 return r0, r1
} }
// GetSidebarCategories provides a mock function with given fields: userID, opts // GetSidebarCategories provides a mock function with given fields: userID, teamID
func (_m *ChannelStore) GetSidebarCategories(userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (_m *ChannelStore) GetSidebarCategories(userID string, teamID string) (*model.OrderedSidebarCategories, error) {
ret := _m.Called(userID, opts) ret := _m.Called(userID, teamID)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetSidebarCategories") panic("no return value specified for GetSidebarCategories")
@@ -1978,19 +1978,19 @@ func (_m *ChannelStore) GetSidebarCategories(userID string, opts *store.SidebarC
var r0 *model.OrderedSidebarCategories var r0 *model.OrderedSidebarCategories
var r1 error var r1 error
if rf, ok := ret.Get(0).(func(string, *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error)); ok { if rf, ok := ret.Get(0).(func(string, string) (*model.OrderedSidebarCategories, error)); ok {
return rf(userID, opts) return rf(userID, teamID)
} }
if rf, ok := ret.Get(0).(func(string, *store.SidebarCategorySearchOpts) *model.OrderedSidebarCategories); ok { if rf, ok := ret.Get(0).(func(string, string) *model.OrderedSidebarCategories); ok {
r0 = rf(userID, opts) r0 = rf(userID, teamID)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.OrderedSidebarCategories) r0 = ret.Get(0).(*model.OrderedSidebarCategories)
} }
} }
if rf, ok := ret.Get(1).(func(string, *store.SidebarCategorySearchOpts) error); ok { if rf, ok := ret.Get(1).(func(string, string) error); ok {
r1 = rf(userID, opts) r1 = rf(userID, teamID)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }

Просмотреть файл

@@ -1041,10 +1041,10 @@ func (s *TimerLayerChannelStore) CreateDirectChannel(ctx request.CTX, userID *mo
return result, err return result, err
} }
func (s *TimerLayerChannelStore) CreateInitialSidebarCategories(c request.CTX, userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (s *TimerLayerChannelStore) CreateInitialSidebarCategories(c request.CTX, userID string, teamID string) (*model.OrderedSidebarCategories, error) {
start := time.Now() start := time.Now()
result, err := s.ChannelStore.CreateInitialSidebarCategories(c, userID, opts) result, err := s.ChannelStore.CreateInitialSidebarCategories(c, userID, teamID)
elapsed := float64(time.Since(start)) / float64(time.Second) elapsed := float64(time.Since(start)) / float64(time.Second)
if s.Root.Metrics != nil { if s.Root.Metrics != nil {
@@ -1937,10 +1937,10 @@ func (s *TimerLayerChannelStore) GetPublicChannelsForTeam(teamID string, offset
return result, err return result, err
} }
func (s *TimerLayerChannelStore) GetSidebarCategories(userID string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (s *TimerLayerChannelStore) GetSidebarCategories(userID string, teamID string) (*model.OrderedSidebarCategories, error) {
start := time.Now() start := time.Now()
result, err := s.ChannelStore.GetSidebarCategories(userID, opts) result, err := s.ChannelStore.GetSidebarCategories(userID, teamID)
elapsed := float64(time.Since(start)) / float64(time.Second) elapsed := float64(time.Since(start)) / float64(time.Second)
if s.Root.Metrics != nil { if s.Root.Metrics != nil {