orchard/internal/controller/api_workers.go

108 lines
2.7 KiB
Go

package controller
import (
"errors"
storepkg "github.com/cirruslabs/orchard/internal/controller/store"
"github.com/cirruslabs/orchard/internal/responder"
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"net/http"
"time"
)
func (controller *Controller) createWorker(ctx *gin.Context) responder.Responder {
var worker v1.Worker
if err := ctx.ShouldBindJSON(&worker); err != nil {
return responder.Code(http.StatusBadRequest)
}
if worker.Name == "" {
return responder.Code(http.StatusPreconditionFailed)
}
currentTime := time.Now()
if worker.LastSeen.IsZero() {
worker.LastSeen = currentTime
}
worker.CreatedAt = currentTime
worker.DeletedAt = time.Time{}
worker.UID = uuid.New().String()
worker.Generation = 0
return controller.storeUpdate(func(txn storepkg.Transaction) responder.Responder {
// Does the worker resource with this name already exists?
_, err := txn.GetWorker(worker.Name)
if !errors.Is(err, storepkg.ErrNotFound) {
return responder.Code(http.StatusConflict)
}
if err := txn.SetWorker(&worker); err != nil {
return responder.Error(err)
}
return responder.JSON(200, &worker)
})
}
func (controller *Controller) updateWorker(ctx *gin.Context) responder.Responder {
var userWorker v1.Worker
if err := ctx.ShouldBindJSON(&userWorker); err != nil {
return responder.Code(http.StatusBadRequest)
}
return controller.storeUpdate(func(txn storepkg.Transaction) responder.Responder {
dbWorker, err := txn.GetWorker(userWorker.Name)
if err != nil {
return responder.Error(err)
}
dbWorker.LastSeen = userWorker.LastSeen
dbWorker.Generation++
if err := txn.SetWorker(dbWorker); err != nil {
return responder.Code(http.StatusInternalServerError)
}
return responder.JSON(200, &dbWorker)
})
}
func (controller *Controller) getWorker(ctx *gin.Context) responder.Responder {
name := ctx.Param("name")
return controller.storeView(func(txn storepkg.Transaction) responder.Responder {
worker, err := txn.GetWorker(name)
if err != nil {
return responder.Error(err)
}
return responder.JSON(http.StatusOK, &worker)
})
}
func (controller *Controller) listWorkers(_ *gin.Context) responder.Responder {
return controller.storeView(func(txn storepkg.Transaction) responder.Responder {
workers, err := txn.ListWorkers()
if err != nil {
return responder.Error(err)
}
return responder.JSON(http.StatusOK, &workers)
})
}
func (controller *Controller) deleteWorker(ctx *gin.Context) responder.Responder {
name := ctx.Param("name")
return controller.storeUpdate(func(txn storepkg.Transaction) responder.Responder {
if err := txn.DeleteWorker(name); err != nil {
return responder.Error(err)
}
return responder.Code(http.StatusOK)
})
}