You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

94 lines
1.9 KiB

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
}