From 1c830d6e6014d1fe4c76cf4a42af739abec61096 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Sat, 14 Jan 2023 22:46:11 +0300 Subject: [PATCH] Code refactoring --- cmd/api/config.go | 81 +++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 48 deletions(-) diff --git a/cmd/api/config.go b/cmd/api/config.go index f27f409a..ad2f2e78 100644 --- a/cmd/api/config.go +++ b/cmd/api/config.go @@ -1,13 +1,11 @@ package api import ( - "io" - "io/ioutil" - "net/http" - "os" - "github.com/AlexxIT/go2rtc/cmd/app" "gopkg.in/yaml.v3" + "io" + "net/http" + "os" ) func configHandler(w http.ResponseWriter, r *http.Request) { @@ -22,42 +20,27 @@ func configHandler(w http.ResponseWriter, r *http.Request) { log.Warn().Err(err).Caller().Send() } - case "POST": + case "POST", "PATCH": data, err := io.ReadAll(r.Body) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } - // validate config - var tmp struct{} - if err = yaml.Unmarshal(data, &tmp); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - if err = os.WriteFile(app.ConfigPath, data, 0644); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - case "PATCH": - rawdata, err := io.ReadAll(r.Body) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - data, err := mergeYAML(app.ConfigPath, rawdata) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // validate config - var tmp struct{} - if err = yaml.Unmarshal(data, &tmp); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return + if r.Method == "PATCH" { + // no need to validate after merge + data, err = mergeYAML(app.ConfigPath, data) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + } else { + // validate config + var tmp struct{} + if err = yaml.Unmarshal(data, &tmp); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } } if err = os.WriteFile(app.ConfigPath, data, 0644); err != nil { @@ -69,44 +52,46 @@ func configHandler(w http.ResponseWriter, r *http.Request) { func mergeYAML(file1 string, yaml2 []byte) ([]byte, error) { // Read the contents of the first YAML file - data1, err := ioutil.ReadFile(file1) + data1, err := os.ReadFile(file1) if err != nil { return nil, err } + // Unmarshal the first YAML file into a map var config1 map[string]interface{} - err = yaml.Unmarshal(data1, &config1) - if err != nil { + if err = yaml.Unmarshal(data1, &config1); err != nil { return nil, err } + // Unmarshal the second YAML document into a map var config2 map[string]interface{} - err = yaml.Unmarshal(yaml2, &config2) - if err != nil { + if err = yaml.Unmarshal(yaml2, &config2); err != nil { return nil, err } + // Merge the two maps config1 = merge(config1, config2) + // Marshal the merged map into YAML return yaml.Marshal(&config1) } -func merge(a, b map[string]interface{}) map[string]interface{} { - for k, v := range b { - if vv, ok := a[k]; ok { +func merge(dst, src map[string]interface{}) map[string]interface{} { + for k, v := range src { + if vv, ok := dst[k]; ok { switch vv := vv.(type) { case map[string]interface{}: v := v.(map[string]interface{}) - a[k] = merge(vv, v) + dst[k] = merge(vv, v) case []interface{}: v := v.([]interface{}) - a[k] = v + dst[k] = v default: - a[k] = v + dst[k] = v } } else { - a[k] = v + dst[k] = v } } - return a + return dst }