mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-23 07:43:18 -05:00
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
7 changed files with 258 additions and 0 deletions
|
@ -44,3 +44,13 @@ type IssueLabelsOption struct {
|
||||||
// list of label IDs
|
// list of label IDs
|
||||||
Labels []int64 `json:"labels"`
|
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("/gitignore/templates/{name}", misc.GetGitignoreTemplateInfo)
|
||||||
m.Get("/licenses", misc.ListLicenseTemplates)
|
m.Get("/licenses", misc.ListLicenseTemplates)
|
||||||
m.Get("/licenses/{name}", misc.GetLicenseTemplateInfo)
|
m.Get("/licenses/{name}", misc.GetLicenseTemplateInfo)
|
||||||
|
m.Get("/label/templates", misc.ListLabelTemplates)
|
||||||
|
m.Get("/label/templates/{name}", misc.GetLabelTemplate)
|
||||||
m.Group("/settings", func() {
|
m.Group("/settings", func() {
|
||||||
m.Get("/ui", settings.GetGeneralUISettings)
|
m.Get("/ui", settings.GetGeneralUISettings)
|
||||||
m.Get("/api", settings.GetGeneralAPISettings)
|
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
|
// in:body
|
||||||
Body []string `json:"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"
|
issues_model "code.gitea.io/gitea/models/issues"
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
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/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
api "code.gitea.io/gitea/modules/structs"
|
api "code.gitea.io/gitea/modules/structs"
|
||||||
|
@ -238,3 +239,24 @@ func ToAPIMilestone(m *issues_model.Milestone) *api.Milestone {
|
||||||
}
|
}
|
||||||
return apiMilestone
|
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": {
|
"/licenses": {
|
||||||
"get": {
|
"get": {
|
||||||
"produces": [
|
"produces": [
|
||||||
|
@ -18858,6 +18904,31 @@
|
||||||
},
|
},
|
||||||
"x-go-package": "code.gitea.io/gitea/modules/structs"
|
"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": {
|
"LicenseTemplateInfo": {
|
||||||
"description": "LicensesInfo contains information about a License",
|
"description": "LicensesInfo contains information about a License",
|
||||||
"type": "object",
|
"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": {
|
"LanguageStatistics": {
|
||||||
"description": "LanguageStatistics",
|
"description": "LanguageStatistics",
|
||||||
"schema": {
|
"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