From 77844083faeedadb6ca9dabad0ec7dcf6468070a Mon Sep 17 00:00:00 2001 From: Jonas Leder <jonas@jonasled.de> Date: Sun, 26 Jan 2025 16:38:57 +0100 Subject: [PATCH] add HTTP endpoint for creating new instances --- server/createInstanceRoute.go | 73 +++++++++++++++++++++++++++++++++++ server/main.go | 1 + 2 files changed, 74 insertions(+) create mode 100644 server/createInstanceRoute.go diff --git a/server/createInstanceRoute.go b/server/createInstanceRoute.go new file mode 100644 index 0000000..baf290f --- /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 1c76636..be39cf1 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() { -- GitLab