aboutsummaryrefslogtreecommitdiffstats
path: root/models/project
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2024-03-29 00:14:30 +0800
committerGitHub <noreply@github.com>2024-03-28 16:14:30 +0000
commit40cdc84b368cce8328b4b49ea5ecf1c5fa040300 (patch)
tree73bd6b10ee30881210271ae73d4e94ea2c5ad793 /models/project
parent9585e19bb4386691760f741e23fba56cbfca8afb (diff)
downloadgitea-40cdc84b368cce8328b4b49ea5ecf1c5fa040300.tar.gz
gitea-40cdc84b368cce8328b4b49ea5ecf1c5fa040300.zip
Fix migration v292 (#30153)v1.22.0-rc0
Fix https://github.com/go-gitea/gitea/pull/29874#discussion_r1542227686 - The migration of v292 will miss many projects. These projects will have no default board. This PR introduced a new migration number and removed v292 migration. - This PR also added the missed transactions on project-related operations. - Only `SetDefaultBoard` will remove duplicated defaults but not in `GetDefaultBoard`
Diffstat (limited to 'models/project')
-rw-r--r--models/project/board.go90
-rw-r--r--models/project/board_test.go6
2 files changed, 45 insertions, 51 deletions
diff --git a/models/project/board.go b/models/project/board.go
index 5605f259b5..5f142a356c 100644
--- a/models/project/board.go
+++ b/models/project/board.go
@@ -209,7 +209,6 @@ func deleteBoardByProjectID(ctx context.Context, projectID int64) error {
// GetBoard fetches the current board of a project
func GetBoard(ctx context.Context, boardID int64) (*Board, error) {
board := new(Board)
-
has, err := db.GetEngine(ctx).ID(boardID).Get(board)
if err != nil {
return nil, err
@@ -260,71 +259,62 @@ func (p *Project) GetBoards(ctx context.Context) (BoardList, error) {
// getDefaultBoard return default board and ensure only one exists
func (p *Project) getDefaultBoard(ctx context.Context) (*Board, error) {
- var boards []Board
- if err := db.GetEngine(ctx).Where("project_id=? AND `default` = ?", p.ID, true).OrderBy("sorting").Find(&boards); err != nil {
+ var board Board
+ has, err := db.GetEngine(ctx).
+ Where("project_id=? AND `default` = ?", p.ID, true).
+ Desc("id").Get(&board)
+ if err != nil {
return nil, err
}
- // create a default board if none is found
- if len(boards) == 0 {
- board := Board{
- ProjectID: p.ID,
- Default: true,
- Title: "Uncategorized",
- CreatorID: p.CreatorID,
- }
- if _, err := db.GetEngine(ctx).Insert(); err != nil {
- return nil, err
- }
+ if has {
return &board, nil
}
- // unset default boards where too many default boards exist
- if len(boards) > 1 {
- var boardsToUpdate []int64
- for id, b := range boards {
- if id > 0 {
- boardsToUpdate = append(boardsToUpdate, b.ID)
- }
- }
-
- if _, err := db.GetEngine(ctx).Where(builder.Eq{"project_id": p.ID}.And(builder.In("id", boardsToUpdate))).
- Cols("`default`").Update(&Board{Default: false}); err != nil {
- return nil, err
- }
+ // create a default board if none is found
+ board = Board{
+ ProjectID: p.ID,
+ Default: true,
+ Title: "Uncategorized",
+ CreatorID: p.CreatorID,
}
-
- return &boards[0], nil
+ if _, err := db.GetEngine(ctx).Insert(&board); err != nil {
+ return nil, err
+ }
+ return &board, nil
}
// SetDefaultBoard represents a board for issues not assigned to one
func SetDefaultBoard(ctx context.Context, projectID, boardID int64) error {
- if _, err := GetBoard(ctx, boardID); err != nil {
- return err
- }
-
- if _, err := db.GetEngine(ctx).Where(builder.Eq{
- "project_id": projectID,
- "`default`": true,
- }).Cols("`default`").Update(&Board{Default: false}); err != nil {
- return err
- }
+ return db.WithTx(ctx, func(ctx context.Context) error {
+ if _, err := GetBoard(ctx, boardID); err != nil {
+ return err
+ }
- _, err := db.GetEngine(ctx).ID(boardID).Where(builder.Eq{"project_id": projectID}).
- Cols("`default`").Update(&Board{Default: true})
+ if _, err := db.GetEngine(ctx).Where(builder.Eq{
+ "project_id": projectID,
+ "`default`": true,
+ }).Cols("`default`").Update(&Board{Default: false}); err != nil {
+ return err
+ }
- return err
+ _, err := db.GetEngine(ctx).ID(boardID).
+ Where(builder.Eq{"project_id": projectID}).
+ Cols("`default`").Update(&Board{Default: true})
+ return err
+ })
}
// UpdateBoardSorting update project board sorting
func UpdateBoardSorting(ctx context.Context, bs BoardList) error {
- for i := range bs {
- _, err := db.GetEngine(ctx).ID(bs[i].ID).Cols(
- "sorting",
- ).Update(bs[i])
- if err != nil {
- return err
+ return db.WithTx(ctx, func(ctx context.Context) error {
+ for i := range bs {
+ if _, err := db.GetEngine(ctx).ID(bs[i].ID).Cols(
+ "sorting",
+ ).Update(bs[i]); err != nil {
+ return err
+ }
}
- }
- return nil
+ return nil
+ })
}
diff --git a/models/project/board_test.go b/models/project/board_test.go
index c1c6f0180b..71ba29a589 100644
--- a/models/project/board_test.go
+++ b/models/project/board_test.go
@@ -31,8 +31,12 @@ func TestGetDefaultBoard(t *testing.T) {
board, err = projectWithMultipleDefaults.getDefaultBoard(db.DefaultContext)
assert.NoError(t, err)
assert.Equal(t, int64(6), board.ProjectID)
- assert.Equal(t, int64(8), board.ID)
+ assert.Equal(t, int64(9), board.ID)
+ // set 8 as default board
+ assert.NoError(t, SetDefaultBoard(db.DefaultContext, board.ProjectID, 8))
+
+ // then 9 will become a non-default board
board, err = GetBoard(db.DefaultContext, 9)
assert.NoError(t, err)
assert.Equal(t, int64(6), board.ProjectID)