diff --git a/api/config/modify.go b/api/config/modify.go index 0ce85649..190281d7 100644 --- a/api/config/modify.go +++ b/api/config/modify.go @@ -1,141 +1,143 @@ package config import ( - "github.com/0xJacky/Nginx-UI/api" - "github.com/0xJacky/Nginx-UI/internal/config" - "github.com/0xJacky/Nginx-UI/internal/helper" - "github.com/0xJacky/Nginx-UI/internal/nginx" - "github.com/0xJacky/Nginx-UI/model" - "github.com/0xJacky/Nginx-UI/query" - "github.com/gin-gonic/gin" - "github.com/sashabaranov/go-openai" - "net/http" - "os" - "time" + "github.com/0xJacky/Nginx-UI/api" + "github.com/0xJacky/Nginx-UI/internal/config" + "github.com/0xJacky/Nginx-UI/internal/helper" + "github.com/0xJacky/Nginx-UI/internal/nginx" + "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/query" + "github.com/gin-gonic/gin" + "github.com/sashabaranov/go-openai" + "net/http" + "os" + "time" ) type EditConfigJson struct { - Content string `json:"content" binding:"required"` + Content string `json:"content" binding:"required"` } func EditConfig(c *gin.Context) { - name := c.Param("name") - var json struct { - Name string `json:"name" binding:"required"` - Filepath string `json:"filepath" binding:"required"` - NewFilepath string `json:"new_filepath" binding:"required"` - Content string `json:"content"` - SyncOverwrite bool `json:"sync_overwrite"` - SyncNodeIds []int `json:"sync_node_ids"` - } - if !api.BindAndValid(c, &json) { - return - } + name := c.Param("name") + var json struct { + Name string `json:"name" binding:"required"` + Filepath string `json:"filepath" binding:"required"` + NewFilepath string `json:"new_filepath" binding:"required"` + Content string `json:"content"` + SyncOverwrite bool `json:"sync_overwrite"` + SyncNodeIds []int `json:"sync_node_ids"` + } + if !api.BindAndValid(c, &json) { + return + } - path := json.Filepath - if !helper.IsUnderDirectory(path, nginx.GetConfPath()) { - c.JSON(http.StatusForbidden, gin.H{ - "message": "filepath is not under the nginx conf path", - }) - return - } + path := json.Filepath + if !helper.IsUnderDirectory(path, nginx.GetConfPath()) { + c.JSON(http.StatusForbidden, gin.H{ + "message": "filepath is not under the nginx conf path", + }) + return + } - if !helper.IsUnderDirectory(json.NewFilepath, nginx.GetConfPath()) { - c.JSON(http.StatusForbidden, gin.H{ - "message": "new filepath is not under the nginx conf path", - }) - return - } + if !helper.IsUnderDirectory(json.NewFilepath, nginx.GetConfPath()) { + c.JSON(http.StatusForbidden, gin.H{ + "message": "new filepath is not under the nginx conf path", + }) + return + } - if !helper.FileExists(path) { - c.JSON(http.StatusNotFound, gin.H{ - "message": "file not found", - }) - return - } + if !helper.FileExists(path) { + c.JSON(http.StatusNotFound, gin.H{ + "message": "file not found", + }) + return + } - content := json.Content - origContent, err := os.ReadFile(path) - if err != nil { - api.ErrHandler(c, err) - return - } + content := json.Content + origContent, err := os.ReadFile(path) + if err != nil { + api.ErrHandler(c, err) + return + } - if content != "" && content != string(origContent) { - err = os.WriteFile(path, []byte(content), 0644) - if err != nil { - api.ErrHandler(c, err) - return - } - } + if content != "" && content != string(origContent) { + err = os.WriteFile(path, []byte(content), 0644) + if err != nil { + api.ErrHandler(c, err) + return + } + } - q := query.Config - cfg, err := q.Where(q.Filepath.Eq(json.Filepath)).FirstOrCreate() - if err != nil { - api.ErrHandler(c, err) - return - } + q := query.Config + cfg, err := q.Where(q.Filepath.Eq(json.Filepath)).FirstOrCreate() + if err != nil { + api.ErrHandler(c, err) + return + } - _, err = q.Where(q.Filepath.Eq(json.Filepath)).Updates(&model.Config{ - Name: json.Name, - Filepath: json.NewFilepath, - SyncNodeIds: json.SyncNodeIds, - SyncOverwrite: json.SyncOverwrite, - }) + _, err = q.Where(q.Filepath.Eq(json.Filepath)). + Select(q.Name, q.Filepath, q.SyncNodeIds, q.SyncOverwrite). + Updates(&model.Config{ + Name: json.Name, + Filepath: json.NewFilepath, + SyncNodeIds: json.SyncNodeIds, + SyncOverwrite: json.SyncOverwrite, + }) - if err != nil { - api.ErrHandler(c, err) - return - } - g := query.ChatGPTLog - // handle rename - if path != json.NewFilepath { - if helper.FileExists(json.NewFilepath) { - c.JSON(http.StatusNotAcceptable, gin.H{ - "message": "File exists", - }) - return - } - err := os.Rename(json.Filepath, json.NewFilepath) - if err != nil { - api.ErrHandler(c, err) - return - } + if err != nil { + api.ErrHandler(c, err) + return + } + g := query.ChatGPTLog + // handle rename + if path != json.NewFilepath { + if helper.FileExists(json.NewFilepath) { + c.JSON(http.StatusNotAcceptable, gin.H{ + "message": "File exists", + }) + return + } + err := os.Rename(json.Filepath, json.NewFilepath) + if err != nil { + api.ErrHandler(c, err) + return + } - // update ChatGPT record - _, _ = g.Where(g.Name.Eq(json.NewFilepath)).Delete() - _, _ = g.Where(g.Name.Eq(path)).Update(g.Name, json.NewFilepath) - } + // update ChatGPT record + _, _ = g.Where(g.Name.Eq(json.NewFilepath)).Delete() + _, _ = g.Where(g.Name.Eq(path)).Update(g.Name, json.NewFilepath) + } - err = config.SyncToRemoteServer(cfg, json.NewFilepath) - if err != nil { - api.ErrHandler(c, err) - return - } + err = config.SyncToRemoteServer(cfg, json.NewFilepath) + if err != nil { + api.ErrHandler(c, err) + return + } - output := nginx.Reload() - if nginx.GetLogLevel(output) >= nginx.Warn { - c.JSON(http.StatusInternalServerError, gin.H{ - "message": output, - }) - return - } + output := nginx.Reload() + if nginx.GetLogLevel(output) >= nginx.Warn { + c.JSON(http.StatusInternalServerError, gin.H{ + "message": output, + }) + return + } - chatgpt, err := g.Where(g.Name.Eq(json.NewFilepath)).FirstOrCreate() - if err != nil { - api.ErrHandler(c, err) - return - } + chatgpt, err := g.Where(g.Name.Eq(json.NewFilepath)).FirstOrCreate() + if err != nil { + api.ErrHandler(c, err) + return + } - if chatgpt.Content == nil { - chatgpt.Content = make([]openai.ChatCompletionMessage, 0) - } + if chatgpt.Content == nil { + chatgpt.Content = make([]openai.ChatCompletionMessage, 0) + } - c.JSON(http.StatusOK, config.Config{ - Name: name, - Content: content, - ChatGPTMessages: chatgpt.Content, - FilePath: json.NewFilepath, - ModifiedAt: time.Now(), - }) + c.JSON(http.StatusOK, config.Config{ + Name: name, + Content: content, + ChatGPTMessages: chatgpt.Content, + FilePath: json.NewFilepath, + ModifiedAt: time.Now(), + }) } diff --git a/query/configs.gen.go b/query/configs.gen.go index 5ecc487a..ce6e861f 100644 --- a/query/configs.gen.go +++ b/query/configs.gen.go @@ -32,8 +32,10 @@ func newConfig(db *gorm.DB, opts ...gen.DOOption) config { _config.CreatedAt = field.NewTime(tableName, "created_at") _config.UpdatedAt = field.NewTime(tableName, "updated_at") _config.DeletedAt = field.NewField(tableName, "deleted_at") + _config.Name = field.NewString(tableName, "name") _config.Filepath = field.NewString(tableName, "filepath") _config.SyncNodeIds = field.NewField(tableName, "sync_node_ids") + _config.SyncOverwrite = field.NewBool(tableName, "sync_overwrite") _config.fillFieldMap() @@ -43,13 +45,15 @@ func newConfig(db *gorm.DB, opts ...gen.DOOption) config { type config struct { configDo - ALL field.Asterisk - ID field.Int - CreatedAt field.Time - UpdatedAt field.Time - DeletedAt field.Field - Filepath field.String - SyncNodeIds field.Field + ALL field.Asterisk + ID field.Int + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Name field.String + Filepath field.String + SyncNodeIds field.Field + SyncOverwrite field.Bool fieldMap map[string]field.Expr } @@ -70,8 +74,10 @@ func (c *config) updateTableName(table string) *config { c.CreatedAt = field.NewTime(table, "created_at") c.UpdatedAt = field.NewTime(table, "updated_at") c.DeletedAt = field.NewField(table, "deleted_at") + c.Name = field.NewString(table, "name") c.Filepath = field.NewString(table, "filepath") c.SyncNodeIds = field.NewField(table, "sync_node_ids") + c.SyncOverwrite = field.NewBool(table, "sync_overwrite") c.fillFieldMap() @@ -88,13 +94,15 @@ func (c *config) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (c *config) fillFieldMap() { - c.fieldMap = make(map[string]field.Expr, 6) + c.fieldMap = make(map[string]field.Expr, 8) c.fieldMap["id"] = c.ID c.fieldMap["created_at"] = c.CreatedAt c.fieldMap["updated_at"] = c.UpdatedAt c.fieldMap["deleted_at"] = c.DeletedAt + c.fieldMap["name"] = c.Name c.fieldMap["filepath"] = c.Filepath c.fieldMap["sync_node_ids"] = c.SyncNodeIds + c.fieldMap["sync_overwrite"] = c.SyncOverwrite } func (c config) clone(db *gorm.DB) config {