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
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
|
|
}
|
|
|