Files
woodpecker/server/api/repo_parameter.go
Arthur 7e960b4a2b Added support for managing manual pipeline parameters
Introduced backend API endpoints, database operations, and web UI components for creating, updating, listing, and deleting manual pipeline parameters. This update includes tests for datastore functions, integration with the Vue.js web interface, and mock implementation for parameter-related methods.
2025-10-12 15:03:58 +02:00

153 lines
4.2 KiB
Go

package api
import (
"errors"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"go.woodpecker-ci.org/woodpecker/v3/server"
"go.woodpecker-ci.org/woodpecker/v3/server/model"
"go.woodpecker-ci.org/woodpecker/v3/server/router/middleware/session"
"go.woodpecker-ci.org/woodpecker/v3/server/store/types"
)
// GetParameter returns a repository parameter by ID.
func GetParameter(c *gin.Context) {
repo := session.Repo(c)
paramID, err := strconv.ParseInt(c.Param("parameter"), 10, 64)
if err != nil {
c.String(http.StatusBadRequest, "Invalid parameter ID")
return
}
parameterService := server.Config.Services.Manager.ParameterServiceFromRepo(repo)
parameter, err := parameterService.ParameterFindByID(repo, paramID)
if err != nil {
handleDBError(c, err)
return
}
c.JSON(http.StatusOK, parameter)
}
// PostParameter persists a parameter.
func PostParameter(c *gin.Context) {
repo := session.Repo(c)
in := new(model.Parameter)
if err := c.Bind(in); err != nil {
c.String(http.StatusBadRequest, "Error parsing parameter. %s", err)
return
}
in.RepoID = repo.ID
if err := in.Validate(); err != nil {
c.String(http.StatusBadRequest, "Error validating parameter. %s", err)
return
}
parameterService := server.Config.Services.Manager.ParameterServiceFromRepo(repo)
// Check if parameter with same name and branch already exists
existing, err := parameterService.ParameterFindByNameAndBranch(repo, in.Name, in.Branch)
if err != nil && !errors.Is(err, types.RecordNotExist) {
handleDBError(c, err)
return
}
if existing != nil && existing.ID != 0 {
c.String(http.StatusConflict, "Parameter with name '%s' already exists for branch '%s': existing: %d, new: %d", in.Name, in.Branch, existing.ID, in.ID)
return
}
err = parameterService.ParameterCreate(repo, in)
if err != nil {
handleDBError(c, err)
return
}
parameter, err := parameterService.ParameterFind(repo, in.Name)
c.JSON(http.StatusOK, parameter)
}
// PatchParameter updates an existing parameter by ID
func PatchParameter(c *gin.Context) {
repo := session.Repo(c)
paramID, err := strconv.ParseInt(c.Param("parameter"), 10, 64)
if err != nil {
c.String(http.StatusBadRequest, "Invalid parameter ID")
return
}
in := new(model.Parameter)
if err := c.Bind(in); err != nil {
c.String(http.StatusBadRequest, "Error parsing parameter. %s", err)
return
}
in.RepoID = repo.ID
in.ID = paramID
if err := in.Validate(); err != nil {
c.String(http.StatusBadRequest, "Error validating parameter. %s", err)
return
}
parameterService := server.Config.Services.Manager.ParameterServiceFromRepo(repo)
// Get existing parameter to check if name/branch changed
existing, err := parameterService.ParameterFindByID(repo, paramID)
if err != nil {
handleDBError(c, err)
return
}
// If name or branch changed, check for conflicts
if existing.Name != in.Name || existing.Branch != in.Branch {
conflict, err := parameterService.ParameterFindByNameAndBranch(repo, in.Name, in.Branch)
if err != nil && !errors.Is(err, types.RecordNotExist) {
handleDBError(c, err)
return
}
if conflict != nil && conflict.ID != 0 && conflict.ID != paramID {
c.String(http.StatusConflict, "Parameter with name '%s' already exists for branch '%s'", in.Name, in.Branch)
return
}
}
err = parameterService.ParameterUpdate(repo, in)
if err != nil {
handleDBError(c, err)
return
}
parameter, err := parameterService.ParameterFindByID(repo, paramID)
c.JSON(http.StatusOK, parameter)
}
// GetParameterList returns all repository parameters.
func GetParameterList(c *gin.Context) {
repo := session.Repo(c)
parameterService := server.Config.Services.Manager.ParameterServiceFromRepo(repo)
list, err := parameterService.ParameterList(repo)
if err != nil {
handleDBError(c, err)
return
}
c.JSON(http.StatusOK, list)
}
// DeleteParameter deletes a parameter by ID.
func DeleteParameter(c *gin.Context) {
repo := session.Repo(c)
paramID, err := strconv.ParseInt(c.Param("parameter"), 10, 64)
if err != nil {
c.String(http.StatusBadRequest, "Invalid parameter ID")
return
}
parameterService := server.Config.Services.Manager.ParameterServiceFromRepo(repo)
if err := parameterService.ParameterDeleteByID(repo, paramID); err != nil {
handleDBError(c, err)
return
}
c.Status(http.StatusNoContent)
}