| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // Copyright 2023 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package shared
-
- import (
- "errors"
- "net/http"
-
- actions_model "code.gitea.io/gitea/models/actions"
- "code.gitea.io/gitea/models/db"
- "code.gitea.io/gitea/modules/setting"
- api "code.gitea.io/gitea/modules/structs"
- "code.gitea.io/gitea/modules/util"
- "code.gitea.io/gitea/routers/api/v1/utils"
- "code.gitea.io/gitea/services/context"
- "code.gitea.io/gitea/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.GetLatestRunnerToken(ctx, ownerID, repoID)
- if errors.Is(err, util.ErrNotExist) || (token != nil && !token.IsActive) {
- token, err = actions_model.NewRunnerToken(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")
- }
- runners, total, err := db.FindAndCount[actions_model.ActionRunner](ctx, &actions_model.FindRunnerOptions{
- OwnerID: ownerID,
- RepoID: repoID,
- ListOptions: utils.GetListOptions(ctx),
- })
- 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(ctx, 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 {
- if errors.Is(err, util.ErrNotExist) {
- ctx.APIErrorNotFound("Runner not found")
- } else {
- ctx.APIErrorInternal(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(ctx, 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)
- }
|