code.gitea.io/gitea@v1.21.7/services/issue/label.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  
     9  	"code.gitea.io/gitea/models/db"
    10  	issues_model "code.gitea.io/gitea/models/issues"
    11  	access_model "code.gitea.io/gitea/models/perm/access"
    12  	user_model "code.gitea.io/gitea/models/user"
    13  	notify_service "code.gitea.io/gitea/services/notify"
    14  )
    15  
    16  // ClearLabels clears all of an issue's labels
    17  func ClearLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User) error {
    18  	if err := issues_model.ClearIssueLabels(issue, doer); err != nil {
    19  		return err
    20  	}
    21  
    22  	notify_service.IssueClearLabels(ctx, doer, issue)
    23  
    24  	return nil
    25  }
    26  
    27  // AddLabel adds a new label to the issue.
    28  func AddLabel(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, label *issues_model.Label) error {
    29  	if err := issues_model.NewIssueLabel(issue, label, doer); err != nil {
    30  		return err
    31  	}
    32  
    33  	notify_service.IssueChangeLabels(ctx, doer, issue, []*issues_model.Label{label}, nil)
    34  	return nil
    35  }
    36  
    37  // AddLabels adds a list of new labels to the issue.
    38  func AddLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, labels []*issues_model.Label) error {
    39  	if err := issues_model.NewIssueLabels(issue, labels, doer); err != nil {
    40  		return err
    41  	}
    42  
    43  	notify_service.IssueChangeLabels(ctx, doer, issue, labels, nil)
    44  	return nil
    45  }
    46  
    47  // RemoveLabel removes a label from issue by given ID.
    48  func RemoveLabel(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, label *issues_model.Label) error {
    49  	dbCtx, committer, err := db.TxContext(ctx)
    50  	if err != nil {
    51  		return err
    52  	}
    53  	defer committer.Close()
    54  
    55  	if err := issue.LoadRepo(dbCtx); err != nil {
    56  		return err
    57  	}
    58  
    59  	perm, err := access_model.GetUserRepoPermission(dbCtx, issue.Repo, doer)
    60  	if err != nil {
    61  		return err
    62  	}
    63  	if !perm.CanWriteIssuesOrPulls(issue.IsPull) {
    64  		if label.OrgID > 0 {
    65  			return issues_model.ErrOrgLabelNotExist{}
    66  		}
    67  		return issues_model.ErrRepoLabelNotExist{}
    68  	}
    69  
    70  	if err := issues_model.DeleteIssueLabel(dbCtx, issue, label, doer); err != nil {
    71  		return err
    72  	}
    73  
    74  	if err := committer.Commit(); err != nil {
    75  		return err
    76  	}
    77  
    78  	notify_service.IssueChangeLabels(ctx, doer, issue, nil, []*issues_model.Label{label})
    79  	return nil
    80  }
    81  
    82  // ReplaceLabels removes all current labels and add new labels to the issue.
    83  func ReplaceLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, labels []*issues_model.Label) error {
    84  	old, err := issues_model.GetLabelsByIssueID(ctx, issue.ID)
    85  	if err != nil {
    86  		return err
    87  	}
    88  
    89  	if err := issues_model.ReplaceIssueLabels(issue, labels, doer); err != nil {
    90  		return err
    91  	}
    92  
    93  	notify_service.IssueChangeLabels(ctx, doer, issue, labels, old)
    94  	return nil
    95  }