feat: add notes field to favorites and enhance OG meta tags
Add an optional long-form "notes" text field to each favorite for reviews, thoughts, or extended descriptions. The field is stored in SQLite via a new migration (002_add_fave_notes.sql) and propagated through the entire stack: - Model: Notes field on Fave struct - Store: All SQL queries (Create, GetByID, Update, list methods, scanFaves) updated with notes column - Web handlers: Read/write notes in create, edit, update forms - API handlers: Notes in create, update, get, import request/response - Export: Notes included in both JSON and CSV exports - Import: Notes parsed from both JSON and CSV imports - Feed: Notes used as Atom feed item summary when present - Form template: New textarea between URL and image fields - Detail template: Display notes, enhanced og:description with cascade: notes (truncated) → URL → generic fallback text Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a8f3aa6f7e
commit
485d01ce45
14 changed files with 151 additions and 71 deletions
|
|
@ -72,12 +72,13 @@ func (h *Handler) handleFaveCreate(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
description := strings.TrimSpace(r.FormValue("description"))
|
||||
url := strings.TrimSpace(r.FormValue("url"))
|
||||
notes := strings.TrimSpace(r.FormValue("notes"))
|
||||
privacy := r.FormValue("privacy")
|
||||
tagStr := r.FormValue("tags")
|
||||
|
||||
if description == "" {
|
||||
h.flash(w, r, "fave_form", "Beskrivelse er påkrevd.", "error", map[string]any{
|
||||
"IsNew": true, "Description": description, "URL": url, "Tags": tagStr, "Privacy": privacy,
|
||||
"IsNew": true, "Description": description, "URL": url, "Notes": notes, "Tags": tagStr, "Privacy": privacy,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -95,7 +96,7 @@ func (h *Handler) handleFaveCreate(w http.ResponseWriter, r *http.Request) {
|
|||
if err != nil {
|
||||
slog.Error("image process error", "error", err)
|
||||
h.flash(w, r, "fave_form", "Kunne ikke behandle bildet. Sjekk at filen er et gyldig bilde (JPEG, PNG, GIF eller WebP).", "error", map[string]any{
|
||||
"IsNew": true, "Description": description, "URL": url, "Tags": tagStr, "Privacy": privacy,
|
||||
"IsNew": true, "Description": description, "URL": url, "Notes": notes, "Tags": tagStr, "Privacy": privacy,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -103,7 +104,7 @@ func (h *Handler) handleFaveCreate(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
// Create the fave.
|
||||
fave, err := h.deps.Faves.Create(user.ID, description, url, imagePath, privacy)
|
||||
fave, err := h.deps.Faves.Create(user.ID, description, url, imagePath, notes, privacy)
|
||||
if err != nil {
|
||||
slog.Error("create fave error", "error", err)
|
||||
h.flash(w, r, "fave_form", "Noe gikk galt. Prøv igjen.", "error", map[string]any{"IsNew": true})
|
||||
|
|
@ -205,6 +206,7 @@ func (h *Handler) handleFaveEdit(w http.ResponseWriter, r *http.Request) {
|
|||
"Fave": fave,
|
||||
"Description": fave.Description,
|
||||
"URL": fave.URL,
|
||||
"Notes": fave.Notes,
|
||||
"Privacy": fave.Privacy,
|
||||
"Tags": strings.Join(tagNames, ", "),
|
||||
},
|
||||
|
|
@ -244,6 +246,7 @@ func (h *Handler) handleFaveUpdate(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
description := strings.TrimSpace(r.FormValue("description"))
|
||||
url := strings.TrimSpace(r.FormValue("url"))
|
||||
notes := strings.TrimSpace(r.FormValue("notes"))
|
||||
privacy := r.FormValue("privacy")
|
||||
tagStr := r.FormValue("tags")
|
||||
|
||||
|
|
@ -283,7 +286,7 @@ func (h *Handler) handleFaveUpdate(w http.ResponseWriter, r *http.Request) {
|
|||
imagePath = ""
|
||||
}
|
||||
|
||||
if err := h.deps.Faves.Update(id, description, url, imagePath, privacy); err != nil {
|
||||
if err := h.deps.Faves.Update(id, description, url, imagePath, notes, privacy); err != nil {
|
||||
slog.Error("update fave error", "error", err)
|
||||
h.flash(w, r, "fave_form", "Noe gikk galt. Prøv igjen.", "error", map[string]any{"IsNew": false, "Fave": fave})
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue