From a4962a87b21e119969c9c14070dfadf54b1fb54b Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Thu, 23 Apr 2026 20:39:50 -0400 Subject: [PATCH] fix: replace invalid new(expression) calls with proper pointer allocation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Go's new() builtin takes a type and allocates a zero value — it cannot wrap an expression. All instances of new(someExpression) were compile errors. Replace each with a local variable assignment and address-of operator. Affected files: - handlers/koreader.go: progress field pointers (Chapter, Page, etc.) - handlers/kobo.go: pagesRemaining pointer - handlers/queue.go: uuidPtrToString and timestamptzPtrToString helpers - router/reader.go: bookmark pageNumber and chapterNumber pointers - services/media_scanner.go: validation error message pointers - services/worker.go: StartedAt and CompletedAt timestamps - sync/offline.go: GetDeviceStatus return pointer - tests/device_test.go: SyncEnabled and SyncFrequencyMinutes pointers --- cmd/server/tests/device_test.go | 6 ++++-- internal/handlers/kobo.go | 3 ++- internal/handlers/koreader.go | 18 ++++++++++++------ internal/handlers/queue.go | 6 ++++-- internal/services/media_scanner.go | 15 +++++++++------ internal/services/worker.go | 6 ++++-- internal/sync/offline.go | 3 ++- 7 files changed, 37 insertions(+), 20 deletions(-) diff --git a/cmd/server/tests/device_test.go b/cmd/server/tests/device_test.go index d028251..5372314 100644 --- a/cmd/server/tests/device_test.go +++ b/cmd/server/tests/device_test.go @@ -147,10 +147,12 @@ func TestUpdateDevice(t *testing.T) { device := setup.CreateDevice(t, "Test Device", "koreader", "test-device-123") // Update device + syncEnabled := false + syncFreq := int32(10) updateRequest := handlers.DeviceUpdateRequest{ DeviceName: "Updated Device Name", - SyncEnabled: new(false), - SyncFrequencyMinutes: new(int32(10)), + SyncEnabled: &syncEnabled, + SyncFrequencyMinutes: &syncFreq, } updateBody, _ := json.Marshal(updateRequest) diff --git a/internal/handlers/kobo.go b/internal/handlers/kobo.go index 191ed48..5f22877 100644 --- a/internal/handlers/kobo.go +++ b/internal/handlers/kobo.go @@ -303,7 +303,8 @@ func (h *KoboHandler) Initialization(c *echo.Context) error { lastModified = progress.LastReadAt.Time.Format(time.RFC3339) } if progress.TotalPages.Valid && progress.CurrentPage.Valid { - pagesRemaining = new(int(progress.TotalPages.Int32 - progress.CurrentPage.Int32)) + remaining := int(progress.TotalPages.Int32 - progress.CurrentPage.Int32) + pagesRemaining = &remaining } } diff --git a/internal/handlers/koreader.go b/internal/handlers/koreader.go index 9f87cd8..1b53445 100644 --- a/internal/handlers/koreader.go +++ b/internal/handlers/koreader.go @@ -602,19 +602,24 @@ func (h *KOReaderHandler) GetMetadata(c *echo.Context) error { progressData.Epubcfi = &progress.Epubcfi.String } if progress.Chapter.Valid { - progressData.Chapter = new(int(progress.Chapter.Int32)) + progress := int(progress.Chapter.Int32) + progressData.Chapter = &progress } if progress.ChapterProgress.Valid { - progressData.ChapterProgress = new(progress.ChapterProgress.Float64) + progress := progress.ChapterProgress.Float64 + progressData.ChapterProgress = &progress } if progress.CharacterOffset.Valid { - progressData.Character = new(progress.CharacterOffset.Int64) + progress := progress.CharacterOffset.Int64 + progressData.Character = &progress } if progress.CurrentPage.Valid { - progressData.Page = new(int(progress.CurrentPage.Int32)) + progress := int(progress.CurrentPage.Int32) + progressData.Page = &progress } if progress.TotalPages.Valid { - progressData.TotalPages = new(int(progress.TotalPages.Int32)) + progress := int(progress.TotalPages.Int32) + progressData.TotalPages = &progress } annotations, err := h.db.GetAnnotationsForBook(c.Request().Context(), database.GetAnnotationsForBookParams{ @@ -694,7 +699,8 @@ func (h *KOReaderHandler) GetLibrary(c *echo.Context) error { if err == nil { percentRead = progress.Percentage.Float64 if progress.TotalPages.Valid && progress.CurrentPage.Valid { - pagesRemaining = new(int(progress.TotalPages.Int32 - progress.CurrentPage.Int32)) + pages := int(progress.TotalPages.Int32 - progress.CurrentPage.Int32) + pagesRemaining = &pages } if progress.LastReadAt.Valid { lastModified = progress.LastReadAt.Time.Format(time.RFC3339) diff --git a/internal/handlers/queue.go b/internal/handlers/queue.go index dcf7f85..c6b02a2 100644 --- a/internal/handlers/queue.go +++ b/internal/handlers/queue.go @@ -310,7 +310,8 @@ func uuidPtrToString(u pgtype.UUID) *string { if !u.Valid { return nil } - return new(uuid.UUID(u.Bytes).String()) + s := uuid.UUID(u.Bytes).String() + return &s } func textPtrToString(t pgtype.Text) *string { @@ -324,5 +325,6 @@ func timestamptzPtrToString(t pgtype.Timestamptz) *string { if !t.Valid { return nil } - return new(t.Time.Format("2006-01-02T15:04:05Z07:00")) + timeFormat := t.Time.Format("2006-01-02T15:04:05Z07:00") + return &timeFormat } diff --git a/internal/services/media_scanner.go b/internal/services/media_scanner.go index 367bfdc..ceb7faf 100644 --- a/internal/services/media_scanner.go +++ b/internal/services/media_scanner.go @@ -1320,12 +1320,13 @@ func (s *MediaScanner) ValidateMediaItemForLibrary( // Must be fixed-layout or comic archive if mediaItem.FormatGroup != "fixed_layout" && mediaItem.FormatGroup != "comic_archive" { - return new(fmt.Sprintf( + str := fmt.Sprintf( "EPUB file '%s' is reflowable (text-based), not fixed-layout (image-based). "+ "Manga library only accepts fixed-layout EPUBs, CBZ, CBR, or image files. "+ "Consider moving this file to an ebooks library.", mediaItem.Title, - )) + ) + return &str } // Set manga-specific flags for fixed-layout EPUBs @@ -1350,11 +1351,12 @@ func (s *MediaScanner) ValidateMediaItemForLibrary( // Accept comic archives and fixed-layout if mediaItem.FormatGroup != "comic_archive" && mediaItem.FormatGroup != "fixed_layout" { - return new(fmt.Sprintf( + str := fmt.Sprintf( "File '%s' is not a comic archive format. "+ "Comics library only accepts CBZ, CBR, CB7, CBT, PDF, or fixed-layout EPUBs.", mediaItem.Title, - )) + ) + return &str } } @@ -1363,11 +1365,12 @@ func (s *MediaScanner) ValidateMediaItemForLibrary( // Flag manga for potential reorganization (info level) if mediaItem.FormatGroup == "fixed_layout" && (!mediaItem.MangaType.Valid || mediaItem.MangaType.String == "yes" || mediaItem.MangaType.String == "yes_and_right_to_left") { - return new(fmt.Sprintf( + str := fmt.Sprintf( "File '%s' appears to be manga (fixed-layout with images). "+ "Consider moving to a manga or comics library for better organization.", mediaItem.Title, - )) + ) + return &str } } diff --git a/internal/services/worker.go b/internal/services/worker.go index 0341daf..050adf0 100644 --- a/internal/services/worker.go +++ b/internal/services/worker.go @@ -221,7 +221,8 @@ func (w *Worker) processJob(job *Job) { } w.mu.Unlock() - job.StartedAt = new(time.Now()) + started := time.Now() + job.StartedAt = &started w.mu.Lock() if result, exists := w.results[job.ID]; exists { @@ -253,7 +254,8 @@ func (w *Worker) processJob(job *Job) { err = fmt.Errorf("unknown job type: %s", job.Type) } - job.CompletedAt = new(time.Now()) + completed := time.Now() + job.CompletedAt = &completed job.Error = err job.Result = result diff --git a/internal/sync/offline.go b/internal/sync/offline.go index 167ecff..0c722e1 100644 --- a/internal/sync/offline.go +++ b/internal/sync/offline.go @@ -226,7 +226,8 @@ func (d *OfflineDetector) GetDeviceStatus(ctx context.Context, deviceID pgtype.U return nil, err } - return new(d.getDeviceStatus(device)), nil + deviceStatus := d.getDeviceStatus(device) + return &deviceStatus, nil } func (d *OfflineDetector) ListOfflineDevices(ctx context.Context) ([]DeviceOnlineStatus, error) {