docs: server comments say what the code does, not how it came to be (#6277)
Comment blocks in cmd/minstrel and 30 smaller internal packages, rewritten
to rule 32's standard with each citation read in context: task, milestone
and rule ids go, and so do the stories they were attached to ("used to",
"Before #N", measurements from one install, quotes, pointers to Fabled
Librarian's records and to docs/superpowers files that are not in the
repo). Where a story wrapped a real constraint, the constraint stays as a
present-tense fact.
Comments that had gone stale are corrected:
- taste.Config: the tuned values are overlaid by internal/recsettings;
it is no longer "a later follow-up".
- StorageConfig: the data dir holds art, caches and the stream secret,
not only playlist covers.
- the Subsonic album list and getUser comments describe what they do
today rather than a milestone that would change it.
Checked: the non-comment token stream of every changed file matches
HEAD, and gofmt -l is empty.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -15,10 +15,8 @@ import (
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/mailer"
|
||||
)
|
||||
|
||||
// The email digest (#5346). Nothing is emailed per event. Operator,
|
||||
// 2026-10-08: "music and stuff coming in should land as a summary email and
|
||||
// not everytime same for a approvals the emails should be grouped by a
|
||||
// reasonable amount of time like an hour or so."
|
||||
// The email digest. Nothing is emailed per event: a steady stream of new
|
||||
// music or approvals would otherwise be a stream of emails.
|
||||
//
|
||||
// - EmailSummary kinds (new music) go out at most once a day, at the summary
|
||||
// hour in the user's own timezone, listing everything since the last one.
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
|
||||
)
|
||||
|
||||
// EmailSettings are the digest's two knobs, in admin Settings (rule 25).
|
||||
// EmailSettings are the digest's two knobs, edited in admin Settings.
|
||||
type EmailSettings struct {
|
||||
// SummaryHour is the local hour (0-23, in each user's own timezone) the
|
||||
// daily new-music summary goes out.
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
// Package notifications is the one writer of the per-user notifications inbox
|
||||
// (M489, #726). Producers across the server call Notifier.Notify; nothing else
|
||||
// Package notifications is the one writer of the per-user notifications
|
||||
// inbox. Producers across the server call Notifier.Notify; nothing else
|
||||
// inserts into user_notifications.
|
||||
//
|
||||
// The event bus alone was fire-and-forget: a client that was not connected
|
||||
// when a request completed, or when tracks went missing, never heard of it. A
|
||||
// row here is the durable record. The bus only nudges open clients to come
|
||||
// and read it.
|
||||
// The event bus is fire-and-forget: a client that is not connected when a
|
||||
// request completes, or when tracks go missing, never hears of it. A row here
|
||||
// is the durable record. The bus only nudges open clients to come and read
|
||||
// it.
|
||||
package notifications
|
||||
|
||||
// Kind names one sort of notification. The set is CHECK-gated in migration
|
||||
// 0073, swapped since by 0075 (rule 36): a new kind adds its value in a
|
||||
// migration of the same change, and TestEveryKindPassesTheSchemaChecks
|
||||
// fails until it does.
|
||||
// Kind names one sort of notification. The set is CHECK-gated in the schema:
|
||||
// a new kind adds its value (DROP + ADD of the CHECK) in a migration of the
|
||||
// same change, and TestEveryKindPassesTheSchemaChecks fails until it does.
|
||||
type Kind string
|
||||
|
||||
const (
|
||||
@@ -23,9 +22,8 @@ const (
|
||||
KindScanFailed Kind = "scan_failed"
|
||||
KindTracksMissing Kind = "tracks_missing"
|
||||
KindDuplicatesFound Kind = "duplicates_found"
|
||||
// KindDuplicatesResolved: the duplicate resolver (M498) merged copies on
|
||||
// its own. The operator asked for that to
|
||||
// happen automatically; this is how it stays visible.
|
||||
// KindDuplicatesResolved: the duplicate resolver merged copies on its
|
||||
// own. This is how an automatic merge stays visible.
|
||||
KindDuplicatesResolved Kind = "duplicates_resolved"
|
||||
KindPlaybackErrors Kind = "playback_errors"
|
||||
)
|
||||
|
||||
@@ -17,7 +17,7 @@ import (
|
||||
// row lands for them. It is a nudge with no content: the client fetches the
|
||||
// inbox. A frame that carried the notification could not be told apart from
|
||||
// a repeat after a reconnect, and a frame nobody received is then one nobody
|
||||
// needed, because the client pulls on reconnect anyway (Roundtable #2535).
|
||||
// needed, because the client pulls on reconnect anyway.
|
||||
const EventCreated = "notification.created"
|
||||
|
||||
// Recipients names who an event is for.
|
||||
|
||||
@@ -146,9 +146,9 @@ func TestNotify_CoalescedCountAddsUpWhileUnread_AndStartsAfreshOnceRead(t *testi
|
||||
require.True(t, rows[1].ReadAt.Valid)
|
||||
}
|
||||
|
||||
// M542: an update says more, newest names first, without arriving again. A
|
||||
// moved created_at was announced again on the phone, and a cleared emailed_at
|
||||
// was emailed again.
|
||||
// An update says more, newest names first, without arriving again: a moved
|
||||
// created_at would announce it again on the phone, and a cleared emailed_at
|
||||
// would email it again.
|
||||
func TestNotify_ACoalescedUpdateMergesNamesAndKeepsItsArrival(t *testing.T) {
|
||||
pool := testPool(t)
|
||||
q := dbq.New(pool)
|
||||
@@ -238,9 +238,9 @@ func TestMarkRead_ScopedToTheOwner_AndIdempotent(t *testing.T) {
|
||||
require.Zero(t, unread)
|
||||
}
|
||||
|
||||
// Every kind the code knows must pass both CHECKs in the real schema. This is
|
||||
// rule 36's guard: a kind added in Go without the migration fails here, not in
|
||||
// production at INSERT time.
|
||||
// Every kind the code knows must pass both CHECKs in the real schema: a kind
|
||||
// added in Go without its migration fails here, not in production at INSERT
|
||||
// time.
|
||||
func TestEveryKindPassesTheSchemaChecks(t *testing.T) {
|
||||
pool := testPool(t)
|
||||
q := dbq.New(pool)
|
||||
|
||||
@@ -42,7 +42,7 @@ type Payload struct {
|
||||
// read.
|
||||
Count int64 `json:"count,omitempty"`
|
||||
// Items name what Count counts, one each, newest first: "Weezer – Buddy
|
||||
// Holly". A coalesced update puts its own in front and keeps ten (M542),
|
||||
// Holly". A coalesced update puts its own in front and keeps ten,
|
||||
// so the body can say which, not only how many.
|
||||
Items []string `json:"items,omitempty"`
|
||||
// Detail is free text: scan_failed's error message. Rows from before
|
||||
|
||||
@@ -45,7 +45,7 @@ func TestRender_CoalescedCountsReadNaturally(t *testing.T) {
|
||||
require.Equal(t, "Some tracks went missing", Render(KindTracksMissing, []byte(`{}`)).Title)
|
||||
}
|
||||
|
||||
// M542: a notice says which, not only how many.
|
||||
// A notice says which, not only how many.
|
||||
func TestRender_NamesWhatChanged(t *testing.T) {
|
||||
require.Equal(t, "No longer on disk: Weezer – Buddy Holly.",
|
||||
render(KindTracksMissing, Payload{Count: 1, Items: []string{"Weezer – Buddy Holly"}}).Body)
|
||||
|
||||
Reference in New Issue
Block a user