diff --git a/server/createInstanceRoute.go b/server/createInstanceRoute.go new file mode 100644 index 0000000000000000000000000000000000000000..baf290fefcb0bab26859db762dbb221f9ffa074f --- /dev/null +++ b/server/createInstanceRoute.go @@ -0,0 +1,73 @@ +package server + +import ( + "encoding/json" + "net/http" + "os" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" + "jonasled.dev/jonasled/ems-esp-logger/database" + "jonasled.dev/jonasled/ems-esp-logger/database/tables" + "jonasled.dev/jonasled/ems-esp-logger/log" +) + +func initCreateInstanceRoute() { + apiKey := os.Getenv("MASTER_APIKEY") + if apiKey == "" { + log.Log.Fatal("MASTER_APIKEY is not specified") + } + + R.POST("/api/instance", func(c *gin.Context) { + authHeader := c.GetHeader("Authentication") + if authHeader != apiKey { + c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"}) + return + } + contentType := c.GetHeader("Content-Type") + if contentType == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Content-Type header missing"}) + return + } + if contentType != "application/json" { + c.JSON(http.StatusBadRequest, gin.H{"error": "expected application/json as content type"}) + return + } + var instance tables.Instance + body, _ := c.GetRawData() + err := json.Unmarshal(body, &instance) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "failed decoding json", "message": err.Error()}) + return + } + if instance.Name == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "the name cannot be empty"}) + return + } + + var existingInstance tables.Instance + err = database.Db.Where("name = ?", instance.Name).First(&existingInstance).Error + + if err != nil { + if err == gorm.ErrRecordNotFound { + if err := database.Db.Create(&instance).Error; err != nil { + log.Log.Error("Failed to create instance: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": "failed creating new instance definition"}) + } + c.JSON(http.StatusCreated, gin.H{"message": "Created new entry"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": "failed creating new instance definition"}) + log.Log.Error("Failed to query database, while trying to create new instance: %v", err) + } + } else { + existingInstance.Description = instance.Description + if err := database.Db.Save(&existingInstance).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "failed updating instance definition"}) + log.Log.Error("Failed to query database, while trying to update instance: %v", err) + } + c.JSON(http.StatusCreated, gin.H{"message": "Updated entry"}) + } + + }) + +} diff --git a/server/main.go b/server/main.go index 1c76636e320c0719e9717085e4472f15fa98368a..be39cf11ed593c9d61af4af3f85e48cc5557142d 100644 --- a/server/main.go +++ b/server/main.go @@ -14,6 +14,7 @@ func Init() { R.Use(ginlogrus.Logger(log.Log), gin.Recovery()) initGeneralRoutes() + initCreateInstanceRoute() } func Run() {