package handlers import ( "encoding/json" "net/http" "person-site/internal/models" ) type ConfigHandler struct { Store *models.ConfigStore } func (h *ConfigHandler) GetPublic(w http.ResponseWriter, r *http.Request) { config, err := h.Store.GetAll() if err != nil { Error(w, 500, "failed to fetch config") return } public := buildConfigResponse(config) JSON(w, 200, public) } func (h *ConfigHandler) GetAdmin(w http.ResponseWriter, r *http.Request) { config, err := h.Store.GetAll() if err != nil { Error(w, 500, "failed to fetch config") return } JSON(w, 200, buildConfigResponse(config)) } func (h *ConfigHandler) Update(w http.ResponseWriter, r *http.Request) { var req map[string]interface{} if err := Decode(r, &req); err != nil { Error(w, 400, "invalid request body") return } for key, value := range req { var strVal string switch v := value.(type) { case string: strVal = v case map[string]interface{}, []interface{}: b, err := json.Marshal(v) if err != nil { Error(w, 400, "invalid value for key: "+key) return } strVal = string(b) default: b, err := json.Marshal(v) if err != nil { Error(w, 400, "invalid value for key: "+key) return } strVal = string(b) } if err := h.Store.Set(key, strVal); err != nil { Error(w, 500, "failed to save config") return } } config, err := h.Store.GetAll() if err != nil { Error(w, 500, "failed to fetch updated config") return } JSON(w, 200, buildConfigResponse(config)) } func buildConfigResponse(raw map[string]string) map[string]interface{} { res := make(map[string]interface{}) for k, v := range raw { if k == "social_links" { var links map[string]string if err := json.Unmarshal([]byte(v), &links); err == nil { res[k] = links } else { res[k] = v } continue } res[k] = v } if _, ok := res["social_links"]; !ok { res["social_links"] = map[string]string{} } return res }