1
0
Fork 0

Calculate label URL on API (#16186)

close #8028
This commit is contained in:
6543 2021-09-10 18:03:16 +02:00 committed by GitHub
parent 9a938dc298
commit 51578d6418
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 17 deletions

View file

@ -5,9 +5,12 @@
package convert package convert
import ( import (
"fmt"
"strings" "strings"
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs" api "code.gitea.io/gitea/modules/structs"
) )
@ -25,6 +28,9 @@ func ToAPIIssue(issue *models.Issue) *api.Issue {
if err := issue.LoadRepo(); err != nil { if err := issue.LoadRepo(); err != nil {
return &api.Issue{} return &api.Issue{}
} }
if err := issue.Repo.GetOwner(); err != nil {
return &api.Issue{}
}
apiIssue := &api.Issue{ apiIssue := &api.Issue{
ID: issue.ID, ID: issue.ID,
@ -35,7 +41,7 @@ func ToAPIIssue(issue *models.Issue) *api.Issue {
Title: issue.Title, Title: issue.Title,
Body: issue.Content, Body: issue.Content,
Ref: issue.Ref, Ref: issue.Ref,
Labels: ToLabelList(issue.Labels), Labels: ToLabelList(issue.Labels, issue.Repo, issue.Repo.Owner),
State: issue.State(), State: issue.State(),
IsLocked: issue.IsLocked, IsLocked: issue.IsLocked,
Comments: issue.NumComments, Comments: issue.NumComments,
@ -168,20 +174,37 @@ func ToTrackedTimeList(tl models.TrackedTimeList) api.TrackedTimeList {
} }
// ToLabel converts Label to API format // ToLabel converts Label to API format
func ToLabel(label *models.Label) *api.Label { func ToLabel(label *models.Label, repo *models.Repository, org *models.User) *api.Label {
return &api.Label{ result := &api.Label{
ID: label.ID, ID: label.ID,
Name: label.Name, Name: label.Name,
Color: strings.TrimLeft(label.Color, "#"), Color: strings.TrimLeft(label.Color, "#"),
Description: label.Description, 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 // 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)) result := make([]*api.Label, len(labels))
for i := range labels { for i := range labels {
result[i] = ToLabel(labels[i]) result[i] = ToLabel(labels[i], repo, org)
} }
return result return result
} }

View file

@ -5,10 +5,12 @@
package convert package convert
import ( import (
"fmt"
"testing" "testing"
"time" "time"
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs" api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/timeutil"
@ -18,11 +20,13 @@ import (
func TestLabel_ToLabel(t *testing.T) { func TestLabel_ToLabel(t *testing.T) {
assert.NoError(t, models.PrepareTestDatabase()) assert.NoError(t, models.PrepareTestDatabase())
label := models.AssertExistsAndLoadBean(t, &models.Label{ID: 1}).(*models.Label) 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{ assert.Equal(t, &api.Label{
ID: label.ID, ID: label.ID,
Name: label.Name, Name: label.Name,
Color: "abcdef", 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) { func TestMilestone_APIFormat(t *testing.T) {

View file

@ -56,7 +56,7 @@ func ListLabels(ctx *context.APIContext) {
} }
ctx.SetTotalCountHeader(count) 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 // CreateLabel create a label for a repository
@ -103,7 +103,8 @@ func CreateLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "NewLabel", err) ctx.Error(http.StatusInternalServerError, "NewLabel", err)
return 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 // GetLabel get label by organization and label id
@ -148,7 +149,7 @@ func GetLabel(ctx *context.APIContext) {
return 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 // EditLabel modify a label for an Organization
@ -212,7 +213,8 @@ func EditLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "UpdateLabel", err) ctx.Error(http.StatusInternalServerError, "UpdateLabel", err)
return 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 // DeleteLabel delete a label for an organization

View file

@ -61,7 +61,7 @@ func ListIssueLabels(ctx *context.APIContext) {
return 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 // AddIssueLabels add labels for an issue
@ -117,7 +117,7 @@ func AddIssueLabels(ctx *context.APIContext) {
return 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 // DeleteIssueLabel delete a label for an issue
@ -243,7 +243,7 @@ func ReplaceIssueLabels(ctx *context.APIContext) {
return 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 // ClearIssueLabels delete all the labels for an issue

View file

@ -62,7 +62,7 @@ func ListLabels(ctx *context.APIContext) {
} }
ctx.SetTotalCountHeader(count) 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 // GetLabel get label by repository and label id
@ -112,7 +112,7 @@ func GetLabel(ctx *context.APIContext) {
return 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 // CreateLabel create a label for a repository
@ -165,7 +165,8 @@ func CreateLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "NewLabel", err) ctx.Error(http.StatusInternalServerError, "NewLabel", err)
return 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 // EditLabel modify a label for a repository
@ -235,7 +236,8 @@ func EditLabel(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "UpdateLabel", err) ctx.Error(http.StatusInternalServerError, "UpdateLabel", err)
return 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 // DeleteLabel delete a label for a repository