Semaphore/api/runners.go
Denis Gukov 4996728daa
project runners (#2547)
* feat: add feature flag

* feat(runners): pro runners ui

* feat(runner): api for project level

* fix(ui): key of list

* feat(be): add mocks for project runners

* feat: pro alert

* feat(pro): upgrade button

* feat(pro): upgrade button

* feat(pro): icon and color

* feat(pro): change color
2024-11-17 05:47:04 -05:00

150 lines
3.0 KiB
Go

package api
import (
"github.com/semaphoreui/semaphore/api/helpers"
"github.com/semaphoreui/semaphore/db"
log "github.com/sirupsen/logrus"
"net/http"
"github.com/gorilla/context"
)
func getGlobalRunners(w http.ResponseWriter, r *http.Request) {
runners, err := helpers.Store(r).GetGlobalRunners(false)
if err != nil {
panic(err)
}
var result = make([]db.Runner, 0)
for _, runner := range runners {
result = append(result, runner)
}
helpers.WriteJSON(w, http.StatusOK, result)
}
type runnerWithToken struct {
db.Runner
Token string `json:"token"`
}
func addGlobalRunner(w http.ResponseWriter, r *http.Request) {
var runner db.Runner
if !helpers.Bind(w, r, &runner) {
return
}
runner.ProjectID = nil
newRunner, err := helpers.Store(r).CreateRunner(runner)
if err != nil {
log.Warn("Runner is not created: " + err.Error())
w.WriteHeader(http.StatusBadRequest)
return
}
helpers.WriteJSON(w, http.StatusCreated, runnerWithToken{
Runner: newRunner,
Token: newRunner.Token,
})
}
func globalRunnerMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
runnerID, err := helpers.GetIntParam("runner_id", w, r)
if err != nil {
helpers.WriteJSON(w, http.StatusBadRequest, map[string]string{
"error": "runner_id required",
})
return
}
store := helpers.Store(r)
runner, err := store.GetGlobalRunner(runnerID)
if err != nil {
helpers.WriteJSON(w, http.StatusNotFound, map[string]string{
"error": "Runner not found",
})
return
}
context.Set(r, "runner", &runner)
next.ServeHTTP(w, r)
})
}
func getGlobalRunner(w http.ResponseWriter, r *http.Request) {
runner := context.Get(r, "runner").(*db.Runner)
helpers.WriteJSON(w, http.StatusOK, runner)
}
func updateGlobalRunner(w http.ResponseWriter, r *http.Request) {
oldRunner := context.Get(r, "runner").(*db.Runner)
var runner db.Runner
if !helpers.Bind(w, r, &runner) {
return
}
store := helpers.Store(r)
runner.ID = oldRunner.ID
runner.ProjectID = nil
err := store.UpdateRunner(runner)
if err != nil {
helpers.WriteErrorStatus(w, err.Error(), http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusNoContent)
}
func deleteGlobalRunner(w http.ResponseWriter, r *http.Request) {
runner := context.Get(r, "runner").(*db.Runner)
store := helpers.Store(r)
err := store.DeleteGlobalRunner(runner.ID)
if err != nil {
helpers.WriteErrorStatus(w, err.Error(), http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusNoContent)
}
func setGlobalRunnerActive(w http.ResponseWriter, r *http.Request) {
runner := context.Get(r, "runner").(*db.Runner)
store := helpers.Store(r)
var body struct {
Active bool `json:"active"`
}
if !helpers.Bind(w, r, &body) {
helpers.WriteErrorStatus(w, "Invalid request body", http.StatusBadRequest)
return
}
runner.Active = body.Active
err := store.UpdateRunner(*runner)
if err != nil {
helpers.WriteErrorStatus(w, err.Error(), http.StatusBadRequest)
return
}
w.WriteHeader(http.StatusNoContent)
}