aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-10-02 19:52:00 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2025-10-02 19:52:00 +0200
commit8b249c9ce8bd1c351daf80c6c9b095fb1bccafe2 (patch)
treee56eddae167c89ae3a8a885303ca876d1a439a61 /backend
parentc000d9482e183f74b6237ecaeb7f06c0862413de (diff)
feat(backend): load log files
Diffstat (limited to 'backend')
-rw-r--r--backend/config.go5
-rw-r--r--backend/logs.go62
-rw-r--r--backend/templates/log.html56
3 files changed, 66 insertions, 57 deletions
diff --git a/backend/config.go b/backend/config.go
index d6eec64..c5a44ef 100644
--- a/backend/config.go
+++ b/backend/config.go
@@ -1,7 +1,6 @@
package backend
import (
- "errors"
"log/slog"
"os"
@@ -24,6 +23,7 @@ type Config struct {
Description string `toml:"description"`
Links []Link `toml:"links"`
Logo Logo `toml:"logo"`
+ LogFolder string `toml:"log_folder"`
}
func (c *Config) DefaultValues() {
@@ -44,13 +44,14 @@ func (c *Config) DefaultValues() {
Header: "logo.jpg",
Favicon: "favicon.jpg",
}
+ c.LogFolder = "data/logs"
}
func LoadConfig(path string) (*Config, bool) {
b, err := os.ReadFile(path)
var config Config
if err != nil {
- if !errors.Is(err, os.ErrNotExist) {
+ if !os.IsNotExist(err) {
slog.Error("reading config file", "error", err)
return nil, false
}
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
diff --git a/backend/templates/log.html b/backend/templates/log.html
index 1768842..57948d4 100644
--- a/backend/templates/log.html
+++ b/backend/templates/log.html
@@ -8,60 +8,6 @@
<img src="{{ .Img.Src }}" alt="{{ .Img.Alt }}" class="large">
<figcaption>{{ .Img.Legend }}</figcaption>
</figure>
- <h2>A. Section</h2>
- <p>
- Lorem ipsum dolor sit amet, <code>consectetur adipiscing elit</code>, sed do eiusmod tempor incididunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim aeque doleamus animo, cum corpore dolemus, fieri <em>tamen</em> permagna accessio potest, si aliquod aeternum et infinitum impendere malum nobis opinemur. <a href="">Quod idem licet transferre</a>.
- </p>
- <figure>
- <img src="https://placehold.co/600x400" alt="placeholder">
- <figcaption>A placeholder image.</figcaption>
- </figure>
- <h3>1. Subsection</h3>
- <p>
- Et ultimum bonorum, quod omnium philosophorum sententia tale debet esse, <a href="">ut ad Orestem pervenias profectus a Theseo</a>. At vero Epicurus una in domo, et ea quidem angusta, quam magnos quantaque amoris conspiratione consentientis tenuit amicorum greges! Quod fit etiam nunc ab Epicureis. Sed ad rem redeamus; de hominibus dici non modo.
- </p>
- <p>
- Civitatis, P. Scaevolam M'.que Manilium, ab iisque vitiis, quae paulo ante collegi, abest plurimum et, cum stultorum vitam cum sua comparat, magna afficitur voluptate. Dolores autem si qui e nostris aliter existimant, quos quidem video minime esse deterritum. Quae cum dixisset, Explicavi, inquit, sententiam meam, et eo quidem consilio, tuum iudicium ut.
- </p>
- <h3>2. Subsection</h3>
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim aeque doleamus animo, cum corpore dolemus, <em>fieri tamen</em> permagna accessio potest, si aliquod aeternum et infinitum impendere malum nobis opinemur. Quod idem licet transferre in voluptatem, ut postea variari voluptas distinguique possit, augeri amplificarique non possit.
- </p>
- <p>
- <a href="">Verborum vis et natura orationis</a> et <a href="">consequentium repugnantiumve ratio potest perspici</a>. Omnium autem rerum natura perspecta erit, nullo modo sine amicitia firmam et perpetuam iucunditatem vitae tenere possumus neque vero ipsam amicitiam tueri, nisi aeque.
- </p>
- <div class="quote">
- <blockquote cite="">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim aeque doleamus.
- </blockquote>
- <p>John Doe, <cite>Foo Bar</cite></p>
- </div>
- <p>
- Laborum perfunctio neque <b>perpessio dolorum</b> per se esse expetendam et dolorem ipsum per se esse fugiendum. Itaque aiunt hanc quasi naturalem atque insitam in animis inclusae inter se reprehensiones non sunt vituperandae, maledicta, contumeliae, tum iracundiae, contentiones concertationesque in disputando pertinaces indignae philosophia mihi.
- </p>
- <h2>B. Section</h2>
- <p>
- Ignorant. Animi autem voluptates et dolores nasci fatemur e corporis voluptatibus et doloribus -- itaque concedo, quod modo dicebas, cadere causa, si qui incurrunt, numquam vim tantam habent, ut non dicas, quid non probes. Principio, inquam, in physicis, quibus maxime gloriatur, primum totus est alienus. <a href="">Democritea dicit perpauca mutans</a>, sed ita, ut ea, quae dicta sunt ab iis quos probamus, eisque nostrum iudicium et.
- </p>
- <ul>
- <li>Item A</li>
- <li>Item B</li>
- <li>Item C</li>
- </ul>
- <pre><code>package main
-
-import "fmt"
-
-func main() {
- fmt.Printf("Hey %s!", "you")
-}</code></pre>
- <p>
- Lorem ipsum dolor sit amet, consectetur <em>adipiscing</em> elit, sed do eiusmod tempor incididunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim aeque doleamus animo, cum corpore dolemus, fieri tamen permagna accessio potest, si aliquod aeternum et infinitum impendere malum nobis opinemur. <b>Quod idem licet transferre in voluptatem</b>, ut postea variari voluptas distinguique possit, augeri amplificarique non possit. At etiam Athenis.
- </p>
- <ol>
- <li>Item 1</li>
- <li>Item 2</li>
- <li>Item 3</li>
- </ol>
+ {{ .Content }}
</article>
{{end}} \ No newline at end of file