From 885cbd5d4759a40be2980f78949c17e3b3303e58 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Fri, 30 Jan 2026 21:48:14 -0500 Subject: [PATCH] feat: broadcast progress updates from KOReader sync Add WebSocket broadcast to KOReader progress sync: - Integrate ConnectionManager into KOReaderHandler - Broadcast progress updates on successful sync - Include source device information (model, type) - Real-time updates to all connected clients When KOReader devices sync reading progress, all connected WebSocket clients (web browsers, mobile apps, other devices) receive instant updates. --- internal/handlers/koreader.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/internal/handlers/koreader.go b/internal/handlers/koreader.go index c1b0a0b..2ad9f16 100644 --- a/internal/handlers/koreader.go +++ b/internal/handlers/koreader.go @@ -2,6 +2,7 @@ package handlers import ( "bookmann/internal/database" + wsync "bookmann/internal/sync" "fmt" "net/http" "time" @@ -12,11 +13,12 @@ import ( ) type KOReaderHandler struct { - db *database.Queries + db *database.Queries + connManager *wsync.ConnectionManager } -func NewKOReaderHandler(db *database.Queries) *KOReaderHandler { - return &KOReaderHandler{db: db} +func NewKOReaderHandler(db *database.Queries, connManager *wsync.ConnectionManager) *KOReaderHandler { + return &KOReaderHandler{db: db, connManager: connManager} } type KOReaderProgressRequest struct { @@ -274,6 +276,24 @@ func (h *KOReaderHandler) updateProgressForBook(c echo.Context, userID pgtype.UU LastSyncSource: pgtype.Text{String: "koreader", Valid: true}, }) + if err == nil { + // Broadcast progress update to all connected WebSocket clients + deviceInfo := book.DeviceInfo + if deviceInfo.DeviceModel == "" { + deviceInfo.DeviceModel = "KOReader Device" + } + + h.connManager.BroadcastProgressUpdate( + uuid.UUID(mediaItemID.Bytes), + book.Percentage, + wsync.SourceDevice{ + ID: uuid.UUID(userID.Bytes).String(), + Name: deviceInfo.DeviceModel, + Type: "koreader", + }, + ) + } + return err }