// 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) } // 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, err := actions_model.GetRunnerByID(ctx, runnerID) if err != nil { ctx.APIErrorNotFound(err) return } if !runner.EditableInContext(ownerID, repoID) { ctx.APIErrorNotFound("No permission to get this runner") 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) { 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.APIErrorInternal(err) return } if !runner.EditableInContext(ownerID, repoID) { ctx.APIErrorNotFound("No permission to delete this runner") return } err = actions_model.DeleteRunner(ctx, runner.ID) if err != nil { ctx.APIErrorInternal(err) return } ctx.Status(http.StatusNoContent) }