From 8b249c9ce8bd1c351daf80c6c9b095fb1bccafe2 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 2 Oct 2025 19:52:00 +0200 Subject: feat(backend): load log files --- backend/logs.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'backend/logs.go') diff --git a/backend/logs.go b/backend/logs.go index f3a2e5c..3b722f1 100644 --- a/backend/logs.go +++ b/backend/logs.go @@ -1,16 +1,25 @@ package backend import ( + "fmt" + "html/template" + "log/slog" "net/http" + "os" + "path/filepath" + "strings" "github.com/go-chi/chi/v5" ) +var logs = map[string]string{} + type logData struct { *data LogTitle string Description string Img image + Content template.HTML } func (d *logData) SetData(dt *data) { @@ -23,6 +32,54 @@ type image struct { Legend string } +func LoadLogs(cfg *Config) bool { + dir, err := os.ReadDir(cfg.LogFolder) + if err != nil { + if !os.IsNotExist(err) { + slog.Error("reading log directory", "error", err) + return false + } + err = os.MkdirAll(cfg.LogFolder, 0660) + if err != nil { + slog.Error("creating log directory", "error", err) + } + return false + } + slog.Info("checking log directory...", "path", cfg.LogFolder) + err = readLogDir(cfg.LogFolder, dir) + if err != nil { + slog.Error("reading log directory", "error", err, "path", cfg.LogFolder) + return false + } + slog.Info("all logs loaded") + return true +} + +func readLogDir(path string, dir []os.DirEntry) error { + for _, d := range dir { + p := filepath.Join(path, d.Name()) + if d.IsDir() { + dd, err := os.ReadDir(p) + if err != nil { + return err + } + if err = readLogDir(p, dd); err != nil { + return err + } + } else { + if !strings.HasSuffix(d.Name(), ".md") { + return fmt.Errorf("file %s is not a markdown file", d.Name()) + } + _, ok := logs[d.Name()] + if ok { + return fmt.Errorf("log already exists: %s", d.Name()) + } + logs[strings.TrimSuffix(d.Name(), ".md")] = p + } + } + return nil +} + func HandleLogs(r *chi.Mux) { r.Route("/logs", func(r chi.Router) { r.Get("/", handleLogList) @@ -36,6 +93,11 @@ func handleLogList(w http.ResponseWriter, r *http.Request) { func handleLog(w http.ResponseWriter, r *http.Request) { slug := chi.URLParam(r, "slug") + _, ok := logs[slug] + if !ok { + http.NotFoundHandler().ServeHTTP(w, r) + return + } d := new(logData) d.data = new(data) d.Article = true -- cgit v1.2.3