mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	* previously deleting an already deleted runner returned http 500 * previously any database error for the get endpoint was http 404 and never 500
		
			
				
	
	
		
			128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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)
 | |
| }
 |