Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calculate label URL on API #16186

Merged
merged 12 commits into from
Sep 10, 2021
33 changes: 28 additions & 5 deletions modules/convert/issue.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
package convert

import (
"fmt"
"strings"

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
)

Expand All @@ -25,6 +28,9 @@ func ToAPIIssue(issue *models.Issue) *api.Issue {
if err := issue.LoadRepo(); err != nil {
return &api.Issue{}
}
if err := issue.Repo.GetOwner(); err != nil {
Copy link
Member

@delvh delvh Sep 10, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think err := issue.Repo.GetOwner(); is misleading, as this implies that err would be the owner.
After what I have seen, this function should most likely be renamed to LoadOwner, because that's what it does.
Returning only an error makes much more sense then.
An alternative for naming it would be InitializeOwner() but that seems to conflict with the current naming scheme.
When renaming it, its function comment should be changed as well as that is simply incorrect by now.
Could it be that that is a leftover from when the owner was initialized eagerly?

return &api.Issue{}
}

apiIssue := &api.Issue{
ID: issue.ID,
Expand All @@ -35,7 +41,7 @@ func ToAPIIssue(issue *models.Issue) *api.Issue {
Title: issue.Title,
Body: issue.Content,
Ref: issue.Ref,
Labels: ToLabelList(issue.Labels),
Labels: ToLabelList(issue.Labels, issue.Repo, issue.Repo.Owner),
State: issue.State(),
IsLocked: issue.IsLocked,
Comments: issue.NumComments,
Expand Down Expand Up @@ -168,20 +174,37 @@ func ToTrackedTimeList(tl models.TrackedTimeList) api.TrackedTimeList {
}

// ToLabel converts Label to API format
func ToLabel(label *models.Label) *api.Label {
return &api.Label{
func ToLabel(label *models.Label, repo *models.Repository, org *models.User) *api.Label {
result := &api.Label{
ID: label.ID,
Name: label.Name,
Color: strings.TrimLeft(label.Color, "#"),
Description: label.Description,
}

// calculate URL
if label.BelongsToRepo() && repo != nil {
if repo != nil {
result.URL = fmt.Sprintf("%s/labels/%d", repo.APIURL(), label.ID)
} else {
log.Error("ToLabel did not get repo to calculate url for label with id '%d'", label.ID)
}
} else { // BelongsToOrg
if org != nil {
result.URL = fmt.Sprintf("%sapi/v1/orgs/%s/labels/%d", setting.AppURL, org.Name, label.ID)
} else {
log.Error("ToLabel did not get org to calculate url for label with id '%d'", label.ID)
}
}

return result
}

// ToLabelList converts list of Label to API format
func ToLabelList(labels []*models.Label) []*api.Label {
func ToLabelList(labels []*models.Label, repo *models.Repository, org *models.User) []*api.Label {
result := make([]*api.Label, len(labels))
for i := range labels {
result[i] = ToLabel(labels[i])
result[i] = ToLabel(labels[i], repo, org)
}
return result
}
Expand Down
6 changes: 5 additions & 1 deletion modules/convert/issue_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
package convert

import (
"fmt"
"testing"
"time"

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil"

Expand All @@ -18,11 +20,13 @@ import (
func TestLabel_ToLabel(t *testing.T) {
assert.NoError(t, models.PrepareTestDatabase())
label := models.AssertExistsAndLoadBean(t, &models.Label{ID: 1}).(*models.Label)
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: label.RepoID}).(*models.Repository)
assert.Equal(t, &api.Label{
ID: label.ID,
Name: label.Name,
Color: "abcdef",
}, ToLabel(label))
URL: fmt.Sprintf("%sapi/v1/repos/user2/repo1/labels/%d", setting.AppURL, label.ID),
}, ToLabel(label, repo, nil))
}

func TestMilestone_APIFormat(t *testing.T) {
Expand Down
10 changes: 6 additions & 4 deletions routers/api/v1/org/label.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func ListLabels(ctx *context.APIContext) {
}

ctx.SetTotalCountHeader(count)
ctx.JSON(http.StatusOK, convert.ToLabelList(labels))
ctx.JSON(http.StatusOK, convert.ToLabelList(labels, nil, ctx.Org.Organization))
}

// CreateLabel create a label for a repository
Expand Down Expand Up @@ -103,7 +103,8 @@ func CreateLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "NewLabel", err)
return
}
ctx.JSON(http.StatusCreated, convert.ToLabel(label))

ctx.JSON(http.StatusCreated, convert.ToLabel(label, nil, ctx.Org.Organization))
}

// GetLabel get label by organization and label id
Expand Down Expand Up @@ -148,7 +149,7 @@ func GetLabel(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, convert.ToLabel(label))
ctx.JSON(http.StatusOK, convert.ToLabel(label, nil, ctx.Org.Organization))
}

// EditLabel modify a label for an Organization
Expand Down Expand Up @@ -212,7 +213,8 @@ func EditLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "UpdateLabel", err)
return
}
ctx.JSON(http.StatusOK, convert.ToLabel(label))

ctx.JSON(http.StatusOK, convert.ToLabel(label, nil, ctx.Org.Organization))
}

// DeleteLabel delete a label for an organization
Expand Down
6 changes: 3 additions & 3 deletions routers/api/v1/repo/issue_label.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func ListIssueLabels(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, convert.ToLabelList(issue.Labels))
ctx.JSON(http.StatusOK, convert.ToLabelList(issue.Labels, ctx.Repo.Repository, ctx.Repo.Owner))
}

// AddIssueLabels add labels for an issue
Expand Down Expand Up @@ -117,7 +117,7 @@ func AddIssueLabels(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, convert.ToLabelList(labels))
ctx.JSON(http.StatusOK, convert.ToLabelList(labels, ctx.Repo.Repository, ctx.Repo.Owner))
}

// DeleteIssueLabel delete a label for an issue
Expand Down Expand Up @@ -243,7 +243,7 @@ func ReplaceIssueLabels(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, convert.ToLabelList(labels))
ctx.JSON(http.StatusOK, convert.ToLabelList(labels, ctx.Repo.Repository, ctx.Repo.Owner))
}

// ClearIssueLabels delete all the labels for an issue
Expand Down
10 changes: 6 additions & 4 deletions routers/api/v1/repo/label.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func ListLabels(ctx *context.APIContext) {
}

ctx.SetTotalCountHeader(count)
ctx.JSON(http.StatusOK, convert.ToLabelList(labels))
ctx.JSON(http.StatusOK, convert.ToLabelList(labels, ctx.Repo.Repository, nil))
}

// GetLabel get label by repository and label id
Expand Down Expand Up @@ -112,7 +112,7 @@ func GetLabel(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, convert.ToLabel(label))
ctx.JSON(http.StatusOK, convert.ToLabel(label, ctx.Repo.Repository, nil))
}

// CreateLabel create a label for a repository
Expand Down Expand Up @@ -165,7 +165,8 @@ func CreateLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "NewLabel", err)
return
}
ctx.JSON(http.StatusCreated, convert.ToLabel(label))

ctx.JSON(http.StatusCreated, convert.ToLabel(label, ctx.Repo.Repository, nil))
}

// EditLabel modify a label for a repository
Expand Down Expand Up @@ -235,7 +236,8 @@ func EditLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "UpdateLabel", err)
return
}
ctx.JSON(http.StatusOK, convert.ToLabel(label))

ctx.JSON(http.StatusOK, convert.ToLabel(label, ctx.Repo.Repository, nil))
}

// DeleteLabel delete a label for a repository
Expand Down