5
5
package repo
6
6
7
7
import (
8
+ "encoding/json"
8
9
"fmt"
9
10
"net/http"
10
11
"net/url"
@@ -299,7 +300,6 @@ func ViewProject(ctx *context.Context) {
299
300
ctx .ServerError ("LoadIssuesOfBoards" , err )
300
301
return
301
302
}
302
- ctx .Data ["Issues" ] = issueList
303
303
304
304
linkedPrsMap := make (map [int64 ][]* models.Issue )
305
305
for _ , issue := range issueList {
@@ -547,9 +547,8 @@ func SetDefaultProjectBoard(ctx *context.Context) {
547
547
})
548
548
}
549
549
550
- // MoveIssueAcrossBoards move a card from one board to another in a project
551
- func MoveIssueAcrossBoards (ctx * context.Context ) {
552
-
550
+ // MoveIssues moves or keeps issues in a column and sorts them inside that column
551
+ func MoveIssues (ctx * context.Context ) {
553
552
if ctx .User == nil {
554
553
ctx .JSON (http .StatusForbidden , map [string ]string {
555
554
"message" : "Only signed in users are allowed to perform this action." ,
@@ -564,59 +563,80 @@ func MoveIssueAcrossBoards(ctx *context.Context) {
564
563
return
565
564
}
566
565
567
- p , err := models .GetProjectByID (ctx .ParamsInt64 (":id" ))
566
+ project , err := models .GetProjectByID (ctx .ParamsInt64 (":id" ))
568
567
if err != nil {
569
568
if models .IsErrProjectNotExist (err ) {
570
- ctx .NotFound ("" , nil )
569
+ ctx .NotFound ("ProjectNotExist " , nil )
571
570
} else {
572
571
ctx .ServerError ("GetProjectByID" , err )
573
572
}
574
573
return
575
574
}
576
- if p .RepoID != ctx .Repo .Repository .ID {
577
- ctx .NotFound ("" , nil )
575
+ if project .RepoID != ctx .Repo .Repository .ID {
576
+ ctx .NotFound ("InvalidRepoID " , nil )
578
577
return
579
578
}
580
579
581
580
var board * models.ProjectBoard
582
581
583
582
if ctx .ParamsInt64 (":boardID" ) == 0 {
584
-
585
583
board = & models.ProjectBoard {
586
584
ID : 0 ,
587
- ProjectID : 0 ,
585
+ ProjectID : project . ID ,
588
586
Title : ctx .Tr ("repo.projects.type.uncategorized" ),
589
587
}
590
-
591
588
} else {
589
+ // column
592
590
board , err = models .GetProjectBoard (ctx .ParamsInt64 (":boardID" ))
593
591
if err != nil {
594
592
if models .IsErrProjectBoardNotExist (err ) {
595
- ctx .NotFound ("" , nil )
593
+ ctx .NotFound ("ProjectBoardNotExist " , nil )
596
594
} else {
597
595
ctx .ServerError ("GetProjectBoard" , err )
598
596
}
599
597
return
600
598
}
601
- if board .ProjectID != p .ID {
602
- ctx .NotFound ("" , nil )
599
+ if board .ProjectID != project .ID {
600
+ ctx .NotFound ("BoardNotInProject " , nil )
603
601
return
604
602
}
605
603
}
606
604
607
- issue , err := models .GetIssueByID (ctx .ParamsInt64 (":index" ))
605
+ type movedIssuesForm struct {
606
+ Issues []struct {
607
+ IssueID int64 `json:"issueID"`
608
+ Sorting int64 `json:"sorting"`
609
+ } `json:"issues"`
610
+ }
611
+
612
+ form := & movedIssuesForm {}
613
+ if err = json .NewDecoder (ctx .Req .Body ).Decode (& form ); err != nil {
614
+ ctx .ServerError ("DecodeMovedIssuesForm" , err )
615
+ }
616
+
617
+ issueIDs := make ([]int64 , 0 , len (form .Issues ))
618
+ sortedIssueIDs := make (map [int64 ]int64 )
619
+ for _ , issue := range form .Issues {
620
+ issueIDs = append (issueIDs , issue .IssueID )
621
+ sortedIssueIDs [issue .Sorting ] = issue .IssueID
622
+ }
623
+ movedIssues , err := models .GetIssuesByIDs (issueIDs )
608
624
if err != nil {
609
625
if models .IsErrIssueNotExist (err ) {
610
- ctx .NotFound ("" , nil )
626
+ ctx .NotFound ("IssueNotExisting " , nil )
611
627
} else {
612
628
ctx .ServerError ("GetIssueByID" , err )
613
629
}
630
+ return
631
+ }
614
632
633
+ if len (movedIssues ) != len (form .Issues ) {
634
+ ctx .ServerError ("IssuesNotFound" , err )
615
635
return
616
636
}
617
637
618
- if err : = models .MoveIssueAcrossProjectBoards ( issue , board ); err != nil {
619
- ctx .ServerError ("MoveIssueAcrossProjectBoards " , err )
638
+ if err = models .MoveIssuesOnProjectBoard ( board , sortedIssueIDs ); err != nil {
639
+ ctx .ServerError ("MoveIssuesOnProjectBoard " , err )
620
640
return
621
641
}
622
642
0 commit comments