package repo
import (
+ "fmt"
"net/http"
+ "reflect"
issues_model "code.gitea.io/gitea/models/issues"
api "code.gitea.io/gitea/modules/structs"
return nil, nil, err
}
- labels, err := issues_model.GetLabelsByIDs(ctx, form.Labels, "id", "repo_id", "org_id", "name", "exclusive")
+ var (
+ labelIDs []int64
+ labelNames []string
+ )
+ for _, label := range form.Labels {
+ rv := reflect.ValueOf(label)
+ switch rv.Kind() {
+ case reflect.Float64:
+ labelIDs = append(labelIDs, int64(rv.Float()))
+ case reflect.String:
+ labelNames = append(labelNames, rv.String())
+ }
+ }
+ if len(labelIDs) > 0 && len(labelNames) > 0 {
+ ctx.Error(http.StatusBadRequest, "InvalidLabels", "labels should be an array of strings or integers")
+ return nil, nil, fmt.Errorf("invalid labels")
+ }
+ if len(labelNames) > 0 {
+ labelIDs, err = issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "GetLabelIDsInRepoByNames", err)
+ return nil, nil, err
+ }
+ }
+
+ labels, err := issues_model.GetLabelsByIDs(ctx, labelIDs, "id", "repo_id", "org_id", "name", "exclusive")
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetLabelsByIDs", err)
return nil, nil, err
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
repo.OwnerName, repo.Name, issue.Index)
req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{
- Labels: []int64{1, 2},
+ Labels: []any{1, 2},
}).AddTokenAuth(token)
resp := MakeRequest(t, req, http.StatusOK)
var apiLabels []*api.Label
unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: 2})
}
+func TestAPIAddIssueLabelsWithLabelNames(t *testing.T) {
+ assert.NoError(t, unittest.LoadFixtures())
+
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+ issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
+ owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
+
+ session := loginUser(t, owner.Name)
+ token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
+ urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
+ repo.OwnerName, repo.Name, issue.Index)
+ req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{
+ Labels: []any{"label1", "label2"},
+ }).AddTokenAuth(token)
+ resp := MakeRequest(t, req, http.StatusOK)
+ var apiLabels []*api.Label
+ DecodeJSON(t, resp, &apiLabels)
+ assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID}))
+
+ var apiLabelNames []string
+ for _, label := range apiLabels {
+ apiLabelNames = append(apiLabelNames, label.Name)
+ }
+ assert.ElementsMatch(t, apiLabelNames, []string{"label1", "label2"})
+}
+
func TestAPIReplaceIssueLabels(t *testing.T) {
assert.NoError(t, unittest.LoadFixtures())
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
owner.Name, repo.Name, issue.Index)
req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{
- Labels: []int64{label.ID},
+ Labels: []any{label.ID},
}).AddTokenAuth(token)
resp := MakeRequest(t, req, http.StatusOK)
var apiLabels []*api.Label
unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID})
}
+func TestAPIReplaceIssueLabelsWithLabelNames(t *testing.T) {
+ assert.NoError(t, unittest.LoadFixtures())
+
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+ issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
+ label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID})
+ owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
+
+ session := loginUser(t, owner.Name)
+ token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
+ urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
+ owner.Name, repo.Name, issue.Index)
+ req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{
+ Labels: []any{label.Name},
+ }).AddTokenAuth(token)
+ resp := MakeRequest(t, req, http.StatusOK)
+ var apiLabels []*api.Label
+ DecodeJSON(t, resp, &apiLabels)
+ if assert.Len(t, apiLabels, 1) {
+ assert.EqualValues(t, label.Name, apiLabels[0].Name)
+ }
+}
+
func TestAPIModifyOrgLabels(t *testing.T) {
assert.NoError(t, unittest.LoadFixtures())