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  }