Files
galaxy-game/gamemaster/internal/api/internalhttp/handlers/updateengineversion.go
T
2026-05-03 07:59:03 +02:00

70 lines
2.1 KiB
Go

package handlers
import (
"encoding/json"
"net/http"
"galaxy/gamemaster/internal/domain/engineversion"
engineversionsvc "galaxy/gamemaster/internal/service/engineversion"
)
// updateEngineVersionRequestBody mirrors the OpenAPI
// UpdateEngineVersionRequest schema. Every field is optional; the
// service rejects calls with no fields set as `invalid_request`.
type updateEngineVersionRequestBody struct {
ImageRef *string `json:"image_ref,omitempty"`
Options *json.RawMessage `json:"options,omitempty"`
Status *string `json:"status,omitempty"`
}
// newUpdateEngineVersionHandler returns the handler for
// `PATCH /api/v1/internal/engine-versions/{version}`.
func newUpdateEngineVersionHandler(deps Dependencies) http.HandlerFunc {
logger := loggerFor(deps.Logger, "internal_rest.update_engine_version")
return func(writer http.ResponseWriter, request *http.Request) {
if deps.EngineVersions == nil {
writeError(writer, http.StatusInternalServerError, errorCodeInternal, "engine version service is not wired")
return
}
version, ok := extractVersion(writer, request)
if !ok {
return
}
var body updateEngineVersionRequestBody
if err := decodeStrictJSON(request.Body, &body); err != nil {
writeError(writer, http.StatusBadRequest, errorCodeInvalidRequest, err.Error())
return
}
input := engineversionsvc.UpdateInput{
Version: version,
ImageRef: body.ImageRef,
OpSource: resolveOpSource(request),
SourceRef: requestSourceRef(request),
}
if body.Options != nil {
optionBytes := []byte(*body.Options)
input.Options = &optionBytes
}
if body.Status != nil {
candidate := engineversion.Status(*body.Status)
input.Status = &candidate
}
record, err := deps.EngineVersions.Update(request.Context(), input)
if err != nil {
logger.ErrorContext(request.Context(), "update engine version failed",
"version", version,
"err", err.Error(),
)
status, code, message := mapServiceError(err)
writeError(writer, status, code, message)
return
}
writeJSON(writer, http.StatusOK, encodeEngineVersion(record))
}
}