code.gitea.io/gitea@v1.21.7/services/issue/milestone.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package issue 5 6 import ( 7 "context" 8 "fmt" 9 10 "code.gitea.io/gitea/models/db" 11 issues_model "code.gitea.io/gitea/models/issues" 12 user_model "code.gitea.io/gitea/models/user" 13 notify_service "code.gitea.io/gitea/services/notify" 14 ) 15 16 func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldMilestoneID int64) error { 17 // Only check if milestone exists if we don't remove it. 18 if issue.MilestoneID > 0 { 19 has, err := issues_model.HasMilestoneByRepoID(ctx, issue.RepoID, issue.MilestoneID) 20 if err != nil { 21 return fmt.Errorf("HasMilestoneByRepoID: %w", err) 22 } 23 if !has { 24 return fmt.Errorf("HasMilestoneByRepoID: issue doesn't exist") 25 } 26 } 27 28 if err := issues_model.UpdateIssueCols(ctx, issue, "milestone_id"); err != nil { 29 return err 30 } 31 32 if oldMilestoneID > 0 { 33 if err := issues_model.UpdateMilestoneCounters(ctx, oldMilestoneID); err != nil { 34 return err 35 } 36 } 37 38 if issue.MilestoneID > 0 { 39 if err := issues_model.UpdateMilestoneCounters(ctx, issue.MilestoneID); err != nil { 40 return err 41 } 42 } 43 44 if oldMilestoneID > 0 || issue.MilestoneID > 0 { 45 if err := issue.LoadRepo(ctx); err != nil { 46 return err 47 } 48 49 opts := &issues_model.CreateCommentOptions{ 50 Type: issues_model.CommentTypeMilestone, 51 Doer: doer, 52 Repo: issue.Repo, 53 Issue: issue, 54 OldMilestoneID: oldMilestoneID, 55 MilestoneID: issue.MilestoneID, 56 } 57 if _, err := issues_model.CreateComment(ctx, opts); err != nil { 58 return err 59 } 60 } 61 62 return nil 63 } 64 65 // ChangeMilestoneAssign changes assignment of milestone for issue. 66 func ChangeMilestoneAssign(issue *issues_model.Issue, doer *user_model.User, oldMilestoneID int64) (err error) { 67 ctx, committer, err := db.TxContext(db.DefaultContext) 68 if err != nil { 69 return err 70 } 71 defer committer.Close() 72 73 if err = changeMilestoneAssign(ctx, doer, issue, oldMilestoneID); err != nil { 74 return err 75 } 76 77 if err = committer.Commit(); err != nil { 78 return fmt.Errorf("Commit: %w", err) 79 } 80 81 notify_service.IssueChangeMilestone(db.DefaultContext, doer, issue, oldMilestoneID) 82 83 return nil 84 }