package model import "time" // Feedback is a user-submitted message — bug report, feature request, // or general comment — captured by the /feedback page. Surfaced to // admins both via the /stats page and via an email fan-out on insert. // // UserID is a pointer so the model can carry anonymous submissions // (logged-out visitors) and orphaned rows (the submitter has since // deleted their account — the FK is set null). ContactEmail is the // optional reply-to filled in by anonymous submitters. // // AuthorHandle / AuthorName / AuthorEmail are populated by joins in // the repo's lookup helpers (used by the admin email template and the // /stats page). They're nil for anonymous rows. type Feedback struct { ID string `json:"id"` UserID *string `json:"user_id,omitempty"` Category string `json:"category"` Message string `json:"message"` ContactEmail *string `json:"contact_email,omitempty"` CreatedAt time.Time `json:"created_at"` // ResolvedAt is set the moment an admin presses "Mark resolved" on // the /stats page. NULL while open. The action is one-way — the // repo's MarkResolved guards on `resolved_at IS NULL` so a second // resolve is a no-op. ResolvedAt *time.Time `json:"resolved_at,omitempty"` AuthorHandle *string `json:"author_handle,omitempty"` AuthorName *string `json:"author_name,omitempty"` AuthorEmail *string `json:"-"` // server-side only; never serialised }