Add API for Label templates (#24602)
This adds API that allows getting the Label templates of the Gitea Instance
This commit is contained in:
parent
abcf5a7b5e
commit
25dc1556cd
|
@ -44,3 +44,13 @@ type IssueLabelsOption struct {
|
|||
// list of label IDs
|
||||
Labels []int64 `json:"labels"`
|
||||
}
|
||||
|
||||
// LabelTemplate info of a Label template
|
||||
type LabelTemplate struct {
|
||||
Name string `json:"name"`
|
||||
// example: false
|
||||
Exclusive bool `json:"exclusive"`
|
||||
// example: 00aabb
|
||||
Color string `json:"color"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
|
|
@ -723,6 +723,8 @@ func Routes(ctx gocontext.Context) *web.Route {
|
|||
m.Get("/gitignore/templates/{name}", misc.GetGitignoreTemplateInfo)
|
||||
m.Get("/licenses", misc.ListLicenseTemplates)
|
||||
m.Get("/licenses/{name}", misc.GetLicenseTemplateInfo)
|
||||
m.Get("/label/templates", misc.ListLabelTemplates)
|
||||
m.Get("/label/templates/{name}", misc.GetLabelTemplate)
|
||||
m.Group("/settings", func() {
|
||||
m.Get("/ui", settings.GetGeneralUISettings)
|
||||
m.Get("/api", settings.GetGeneralAPISettings)
|
||||
|
|
60
routers/api/v1/misc/label_templates.go
Normal file
60
routers/api/v1/misc/label_templates.go
Normal file
|
@ -0,0 +1,60 @@
|
|||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package misc
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"code.gitea.io/gitea/modules/context"
|
||||
repo_module "code.gitea.io/gitea/modules/repository"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
"code.gitea.io/gitea/services/convert"
|
||||
)
|
||||
|
||||
// Shows a list of all Label templates
|
||||
func ListLabelTemplates(ctx *context.APIContext) {
|
||||
// swagger:operation GET /label/templates miscellaneous listLabelTemplates
|
||||
// ---
|
||||
// summary: Returns a list of all label templates
|
||||
// produces:
|
||||
// - application/json
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/LabelTemplateList"
|
||||
result := make([]string, len(repo_module.LabelTemplateFiles))
|
||||
for i := range repo_module.LabelTemplateFiles {
|
||||
result[i] = repo_module.LabelTemplateFiles[i].DisplayName
|
||||
}
|
||||
|
||||
ctx.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// Shows all labels in a template
|
||||
func GetLabelTemplate(ctx *context.APIContext) {
|
||||
// swagger:operation GET /label/templates/{name} miscellaneous getLabelTemplateInfo
|
||||
// ---
|
||||
// summary: Returns all labels in a template
|
||||
// produces:
|
||||
// - application/json
|
||||
// parameters:
|
||||
// - name: name
|
||||
// in: path
|
||||
// description: name of the template
|
||||
// type: string
|
||||
// required: true
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/LabelTemplateInfo"
|
||||
// "404":
|
||||
// "$ref": "#/responses/notFound"
|
||||
name := util.PathJoinRelX(ctx.Params("name"))
|
||||
|
||||
labels, err := repo_module.LoadTemplateLabelsByDisplayName(name)
|
||||
if err != nil {
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
|
||||
ctx.JSON(http.StatusOK, convert.ToLabelTemplateList(labels))
|
||||
}
|
|
@ -48,3 +48,17 @@ type swaggerResponseStringSlice struct {
|
|||
// in:body
|
||||
Body []string `json:"body"`
|
||||
}
|
||||
|
||||
// LabelTemplateList
|
||||
// swagger:response LabelTemplateList
|
||||
type swaggerResponseLabelTemplateList struct {
|
||||
// in:body
|
||||
Body []string `json:"body"`
|
||||
}
|
||||
|
||||
// LabelTemplateInfo
|
||||
// swagger:response LabelTemplateInfo
|
||||
type swaggerResponseLabelTemplateInfo struct {
|
||||
// in:body
|
||||
Body []api.LabelTemplate `json:"body"`
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ import (
|
|||
issues_model "code.gitea.io/gitea/models/issues"
|
||||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/label"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
|
@ -238,3 +239,24 @@ func ToAPIMilestone(m *issues_model.Milestone) *api.Milestone {
|
|||
}
|
||||
return apiMilestone
|
||||
}
|
||||
|
||||
// ToLabelTemplate converts Label to API format
|
||||
func ToLabelTemplate(label *label.Label) *api.LabelTemplate {
|
||||
result := &api.LabelTemplate{
|
||||
Name: label.Name,
|
||||
Exclusive: label.Exclusive,
|
||||
Color: strings.TrimLeft(label.Color, "#"),
|
||||
Description: label.Description,
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// ToLabelTemplateList converts list of Label to API format
|
||||
func ToLabelTemplateList(labels []*label.Label) []*api.LabelTemplate {
|
||||
result := make([]*api.LabelTemplate, len(labels))
|
||||
for i := range labels {
|
||||
result[i] = ToLabelTemplate(labels[i])
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
|
89
templates/swagger/v1_json.tmpl
generated
89
templates/swagger/v1_json.tmpl
generated
|
@ -929,6 +929,52 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"/label/templates": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"miscellaneous"
|
||||
],
|
||||
"summary": "Returns a list of all label templates",
|
||||
"operationId": "listLabelTemplates",
|
||||
"responses": {
|
||||
"200": {
|
||||
"$ref": "#/responses/LabelTemplateList"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/label/templates/{name}": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"miscellaneous"
|
||||
],
|
||||
"summary": "Returns all labels in a template",
|
||||
"operationId": "getLabelTemplateInfo",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "name of the template",
|
||||
"name": "name",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"$ref": "#/responses/LabelTemplateInfo"
|
||||
},
|
||||
"404": {
|
||||
"$ref": "#/responses/notFound"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/licenses": {
|
||||
"get": {
|
||||
"produces": [
|
||||
|
@ -18858,6 +18904,31 @@
|
|||
},
|
||||
"x-go-package": "code.gitea.io/gitea/modules/structs"
|
||||
},
|
||||
"LabelTemplate": {
|
||||
"description": "LabelTemplate info of a Label template",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"color": {
|
||||
"type": "string",
|
||||
"x-go-name": "Color",
|
||||
"example": "00aabb"
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"x-go-name": "Description"
|
||||
},
|
||||
"exclusive": {
|
||||
"type": "boolean",
|
||||
"x-go-name": "Exclusive",
|
||||
"example": false
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"x-go-name": "Name"
|
||||
}
|
||||
},
|
||||
"x-go-package": "code.gitea.io/gitea/modules/structs"
|
||||
},
|
||||
"LicenseTemplateInfo": {
|
||||
"description": "LicensesInfo contains information about a License",
|
||||
"type": "object",
|
||||
|
@ -21797,6 +21868,24 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"LabelTemplateInfo": {
|
||||
"description": "LabelTemplateInfo",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/LabelTemplate"
|
||||
}
|
||||
}
|
||||
},
|
||||
"LabelTemplateList": {
|
||||
"description": "LabelTemplateList",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"LanguageStatistics": {
|
||||
"description": "LanguageStatistics",
|
||||
"schema": {
|
||||
|
|
61
tests/integration/api_label_templates_test.go
Normal file
61
tests/integration/api_label_templates_test.go
Normal file
|
@ -0,0 +1,61 @@
|
|||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package integration
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
repo_module "code.gitea.io/gitea/modules/repository"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/tests"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestAPIListLabelTemplates(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
req := NewRequest(t, "GET", "/api/v1/label/templates")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
var templateList []string
|
||||
DecodeJSON(t, resp, &templateList)
|
||||
|
||||
for i := range repo_module.LabelTemplateFiles {
|
||||
assert.Equal(t, repo_module.LabelTemplateFiles[i].DisplayName, templateList[i])
|
||||
}
|
||||
}
|
||||
|
||||
func TestAPIGetLabelTemplateInfo(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
// If Gitea has for some reason no Label templates, we need to skip this test
|
||||
if len(repo_module.LabelTemplateFiles) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
// Use the first template for the test
|
||||
templateName := repo_module.LabelTemplateFiles[0].DisplayName
|
||||
|
||||
urlStr := fmt.Sprintf("/api/v1/label/templates/%s", url.PathEscape(templateName))
|
||||
req := NewRequest(t, "GET", urlStr)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
var templateInfo []api.LabelTemplate
|
||||
DecodeJSON(t, resp, &templateInfo)
|
||||
|
||||
labels, err := repo_module.LoadTemplateLabelsByDisplayName(templateName)
|
||||
assert.NoError(t, err)
|
||||
|
||||
for i := range labels {
|
||||
assert.Equal(t, strings.TrimLeft(labels[i].Color, "#"), templateInfo[i].Color)
|
||||
assert.Equal(t, labels[i].Description, templateInfo[i].Description)
|
||||
assert.Equal(t, labels[i].Exclusive, templateInfo[i].Exclusive)
|
||||
assert.Equal(t, labels[i].Name, templateInfo[i].Name)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue