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>
27 lines
497 B
Go
27 lines
497 B
Go
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
package model
|
|
|
|
import "time"
|
|
|
|
type Fave struct {
|
|
ID int64
|
|
UserID int64
|
|
Description string
|
|
URL string
|
|
ImagePath string
|
|
Notes string
|
|
Privacy string
|
|
Tags []Tag
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
|
|
// Joined fields for display.
|
|
Username string
|
|
DisplayName string
|
|
}
|
|
|
|
// IsPublic returns true if the fave is publicly visible.
|
|
func (f *Fave) IsPublic() bool {
|
|
return f.Privacy == "public"
|
|
}
|