mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
88 lines
2.6 KiB
Go
88 lines
2.6 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package issue
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/hanzoai/git/models/db"
|
|
issues_model "github.com/hanzoai/git/models/issues"
|
|
access_model "github.com/hanzoai/git/models/perm/access"
|
|
user_model "github.com/hanzoai/git/models/user"
|
|
notify_service "github.com/hanzoai/git/services/notify"
|
|
)
|
|
|
|
// ClearLabels clears all of an issue's labels
|
|
func ClearLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User) error {
|
|
if err := issues_model.ClearIssueLabels(ctx, issue, doer); err != nil {
|
|
return err
|
|
}
|
|
|
|
notify_service.IssueClearLabels(ctx, doer, issue)
|
|
|
|
return nil
|
|
}
|
|
|
|
// AddLabel adds a new label to the issue.
|
|
func AddLabel(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, label *issues_model.Label) error {
|
|
if err := issues_model.NewIssueLabel(ctx, issue, label, doer); err != nil {
|
|
return err
|
|
}
|
|
|
|
notify_service.IssueChangeLabels(ctx, doer, issue, []*issues_model.Label{label}, nil)
|
|
return nil
|
|
}
|
|
|
|
// AddLabels adds a list of new labels to the issue.
|
|
func AddLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, labels []*issues_model.Label) error {
|
|
if err := issues_model.NewIssueLabels(ctx, issue, labels, doer); err != nil {
|
|
return err
|
|
}
|
|
|
|
notify_service.IssueChangeLabels(ctx, doer, issue, labels, nil)
|
|
return nil
|
|
}
|
|
|
|
// RemoveLabel removes a label from issue by given ID.
|
|
func RemoveLabel(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, label *issues_model.Label) error {
|
|
if err := db.WithTx(ctx, func(ctx context.Context) error {
|
|
if err := issue.LoadRepo(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
perm, err := access_model.GetDoerRepoPermission(ctx, issue.Repo, doer)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !perm.CanWriteIssuesOrPulls(issue.IsPull) {
|
|
if label.OrgID > 0 {
|
|
return issues_model.ErrOrgLabelNotExist{}
|
|
}
|
|
return issues_model.ErrRepoLabelNotExist{}
|
|
}
|
|
|
|
return issues_model.DeleteIssueLabel(ctx, issue, label, doer)
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
|
|
notify_service.IssueChangeLabels(ctx, doer, issue, nil, []*issues_model.Label{label})
|
|
return nil
|
|
}
|
|
|
|
// ReplaceLabels removes all current labels and add new labels to the issue.
|
|
func ReplaceLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, labels []*issues_model.Label) error {
|
|
old, err := issues_model.GetLabelsByIssueID(ctx, issue.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := issues_model.ReplaceIssueLabels(ctx, issue, labels, doer); err != nil {
|
|
return err
|
|
}
|
|
|
|
notify_service.IssueChangeLabels(ctx, doer, issue, labels, old)
|
|
return nil
|
|
}
|