package handlers import ( "encoding/json" "net/http" engineversionsvc "galaxy/gamemaster/internal/service/engineversion" ) // createEngineVersionRequestBody mirrors the OpenAPI // CreateEngineVersionRequest schema. type createEngineVersionRequestBody struct { Version string `json:"version"` ImageRef string `json:"image_ref"` Options json.RawMessage `json:"options,omitempty"` } // newCreateEngineVersionHandler returns the handler for // `POST /api/v1/internal/engine-versions`. func newCreateEngineVersionHandler(deps Dependencies) http.HandlerFunc { logger := loggerFor(deps.Logger, "internal_rest.create_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 } var body createEngineVersionRequestBody if err := decodeStrictJSON(request.Body, &body); err != nil { writeError(writer, http.StatusBadRequest, errorCodeInvalidRequest, err.Error()) return } record, err := deps.EngineVersions.Create(request.Context(), engineversionsvc.CreateInput{ Version: body.Version, ImageRef: body.ImageRef, Options: []byte(body.Options), OpSource: resolveOpSource(request), SourceRef: requestSourceRef(request), }) if err != nil { logger.ErrorContext(request.Context(), "create engine version failed", "err", err.Error()) status, code, message := mapServiceError(err) writeError(writer, status, code, message) return } writeJSON(writer, http.StatusCreated, encodeEngineVersion(record)) } }