diff --git a/backend/api/controllers/v1/backends/remove.go b/backend/api/controllers/v1/backends/remove.go new file mode 100644 index 0000000..a44946d --- /dev/null +++ b/backend/api/controllers/v1/backends/remove.go @@ -0,0 +1,123 @@ +package backends + +import ( + "fmt" + "net/http" + + "git.terah.dev/imterah/hermes/api/backendruntime" + "git.terah.dev/imterah/hermes/api/dbcore" + "git.terah.dev/imterah/hermes/api/jwtcore" + "git.terah.dev/imterah/hermes/api/permissions" + "github.com/charmbracelet/log" + "github.com/gin-gonic/gin" + "github.com/go-playground/validator/v10" +) + +type BackendRemovalRequest struct { + Token string `validate:"required"` + BackendID uint `json:"id" validate:"required"` +} + +func RemoveBackend(c *gin.Context) { + var req BackendRemovalRequest + + if err := c.BindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": fmt.Sprintf("Failed to parse body: %s", err.Error()), + }) + + return + } + + if err := validator.New().Struct(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": fmt.Sprintf("Failed to validate body: %s", err.Error()), + }) + + return + } + + user, err := jwtcore.GetUserFromJWT(req.Token) + + if err != nil { + if err.Error() == "token is expired" || err.Error() == "user does not exist" { + c.JSON(http.StatusForbidden, gin.H{ + "error": err.Error(), + }) + + return + } else { + log.Warnf("Failed to get user from the provided JWT token: %s", err.Error()) + + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "Failed to parse token", + }) + + return + } + } + + if !permissions.UserHasPermission(user, "backends.remove") { + c.JSON(http.StatusForbidden, gin.H{ + "error": "Missing permissions", + }) + + return + } + + var backend *dbcore.Backend + backendRequest := dbcore.DB.Where("id = ?", req.BackendID).Find(&backend) + + if backendRequest.Error != nil { + log.Warnf("failed to find if backend exists or not: %s", backendRequest.Error) + + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "Failed to find if backend exists", + }) + + return + } + + backendExists := backendRequest.RowsAffected > 0 + + if !backendExists { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "Backend doesn't exist", + }) + + return + } + + if err := dbcore.DB.Delete(backend).Error; err != nil { + log.Warnf("failed to delete backend: %s", err.Error()) + + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "Failed to delete backend", + }) + + return + } + + backendInstance, ok := backendruntime.RunningBackends[req.BackendID] + + if ok { + err = backendInstance.Stop() + + if err != nil { + log.Warnf("Failed to stop backend: %s", err.Error()) + + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "Backend deleted, but failed to stop", + }) + + delete(backendruntime.RunningBackends, req.BackendID) + return + } + + delete(backendruntime.RunningBackends, req.BackendID) + } + + c.JSON(http.StatusOK, gin.H{ + "success": true, + }) +} diff --git a/backend/api/controllers/v1/users/remove.go b/backend/api/controllers/v1/users/remove.go index 0f508c8..4824907 100644 --- a/backend/api/controllers/v1/users/remove.go +++ b/backend/api/controllers/v1/users/remove.go @@ -74,7 +74,7 @@ func RemoveUser(c *gin.Context) { if uid != user.ID { var customUser *dbcore.User - userRequest := dbcore.DB.Where("id = ?", uid).Find(&customUser) + userRequest := dbcore.DB.Where("id = ?", uid).Find(customUser) if userRequest.Error != nil { log.Warnf("failed to find if user exists or not: %s", userRequest.Error) diff --git a/backend/api/main.go b/backend/api/main.go index 5f5b339..5904305 100644 --- a/backend/api/main.go +++ b/backend/api/main.go @@ -192,6 +192,7 @@ func entrypoint(cCtx *cli.Context) error { engine.POST("/api/v1/users/lookup", users.LookupUser) engine.POST("/api/v1/backends/create", backends.CreateBackend) + engine.POST("/api/v1/backends/remove", backends.RemoveBackend) log.Infof("Listening on '%s'", listeningAddress) err = engine.Run(listeningAddress) diff --git a/routes/Hermes API/Backend/Remove.bru b/routes/Hermes API/Backend/Remove.bru index 3d8fdb6..b941754 100644 --- a/routes/Hermes API/Backend/Remove.bru +++ b/routes/Hermes API/Backend/Remove.bru @@ -5,19 +5,14 @@ meta { } post { - url: http://127.0.0.1:3000/api/v1/backends/create + url: http://127.0.0.1:8000/api/v1/backends/remove body: json auth: none } body:json { { - "token": "f1b89cc337073476289ade17ffbe7a6419b4bd52aa7ede26114bffd76fa263b5cb1bcaf389462e1d9e7acb7f4b6a7c28152a9cc9af83e3ec862f1892b1", - "name": "PortCopier Route", - "description": "This is a test route for portcopier.", - "backend": "PortCopier", - "connectionDetails": { - "funny": true - } + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiMSJdLCJleHAiOjE3MzUwNjY1NjksIm5iZiI6MTczNDk4MDE2OSwiaWF0IjoxNzM0OTgwMTY5fQ.-9IiM8N-azqBLwrAJkKqIzZ6yuumEzErKzSefXWpzaQ", + "id": 69 } }