diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-03 11:36:22 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-03 11:49:09 +0200 |
| commit | b8a964e19de9cb025587c3546930a18c0d4edd07 (patch) | |
| tree | fe4bec22a4727c4932021eb973a646ca6389011e /backend/home.go | |
| parent | cec39db23db603e87b969a5c630b5873f96a8be7 (diff) | |
feat(backend): handle simple root files
Diffstat (limited to 'backend/home.go')
| -rw-r--r-- | backend/home.go | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/backend/home.go b/backend/home.go index d41102c..8799b36 100644 --- a/backend/home.go +++ b/backend/home.go @@ -1,16 +1,24 @@ package backend import ( + "fmt" + "html/template" "log/slog" "net/http" + "os" + "path/filepath" "strconv" + "git.anhgelus.world/anhgelus/small-world/markdown" "github.com/go-chi/chi/v5" ) const maxLogsPerPage = 5 -var sortedLogs []*logData +var ( + sortedLogs []*logData + rootContent = map[string]template.HTML{} +) type homeData struct { *data @@ -33,6 +41,54 @@ func HandleHome(r *chi.Mux) { }) } +type rootData struct { + *data + Content template.HTML +} + +func (l *rootData) SetData(d *data) { + l.data = d +} + +func HandleRoot(r *chi.Mux, cfg *Config) { + err := os.Mkdir(cfg.RootFolder, 0660) + if err != nil && !os.IsExist(err) { + panic(err) + } + r.Get("/{name:[a-zA-Z-]+}", func(w http.ResponseWriter, r *http.Request) { + handleGenericRoot(w, r, chi.URLParam(r, "name")) + }) +} + +func handleGenericRoot(w http.ResponseWriter, r *http.Request, name string) { + d := new(rootData) + d.data = new(data) + if c, ok := rootContent[name]; ok { + d.Content = c + } else { + cfg := r.Context().Value("config").(*Config) + path := filepath.Join(cfg.RootFolder, name+".md") + b, err := os.ReadFile(path) + if err != nil { + if os.IsNotExist(err) { + http.NotFoundHandler().ServeHTTP(w, r) + return + } + panic(err) + } + var errMd *markdown.ParseError + d.Content, errMd = markdown.ParseBytes(b) + if errMd != nil { + slog.Error("parsing markdown", "path", path) + fmt.Println(errMd.Pretty()) + w.WriteHeader(http.StatusInternalServerError) + return + } + rootContent[name] = d.Content + } + d.handleGeneric(w, r, "simple", d) +} + func handleGenericLogsDisplay(w http.ResponseWriter, r *http.Request) *homeData { rawPage := r.URL.Query().Get("page") page := 1 |
