2022-04-14 00:10:53 +02:00
package app
2022-10-26 13:08:03 +02:00
import (
"fmt"
"github.com/mattermost/focalboard/server/model"
)
const defaultCategoryBoards = "Boards"
2022-04-14 00:10:53 +02:00
func ( a * App ) GetUserCategoryBoards ( userID , teamID string ) ( [ ] model . CategoryBoards , error ) {
2022-10-26 13:08:03 +02:00
categoryBoards , err := a . store . GetUserCategoryBoards ( userID , teamID )
if err != nil {
return nil , err
}
createdCategoryBoards , err := a . createDefaultCategoriesIfRequired ( categoryBoards , userID , teamID )
if err != nil {
return nil , err
}
categoryBoards = append ( categoryBoards , createdCategoryBoards ... )
return categoryBoards , nil
}
func ( a * App ) createDefaultCategoriesIfRequired ( existingCategoryBoards [ ] model . CategoryBoards , userID , teamID string ) ( [ ] model . CategoryBoards , error ) {
createdCategories := [ ] model . CategoryBoards { }
boardsCategoryExist := false
for _ , categoryBoard := range existingCategoryBoards {
if categoryBoard . Name == defaultCategoryBoards {
boardsCategoryExist = true
}
}
if ! boardsCategoryExist {
createdCategoryBoards , err := a . createBoardsCategory ( userID , teamID , existingCategoryBoards )
if err != nil {
return nil , err
}
createdCategories = append ( createdCategories , * createdCategoryBoards )
}
return createdCategories , nil
}
func ( a * App ) createBoardsCategory ( userID , teamID string , existingCategoryBoards [ ] model . CategoryBoards ) ( * model . CategoryBoards , error ) {
// create the category
category := model . Category {
Name : defaultCategoryBoards ,
UserID : userID ,
TeamID : teamID ,
Collapsed : false ,
Type : model . CategoryTypeSystem ,
}
createdCategory , err := a . CreateCategory ( & category )
if err != nil {
return nil , fmt . Errorf ( "createBoardsCategory default category creation failed: %w" , err )
}
// once the category is created, we need to move all boards which do not
// belong to any category, into this category.
2022-11-24 09:21:17 +01:00
boardMembers , err := a . GetMembersForUser ( userID )
2022-10-26 13:08:03 +02:00
if err != nil {
2022-11-24 09:21:17 +01:00
return nil , err
2022-10-26 13:08:03 +02:00
}
createdCategoryBoards := & model . CategoryBoards {
Category : * createdCategory ,
BoardIDs : [ ] string { } ,
}
2022-11-24 09:21:17 +01:00
for _ , bm := range boardMembers {
// boards with implicit access (aka synthetic membership),
// should show up in LHS only when openign them explicitelly.
// So we don't process any synthetic membership boards
// and only add boards with explicit access to, to the the LHS,
// for example, if a user explicitelly added another user to a board.
if bm . Synthetic {
continue
}
2022-10-26 13:08:03 +02:00
belongsToCategory := false
for _ , categoryBoard := range existingCategoryBoards {
for _ , boardID := range categoryBoard . BoardIDs {
2022-11-24 09:21:17 +01:00
if boardID == bm . BoardID {
2022-10-26 13:08:03 +02:00
belongsToCategory = true
break
}
}
// stop looking into other categories if
// the board was found in a category
if belongsToCategory {
break
}
}
if ! belongsToCategory {
2022-11-24 09:21:17 +01:00
if err := a . AddUpdateUserCategoryBoard ( teamID , userID , createdCategory . ID , bm . BoardID ) ; err != nil {
2022-10-26 13:08:03 +02:00
return nil , fmt . Errorf ( "createBoardsCategory failed to add category-less board to the default category, defaultCategoryID: %s, error: %w" , createdCategory . ID , err )
}
2022-11-24 09:21:17 +01:00
createdCategoryBoards . BoardIDs = append ( createdCategoryBoards . BoardIDs , bm . BoardID )
2022-10-26 13:08:03 +02:00
}
}
return createdCategoryBoards , nil
2022-04-14 00:10:53 +02:00
}
func ( a * App ) AddUpdateUserCategoryBoard ( teamID , userID , categoryID , boardID string ) error {
err := a . store . AddUpdateCategoryBoard ( userID , categoryID , boardID )
if err != nil {
return err
}
a . blockChangeNotifier . Enqueue ( func ( ) error {
a . wsAdapter . BroadcastCategoryBoardChange (
teamID ,
userID ,
model . BoardCategoryWebsocketData {
BoardID : boardID ,
CategoryID : categoryID ,
} )
return nil
} )
return nil
}