Skip to content

Commit f912a34

Browse files
vanadium23claude
andcommitted
fix: handle NULL values in book database queries
Author, publisher, isbn, cover_path, and series columns can be NULL in the database but were scanned into non-nullable string fields. Changed to use sql.NullString for these fields in List, GetById, GetByFileHash, and Search methods. Fixes 500 error on /books/ page when database contains NULL values. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 48d27da commit f912a34

1 file changed

Lines changed: 84 additions & 4 deletions

File tree

internal/library/book_postgres.go

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,12 @@ func (bdr *BookDatabaseRepo) List(ctx context.Context,
119119
var book entity.Book
120120
var seriesIndex decimal.NullDecimal
121121
var summary sql.NullString
122-
err = rows.Scan(&book.ID, &book.Title, &book.Author, &book.Publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &book.ISBN, &book.FilePath, &book.DocumentID, &book.CoverPath, &book.Series, &seriesIndex, &summary)
122+
var author sql.NullString
123+
var publisher sql.NullString
124+
var isbn sql.NullString
125+
var coverPath sql.NullString
126+
var series sql.NullString
127+
err = rows.Scan(&book.ID, &book.Title, &author, &publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &isbn, &book.FilePath, &book.DocumentID, &coverPath, &series, &seriesIndex, &summary)
123128
if err != nil {
124129
return nil, fmt.Errorf("BookDatabaseRepo - List - rows.Scan: %w", err)
125130
}
@@ -129,6 +134,21 @@ func (bdr *BookDatabaseRepo) List(ctx context.Context,
129134
if summary.Valid {
130135
book.Description = summary.String
131136
}
137+
if author.Valid {
138+
book.Author = author.String
139+
}
140+
if publisher.Valid {
141+
book.Publisher = publisher.String
142+
}
143+
if isbn.Valid {
144+
book.ISBN = isbn.String
145+
}
146+
if coverPath.Valid {
147+
book.CoverPath = coverPath.String
148+
}
149+
if series.Valid {
150+
book.Series = series.String
151+
}
132152
books = append(books, book)
133153
}
134154

@@ -148,7 +168,12 @@ func (bdr *BookDatabaseRepo) GetById(ctx context.Context, id string) (entity.Boo
148168
var book entity.Book
149169
var seriesIndex decimal.NullDecimal
150170
var summary sql.NullString
151-
err := row.Scan(&book.ID, &book.Title, &book.Author, &book.Publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &book.ISBN, &book.FilePath, &book.DocumentID, &book.CoverPath, &book.Series, &seriesIndex, &summary)
171+
var author sql.NullString
172+
var publisher sql.NullString
173+
var isbn sql.NullString
174+
var coverPath sql.NullString
175+
var series sql.NullString
176+
err := row.Scan(&book.ID, &book.Title, &author, &publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &isbn, &book.FilePath, &book.DocumentID, &coverPath, &series, &seriesIndex, &summary)
152177
if err != nil {
153178
return entity.Book{}, fmt.Errorf("BookDatabaseRepo - Get - r.Pool.QueryRow: %w", err)
154179
}
@@ -158,6 +183,21 @@ func (bdr *BookDatabaseRepo) GetById(ctx context.Context, id string) (entity.Boo
158183
if summary.Valid {
159184
book.Description = summary.String
160185
}
186+
if author.Valid {
187+
book.Author = author.String
188+
}
189+
if publisher.Valid {
190+
book.Publisher = publisher.String
191+
}
192+
if isbn.Valid {
193+
book.ISBN = isbn.String
194+
}
195+
if coverPath.Valid {
196+
book.CoverPath = coverPath.String
197+
}
198+
if series.Valid {
199+
book.Series = series.String
200+
}
161201

162202
return book, nil
163203
}
@@ -175,7 +215,12 @@ func (bdr *BookDatabaseRepo) GetByFileHash(ctx context.Context, fileHash string)
175215
var book entity.Book
176216
var seriesIndex decimal.NullDecimal
177217
var summary sql.NullString
178-
err := row.Scan(&book.ID, &book.Title, &book.Author, &book.Publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &book.ISBN, &book.FilePath, &book.DocumentID, &book.CoverPath, &book.Series, &seriesIndex, &summary)
218+
var author sql.NullString
219+
var publisher sql.NullString
220+
var isbn sql.NullString
221+
var coverPath sql.NullString
222+
var series sql.NullString
223+
err := row.Scan(&book.ID, &book.Title, &author, &publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &isbn, &book.FilePath, &book.DocumentID, &coverPath, &series, &seriesIndex, &summary)
179224
if err != nil {
180225
return entity.Book{}, fmt.Errorf("BookDatabaseRepo - GetByFileHash - r.Pool.QueryRow: %w", err)
181226
}
@@ -185,6 +230,21 @@ func (bdr *BookDatabaseRepo) GetByFileHash(ctx context.Context, fileHash string)
185230
if summary.Valid {
186231
book.Description = summary.String
187232
}
233+
if author.Valid {
234+
book.Author = author.String
235+
}
236+
if publisher.Valid {
237+
book.Publisher = publisher.String
238+
}
239+
if isbn.Valid {
240+
book.ISBN = isbn.String
241+
}
242+
if coverPath.Valid {
243+
book.CoverPath = coverPath.String
244+
}
245+
if series.Valid {
246+
book.Series = series.String
247+
}
188248

189249
return book, nil
190250
}
@@ -289,7 +349,12 @@ func (bdr *BookDatabaseRepo) Search(ctx context.Context, query entity.SearchQuer
289349
var book entity.Book
290350
var seriesIndex decimal.NullDecimal
291351
var summary sql.NullString
292-
err = rows.Scan(&book.ID, &book.Title, &book.Author, &book.Publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &book.ISBN, &book.FilePath, &book.DocumentID, &book.CoverPath, &book.Series, &seriesIndex, &summary)
352+
var author sql.NullString
353+
var publisher sql.NullString
354+
var isbn sql.NullString
355+
var coverPath sql.NullString
356+
var series sql.NullString
357+
err = rows.Scan(&book.ID, &book.Title, &author, &publisher, &book.Year, &book.CreatedAt, &book.UpdatedAt, &isbn, &book.FilePath, &book.DocumentID, &coverPath, &series, &seriesIndex, &summary)
293358
if err != nil {
294359
return nil, fmt.Errorf("BookDatabaseRepo - Search - rows.Scan: %w", err)
295360
}
@@ -299,6 +364,21 @@ func (bdr *BookDatabaseRepo) Search(ctx context.Context, query entity.SearchQuer
299364
if summary.Valid {
300365
book.Description = summary.String
301366
}
367+
if author.Valid {
368+
book.Author = author.String
369+
}
370+
if publisher.Valid {
371+
book.Publisher = publisher.String
372+
}
373+
if isbn.Valid {
374+
book.ISBN = isbn.String
375+
}
376+
if coverPath.Valid {
377+
book.CoverPath = coverPath.String
378+
}
379+
if series.Valid {
380+
book.Series = series.String
381+
}
302382
books = append(books, book)
303383
}
304384

0 commit comments

Comments
 (0)