aboutsummaryrefslogtreecommitdiff
path: root/backend/logs.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/logs.go')
-rw-r--r--backend/logs.go66
1 files changed, 42 insertions, 24 deletions
diff --git a/backend/logs.go b/backend/logs.go
index e25c638..d15be41 100644
--- a/backend/logs.go
+++ b/backend/logs.go
@@ -9,6 +9,7 @@ import (
"os"
"path/filepath"
"strings"
+ "sync"
"git.anhgelus.world/anhgelus/small-world/markdown"
"github.com/go-chi/chi/v5"
@@ -16,22 +17,26 @@ import (
)
var (
- logs = map[string]string{}
- loadedLogs = map[string]*logData{}
+ logs = map[string]*logData{}
)
type logData struct {
*data
- LogTitle string `toml:"title"`
- Description string `toml:"description"`
- Img image `toml:"image"`
- Content template.HTML `toml:"-"`
+ LogTitle string `toml:"title"`
+ Description string `toml:"description"`
+ Img image `toml:"image"`
+ pubDate toml.LocalDate `toml:"publication_date"`
+ Content template.HTML `toml:"-"`
}
func (d *logData) SetData(dt *data) {
d.data = dt
}
+func (d *logData) PubDate() string {
+ return d.pubDate.String()
+}
+
type image struct {
Src string `toml:"src"`
Alt string `toml:"alt"`
@@ -62,6 +67,7 @@ func LoadLogs(cfg *Config) bool {
}
func readLogDir(path string, dir []os.DirEntry) error {
+ var wg sync.WaitGroup
for _, d := range dir {
p := filepath.Join(path, d.Name())
if d.IsDir() {
@@ -76,18 +82,31 @@ func readLogDir(path string, dir []os.DirEntry) error {
if !strings.HasSuffix(d.Name(), ".md") {
return fmt.Errorf("file %s is not a markdown file", d.Name())
}
- _, ok := logs[d.Name()]
+ slug := strings.TrimSuffix(p, ".md")
+ _, ok := logs[slug]
if ok {
return fmt.Errorf("log already exists: %s", d.Name())
}
- logs[strings.TrimSuffix(d.Name(), ".md")] = p
+ dd := new(logData)
+ dd.data = new(data)
+ go func() {
+ wg.Add(1)
+ defer wg.Done()
+ ok = parseLog(dd, slug, strings.TrimSuffix(d.Name(), ".md"))
+ if ok {
+ slog.Debug("log parsed", "path", p)
+ } else {
+ slog.Debug("log skipped", "path", p)
+ }
+ }()
}
}
+ wg.Wait()
return nil
}
func HandleLogs(r *chi.Mux) {
- r.Route("/logs", func(r chi.Router) {
+ r.Route("/log", func(r chi.Router) {
r.Get("/", handleLogList)
r.Get("/{slug:[a-zA-Z0-9-]+}", handleLog)
})
@@ -98,32 +117,30 @@ func handleLogList(w http.ResponseWriter, r *http.Request) {
}
func handleLog(w http.ResponseWriter, r *http.Request) {
+ cfg := r.Context().Value("config").(*Config)
slug := chi.URLParam(r, "slug")
- path, ok := logs[slug]
- if !ok {
- http.NotFoundHandler().ServeHTTP(w, r)
- return
- }
- var d *logData
- d, ok = loadedLogs[slug]
+ path := filepath.Join(cfg.LogFolder, slug)
+ d, ok := logs[path]
if !ok {
d = new(logData)
d.data = new(data)
- d.Article = true
- d.LogTitle = slug
- d.title = slug
- if ok = parseLog(d, path); !ok {
- w.WriteHeader(http.StatusInternalServerError)
+ if ok = parseLog(d, path, slug); !ok {
+ http.NotFoundHandler().ServeHTTP(w, r)
return
}
- loadedLogs[slug] = d
}
d.handleGeneric(w, r, "log", d)
}
-func parseLog(d *logData, path string) bool {
- b, err := os.ReadFile(path)
+func parseLog(d *logData, path, slug string) bool {
+ d.Article = true
+ d.LogTitle = slug
+ d.title = slug
+ b, err := os.ReadFile(path + ".md")
if err != nil {
+ if os.IsNotExist(err) {
+ return false
+ }
panic(err)
}
var dd string
@@ -147,5 +164,6 @@ func parseLog(d *logData, path string) bool {
fmt.Println(errMd.Pretty())
return false
}
+ logs[path] = d
return true
}