fix: address code review findings

- Fix notifications_sent schema: change to composite PK (rgid, sent_at) per plan spec, remove FK constraint
- Change MarkNotificationSent from INSERT OR REPLACE to INSERT (composite PK semantics)
- Update test: replace idempotent test with duplicate-second and different-time tests
- Refactor UpdateArtistSettings to use switch-based column validation instead of fmt.Sprintf with map lookup
- Remove generated coverage.out from repo, add to .gitignore

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 11:23:22 +03:00
parent 47d4ec4e32
commit c23b698f67
6 changed files with 91 additions and 163 deletions

View File

@@ -57,33 +57,48 @@ func GetAllArtistSettings(db *DB) ([]ArtistSettings, error) {
// UpdateArtistSettings updates specific fields of an artist_settings row by ID.
// The updates map keys must match column names: "name", "ignore_singles", "ignore_compilations", "monitored".
func UpdateArtistSettings(db *DB, id string, updates map[string]interface{}) error {
// Build the SET clause dynamically from the provided updates.
allowed := map[string]bool{
"name": true,
"ignore_singles": true,
"ignore_compilations": true,
"monitored": true,
if len(updates) == 0 {
return fmt.Errorf("no updates provided")
}
// Build the query using a fixed set of allowed columns to avoid dynamic SQL.
const baseQuery = "UPDATE artist_settings SET"
var args []interface{}
setClause := ""
for col, val := range updates {
if !allowed[col] {
switch col {
case "name":
if setClause != "" {
setClause += ", "
}
setClause += "name = ?"
args = append(args, val)
case "ignore_singles":
if setClause != "" {
setClause += ", "
}
setClause += "ignore_singles = ?"
args = append(args, val)
case "ignore_compilations":
if setClause != "" {
setClause += ", "
}
setClause += "ignore_compilations = ?"
args = append(args, val)
case "monitored":
if setClause != "" {
setClause += ", "
}
setClause += "monitored = ?"
args = append(args, val)
default:
return fmt.Errorf("unknown column: %s", col)
}
if setClause != "" {
setClause += ", "
}
setClause += col + " = ?"
args = append(args, val)
}
if len(args) == 0 {
return fmt.Errorf("no updates provided")
}
args = append(args, id)
query := fmt.Sprintf("UPDATE artist_settings SET %s WHERE id = ?", setClause)
query := fmt.Sprintf("%s %s WHERE id = ?", baseQuery, setClause)
result, err := db.Conn().Exec(query, args...)
if err != nil {
return fmt.Errorf("update artist settings: %w", err)