108 lines
2.7 KiB
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)
|
|
})
|
|
}
|