1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-04 20:16:24 -07:00

Finish browser-based template editor, resolves issue #90

This commit is contained in:
Eggbertx 2023-12-26 17:02:09 -08:00
parent 6fbfb731bd
commit e968dc875a
9 changed files with 134 additions and 20 deletions

View file

@ -10,6 +10,7 @@ import (
"os"
"path"
"strconv"
"time"
"github.com/gochan-org/gochan/pkg/building"
"github.com/gochan-org/gochan/pkg/config"
@ -425,29 +426,125 @@ func registerAdminPages() {
Callback: func(writer http.ResponseWriter, request *http.Request, staff *gcsql.Staff, wantsJSON bool, infoEv, errEv *zerolog.Event) (output interface{}, err error) {
buf := bytes.NewBufferString("")
selectedTemplate := request.PostFormValue("templateselect")
selectedTemplate := request.FormValue("override")
templatesDir := config.GetSystemCriticalConfig().TemplateDir
var overriding string
var templateStr string
var templatePath string
var successStr string
if selectedTemplate != "" {
errEv.Str("selectedTemplate", selectedTemplate)
gcutil.LogStr("selectedTemplate", selectedTemplate, infoEv, errEv)
templatePath, err := gctemplates.GetTemplatePath(selectedTemplate)
if err != nil {
if templatePath, err = gctemplates.GetTemplatePath(selectedTemplate); err != nil {
errEv.Err(err).Caller().Msg("unable to load selected template")
return "", fmt.Errorf("template %q does not exist", selectedTemplate)
}
errEv.Str("templatePath", templatePath)
ba, err := os.ReadFile(templatePath)
if err != nil {
errEv.Err(err).Caller().Send()
return "", fmt.Errorf("unable to load selected template %q", selectedTemplate)
}
templateStr = string(ba)
} else if overriding = request.PostFormValue("overriding"); overriding != "" {
if templateStr = request.PostFormValue("templatetext"); templateStr == "" {
writer.WriteHeader(http.StatusBadRequest)
errEv.Caller().Int("status", http.StatusBadRequest).
Msg("received an empty template string")
return "", errors.New("received an empty template string")
}
if _, err = gctemplates.ParseTemplate(selectedTemplate, templateStr); err != nil {
// unable to parse submitted template
errEv.Err(err).Caller().Int("status", http.StatusBadRequest).Send()
writer.WriteHeader(http.StatusBadRequest)
return "", err
}
overrideDir := path.Join(templatesDir, "override")
overridePath := path.Join(overrideDir, overriding)
gcutil.LogStr("overridePath", overridePath, infoEv, errEv)
if _, err = os.Stat(overrideDir); os.IsNotExist(err) {
// override dir doesn't exist, create it
if err = os.Mkdir(overrideDir, config.GC_DIR_MODE); err != nil {
errEv.Err(err).Caller().
Int("status", http.StatusInternalServerError).
Msg("Unable to create override directory")
writer.WriteHeader(http.StatusInternalServerError)
return "", err
}
} else if err != nil {
// got an error checking for override dir
errEv.Err(err).Caller().
Int("status", http.StatusInternalServerError).
Msg("Unable to check if override directory exists")
writer.WriteHeader(http.StatusInternalServerError)
return "", err
}
// get the original template file, or the latest override if there are any
templatePath, err := gctemplates.GetTemplatePath(overriding)
if err != nil {
errEv.Err(err).Caller().
Int("status", http.StatusInternalServerError).
Msg("Unable to get original template path")
writer.WriteHeader(http.StatusInternalServerError)
return "", err
}
// read original template path into []byte to be backed up
ba, err := os.ReadFile(templatePath)
if err != nil {
errEv.Err(err).Caller().
Int("status", http.StatusInternalServerError).
Msg("Unable to read original template file")
writer.WriteHeader(http.StatusInternalServerError)
return "", err
}
// back up template to override/<overriding>-<timestamp>.bkp
backupPath := path.Join(overrideDir, overriding) + time.Now().Format("-2006-01-02_15-04-05.bkp")
gcutil.LogStr("backupPath", backupPath, infoEv, errEv)
if err = os.WriteFile(backupPath, ba, config.GC_FILE_MODE); err != nil {
errEv.Err(err).Caller().
Int("status", http.StatusInternalServerError).
Msg("Unable to back up template file")
writer.WriteHeader(http.StatusInternalServerError)
return "", errors.New("unable to back up original template file")
}
// write changes to disk
if err = os.WriteFile(overridePath, []byte(templateStr), config.GC_FILE_MODE); err != nil {
errEv.Err(err).Caller().
Int("status", http.StatusInternalServerError).
Msg("Unable to save changes")
writer.WriteHeader(http.StatusInternalServerError)
return "", err
}
// reload template
if err = gctemplates.InitTemplates(overriding); err != nil {
errEv.Err(err).Caller().
Int("status", http.StatusInternalServerError).
Msg("Unable to reinitialize template")
writer.WriteHeader(http.StatusInternalServerError)
return "", err
}
successStr = fmt.Sprintf("%q saved successfully.\n Original backed up to %s",
overriding, backupPath)
infoEv.Msg("Template successfully saved and reloaded")
}
serverutil.MinifyTemplate(gctemplates.ManageTemplates, map[string]any{
data := map[string]any{
"templates": gctemplates.GetTemplateList(),
"templatesDir": templatesDir,
"templatePath": templatePath,
"selectedTemplate": selectedTemplate,
"templateText": templateStr,
}, buf, "text/html")
"success": successStr,
}
if templateStr != "" && successStr == "" {
data["templateText"] = templateStr
}
serverutil.MinifyTemplate(gctemplates.ManageTemplates, data, buf, "text/html")
return buf.String(), nil
}},
Action{