mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-15 07:25:24 +02:00
Collection of small, behaviour-preserving cleanups in the Actions code. - Fix log and error prefixes that named non-existent or wrong functions, and wrap errors with `%w` so `errors.Is` keeps working. - Remove unused code. - Rely on `ctx.ServerError` / `ctx.APIErrorAuto`, which already map `util.ErrNotExist` and friends, instead of equivalent hand-written switches. - Load runs referenced by commit statuses with one query instead of one per run (used on every PR view); the result order is now stable. - Encode an event's payload once instead of up to three times. - Share the duplicated runner-token "get or create" logic and the "notify and emit" call pair. - Simplify `ToActionArtifact` / `ToActionRunner` signatures. --------- Signed-off-by: bircni <bircni@icloud.com> Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
142 lines
4.3 KiB
Go
142 lines
4.3 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package shared
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
actions_model "gitea.dev/models/actions"
|
|
"gitea.dev/models/db"
|
|
"gitea.dev/modules/setting"
|
|
api "gitea.dev/modules/structs"
|
|
"gitea.dev/modules/web"
|
|
"gitea.dev/routers/api/v1/utils"
|
|
"gitea.dev/services/context"
|
|
"gitea.dev/services/convert"
|
|
)
|
|
|
|
// RegistrationToken is response related to registration token
|
|
// swagger:response RegistrationToken
|
|
type RegistrationToken struct {
|
|
Token string `json:"token"`
|
|
}
|
|
|
|
func GetRegistrationToken(ctx *context.APIContext, ownerID, repoID int64) {
|
|
token, err := actions_model.GetOrCreateActiveRunnerToken(ctx, ownerID, repoID)
|
|
if err != nil {
|
|
ctx.APIErrorInternal(err)
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, RegistrationToken{Token: token.Token})
|
|
}
|
|
|
|
// ListRunners lists runners for api route validated ownerID and repoID
|
|
// ownerID == 0 and repoID == 0 means all runners including global runners, does not appear in sql where clause
|
|
// ownerID == 0 and repoID != 0 means all runners for the given repo
|
|
// ownerID != 0 and repoID == 0 means all runners for the given user/org
|
|
// ownerID != 0 and repoID != 0 undefined behavior
|
|
// Access rights are checked at the API route level
|
|
func ListRunners(ctx *context.APIContext, ownerID, repoID int64) {
|
|
if ownerID != 0 && repoID != 0 {
|
|
setting.PanicInDevOrTesting("ownerID and repoID should not be both set")
|
|
}
|
|
opts := &actions_model.FindRunnerOptions{
|
|
OwnerID: ownerID,
|
|
RepoID: repoID,
|
|
ListOptions: utils.GetListOptions(ctx),
|
|
}
|
|
opts.IsDisabled = ctx.FormOptionalBool("disabled")
|
|
runners, total, err := db.FindAndCount[actions_model.ActionRunner](ctx, opts)
|
|
if err != nil {
|
|
ctx.APIErrorInternal(err)
|
|
return
|
|
}
|
|
|
|
res := new(api.ActionRunnersResponse)
|
|
res.TotalCount = total
|
|
|
|
res.Entries = make([]*api.ActionRunner, len(runners))
|
|
for i, runner := range runners {
|
|
res.Entries[i] = convert.ToActionRunner(runner)
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, &res)
|
|
}
|
|
|
|
func getRunnerByID(ctx *context.APIContext, ownerID, repoID, runnerID int64) (*actions_model.ActionRunner, bool) {
|
|
if ownerID != 0 && repoID != 0 {
|
|
setting.PanicInDevOrTesting("ownerID and repoID should not be both set")
|
|
}
|
|
|
|
runner, err := actions_model.GetRunnerByID(ctx, runnerID)
|
|
if err != nil {
|
|
ctx.APIErrorAuto(err)
|
|
return nil, false
|
|
}
|
|
|
|
if !runner.EditableInContext(ownerID, repoID) {
|
|
ctx.APIErrorNotFound("No permission to access this runner")
|
|
return nil, false
|
|
}
|
|
return runner, true
|
|
}
|
|
|
|
// GetRunner get the runner for api route validated ownerID and repoID
|
|
// ownerID == 0 and repoID == 0 means any runner including global runners
|
|
// ownerID == 0 and repoID != 0 means any runner for the given repo
|
|
// ownerID != 0 and repoID == 0 means any runner for the given user/org
|
|
// ownerID != 0 and repoID != 0 undefined behavior
|
|
// Access rights are checked at the API route level
|
|
func GetRunner(ctx *context.APIContext, ownerID, repoID, runnerID int64) {
|
|
if ownerID != 0 && repoID != 0 {
|
|
setting.PanicInDevOrTesting("ownerID and repoID should not be both set")
|
|
}
|
|
runner, ok := getRunnerByID(ctx, ownerID, repoID, runnerID)
|
|
if !ok {
|
|
return
|
|
}
|
|
ctx.JSON(http.StatusOK, convert.ToActionRunner(runner))
|
|
}
|
|
|
|
// DeleteRunner deletes the runner for api route validated ownerID and repoID
|
|
// ownerID == 0 and repoID == 0 means any runner including global runners
|
|
// ownerID == 0 and repoID != 0 means any runner for the given repo
|
|
// ownerID != 0 and repoID == 0 means any runner for the given user/org
|
|
// ownerID != 0 and repoID != 0 undefined behavior
|
|
// Access rights are checked at the API route level
|
|
func DeleteRunner(ctx *context.APIContext, ownerID, repoID, runnerID int64) {
|
|
runner, ok := getRunnerByID(ctx, ownerID, repoID, runnerID)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
err := actions_model.DeleteRunner(ctx, runner.ID)
|
|
if err != nil {
|
|
ctx.APIErrorInternal(err)
|
|
return
|
|
}
|
|
ctx.Status(http.StatusNoContent)
|
|
}
|
|
|
|
func UpdateRunner(ctx *context.APIContext, ownerID, repoID, runnerID int64) {
|
|
runner, ok := getRunnerByID(ctx, ownerID, repoID, runnerID)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
form := web.GetForm[*api.EditActionRunnerOption](ctx)
|
|
if form.Disabled == nil {
|
|
ctx.APIError(http.StatusUnprocessableEntity, "[Disabled]: Required")
|
|
return
|
|
}
|
|
|
|
if err := actions_model.SetRunnerDisabled(ctx, runner, *form.Disabled); err != nil {
|
|
ctx.APIErrorInternal(err)
|
|
return
|
|
}
|
|
|
|
GetRunner(ctx, ownerID, repoID, runnerID)
|
|
}
|