From 8edaebfad60c539458cab96e1a62f2f59cce1c7e Mon Sep 17 00:00:00 2001
From: Julien Riou
Date: Thu, 28 Aug 2025 09:46:44 +0200
Subject: [PATCH] feat: Add web view to display notes in HTML
Signed-off-by: Julien Riou
---
src/server/server.go | 93 ++++++++++++++++++++++++++++++++
src/server/templates/create.html | 4 +-
src/server/templates/note.html | 64 ++++++++++++++++++++++
3 files changed, 159 insertions(+), 2 deletions(-)
create mode 100644 src/server/templates/note.html
diff --git a/src/server/server.go b/src/server/server.go
index 7cb395c..419c553 100644
--- a/src/server/server.go
+++ b/src/server/server.go
@@ -192,6 +192,7 @@ type PageData struct {
Languages []string
Err error
URL string
+ Note *Note
}
type HomeHandler struct {
@@ -316,6 +317,81 @@ func (h *CreateNoteWithFormHandler) ServeHTTP(w http.ResponseWriter, r *http.Req
h.Templates.ExecuteTemplate(w, "create", h.PageData)
}
+type GetWebNoteHandler struct {
+ Templates *template.Template
+ PageData PageData
+ logger *slog.Logger
+ db *Database
+}
+
+func (h *GetWebNoteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ h.PageData.Err = nil
+ templateName := "note"
+
+ vars := mux.Vars(r)
+ id := vars["id"]
+
+ note, err := h.db.Get(id)
+
+ if err != nil {
+ h.PageData.Err = fmt.Errorf("could not find note: %v", err)
+ h.Templates.ExecuteTemplate(w, templateName, h.PageData)
+ return
+ }
+
+ if note.Encrypted {
+ h.PageData.Err = fmt.Errorf("note is encrypted")
+ h.Templates.ExecuteTemplate(w, templateName, h.PageData)
+ return
+ }
+
+ h.PageData.Err = fmt.Errorf("jriou")
+ h.Templates.ExecuteTemplate(w, templateName, h.PageData)
+
+ h.PageData.Note = note
+
+ h.logger.Debug("rendering note web page")
+ h.Templates.ExecuteTemplate(w, "note", h.PageData)
+}
+
+type GetProtectedWebNoteHandler struct {
+ Templates *template.Template
+ PageData PageData
+ logger *slog.Logger
+ db *Database
+}
+
+func (h *GetProtectedWebNoteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ h.PageData.Err = nil
+ templateName := "note"
+
+ vars := mux.Vars(r)
+ id := vars["id"]
+ password := vars["password"]
+
+ note, err := h.db.Get(id)
+
+ if err != nil {
+ h.PageData.Err = fmt.Errorf("could not find note: %v", err)
+ h.Templates.ExecuteTemplate(w, templateName, h.PageData)
+ return
+ }
+
+ if password != "" && note.Encrypted {
+ note.Content, err = internal.Decrypt(note.Content, password)
+ if err != nil {
+ h.PageData.Err = fmt.Errorf("could not decrypt note: %v", err)
+ h.Templates.ExecuteTemplate(w, templateName, h.PageData)
+ return
+ }
+ }
+
+ h.PageData.Note = note
+
+ h.logger.Debug("rendering protected note web page")
+ h.Templates.ExecuteTemplate(w, "note", h.PageData)
+}
+
//go:embed templates/*
var templatesFS embed.FS
@@ -339,6 +415,7 @@ func (s *Server) Start() error {
funcs := template.FuncMap{
"HumanDuration": internal.HumanDuration,
"lower": strings.ToLower,
+ "string": func(b []byte) string { return string(b) },
}
p := PageData{
Title: s.config.Title,
@@ -363,6 +440,22 @@ func (s *Server) Start() error {
}
r.Path("/create").Handler(createNoteWithFormHandler).Methods("POST")
+ protectedWebNoteHandler := &GetProtectedWebNoteHandler{
+ Templates: templates,
+ PageData: p,
+ logger: s.logger,
+ db: s.db,
+ }
+ r.Path("/{id:[a-zA-Z0-9]+}/{password:[a-zA-Z0-9]+}.html").Handler(protectedWebNoteHandler).Methods("GET")
+
+ webNoteHandler := &GetWebNoteHandler{
+ Templates: templates,
+ PageData: p,
+ logger: s.logger,
+ db: s.db,
+ }
+ r.Path("/{id:[a-zA-Z0-9]+}.html").Handler(webNoteHandler).Methods("GET")
+
r.Path("/").Handler(&HomeHandler{Templates: templates, PageData: p}).Methods("GET")
addr := fmt.Sprintf("%s:%d", s.config.ListenAddress, s.config.ListenPort)
diff --git a/src/server/templates/create.html b/src/server/templates/create.html
index 416c2cb..9970fa9 100644
--- a/src/server/templates/create.html
+++ b/src/server/templates/create.html
@@ -12,7 +12,7 @@
{{else}}
@@ -20,8 +20,8 @@
Could not create note
{{.Err}}
+ {{end}}
- {{end}}
{{block "footer" .}}{{end}}
+ {{block "header" .}}{{end}}
+
+ {{if ne .Err nil}}
+
+
+
Could not show note
+
{{.Err}}
+
+
+ {{else}}
+
+
+
Note {{.Note.ID}}
+
+ -
+ raw
+
+
+ -
+ {{.Note.Language}}
+
+
+
+
+
+
+
+ {{end}}
+
+ {{block "footer" .}}{{end}}
+
+
+