package handlers import ( "bookhoard/internal/config" "bookhoard/internal/database" "bookhoard/internal/services" wsync "bookhoard/internal/sync" "context" "sync" "time" "github.com/labstack/echo/v5" ) type Handler struct { db *database.Queries scanner *services.MediaScanner worker *services.Worker queueProcessor *wsync.SyncQueueProcessor queueCtx context.Context queueCancel context.CancelFunc ctx context.Context cancel context.CancelFunc mu sync.Mutex watchModeCtx context.Context watchModeCancel context.CancelFunc watchingLibraries map[string]bool connManager *wsync.ConnectionManager cleanupTaskCancel context.CancelFunc config *config.Config } func NewHandler(db *database.Queries, connManager *wsync.ConnectionManager, queueProcessor *wsync.SyncQueueProcessor, cfg *config.Config) *Handler { ctx, cancel := context.WithCancel(context.Background()) worker := services.NewWorker(3, connManager) queueCtx, queueCancel := context.WithCancel(context.Background()) watchCtx, watchCancel := context.WithCancel(context.Background()) return &Handler{ db: db, scanner: services.NewMediaScanner(db), worker: worker, queueProcessor: queueProcessor, queueCtx: queueCtx, queueCancel: queueCancel, ctx: ctx, cancel: cancel, watchModeCtx: watchCtx, watchModeCancel: watchCancel, watchingLibraries: make(map[string]bool), connManager: connManager, } } // parseDate parses a date string in YYYY-MM-DD format func parseDate(dateStr string) time.Time { if dateStr == "" { return time.Time{} } if t, err := time.Parse("2006-01-02", dateStr); err == nil { return t } return time.Time{} } func SetupRoutes(g *echo.Group, db *database.Queries, connManager *wsync.ConnectionManager, queueProcessor *wsync.SyncQueueProcessor, cfg *config.Config) *Handler { return NewHandler(db, connManager, queueProcessor, cfg) }