feat(router): Register ProcessingIssuesHandler in router configuration

Wire up the ProcessingIssuesHandler throughout the application:

cmd/server/main.go:
- Remove obsolete commented-out getTemplateUserWithTheme function
- Instantiate ProcessingIssuesHandler with database queries
- Add handler to router Config (with field alignment cleanup)

internal/router/router.go:
- Add ProcessingIssuesHandler field to router Config struct
- Reformat Config struct for better field alignment

This enables the processing issues API endpoints for listing and getting
statistics about issues within libraries, integrated with the admin UI.
This commit is contained in:
2026-04-13 09:24:14 -04:00
parent 67b3282831
commit 9694475738
2 changed files with 59 additions and 93 deletions
+29 -64
View File
@@ -29,43 +29,6 @@ func (cv *CustomValidator) Validate(i interface{}) error {
return cv.validator.Struct(i) return cv.validator.Struct(i)
} }
// TODO: templates package was removed during router refactor
// This function is unused and should be removed or updated
/*
func getTemplateUserWithTheme(c echo.Context, queries *database.Queries) (templates.User, error) {
// Get the user from context
userID := c.Get("user_id")
if userID == nil {
return templates.User{}, fmt.Errorf("user not authenticated")
}
// Convert to UUID
userUUID, err := uuid.Parse(userID.(string))
if err != nil {
return templates.User{}, fmt.Errorf("invalid user ID: %w", err)
}
// Fetch user from database
userDB, err := queries.GetUser(c.Request().Context(), pgtype.UUID{Bytes: userUUID, Valid: true})
if err != nil {
return templates.User{}, err
}
userTheme := "tokyo-night"
if userDB.Theme.Valid {
userTheme = userDB.Theme.String
}
return templates.User{
ID: userID,
Email: userEmail,
Username: userUsername,
Role: userRole,
Theme: userTheme,
}, nil
}
*/
func main() { func main() {
cfg := config.LoadConfig() cfg := config.LoadConfig()
@@ -94,6 +57,7 @@ func main() {
libraryHandler := handlers.NewLibraryHandler(queries) libraryHandler := handlers.NewLibraryHandler(queries)
deviceHandler := handlers.NewDeviceHandler(queries, cfg.JWTSecret, cfg) deviceHandler := handlers.NewDeviceHandler(queries, cfg.JWTSecret, cfg)
deviceAuthMiddleware := middleware.NewDeviceAuthMiddleware(queries) deviceAuthMiddleware := middleware.NewDeviceAuthMiddleware(queries)
processingIssuesHandler := handlers.NewProcessingIssuesHandler(queries)
// Create WebSocket connection manager // Create WebSocket connection manager
connManager := sync.NewConnectionManager() connManager := sync.NewConnectionManager()
@@ -164,33 +128,34 @@ func main() {
// ROUTER REGISTRATION - Migrate routes to internal/router/ package // ROUTER REGISTRATION - Migrate routes to internal/router/ package
// ======================================================================== // ========================================================================
routerConfig := &router.Config{ routerConfig := &router.Config{
Echo: e, Echo: e,
Queries: queries, Queries: queries,
Cfg: cfg, Cfg: cfg,
DBPool: dbPool, DBPool: dbPool,
AuthHandler: authHandler, AuthHandler: authHandler,
LibraryHandler: libraryHandler, LibraryHandler: libraryHandler,
DeviceHandler: deviceHandler, DeviceHandler: deviceHandler,
MediaHandler: mediaHandler, MediaHandler: mediaHandler,
MatchingHandler: matchingHandler, MatchingHandler: matchingHandler,
KOReaderHandler: koreaderHandler, ProcessingIssuesHandler: processingIssuesHandler,
WSHandler: wsHandler, KOReaderHandler: koreaderHandler,
ConflictHandler: conflictHandler, WSHandler: wsHandler,
AnalyticsHandler: analyticsHandler, ConflictHandler: conflictHandler,
QueueHandler: queueHandler, AnalyticsHandler: analyticsHandler,
CollectionHandler: collectionHandler, QueueHandler: queueHandler,
FiltersHandler: filtersHandler, CollectionHandler: collectionHandler,
DashboardHandler: dashboardHandler, FiltersHandler: filtersHandler,
DashboardService: dashboardService, DashboardHandler: dashboardHandler,
OPDSHandler: opdsHandler, DashboardService: dashboardService,
Worker: worker, OPDSHandler: opdsHandler,
SystemSettingsHandler: systemSettingsHandler, Worker: worker,
SidecarHandler: sidecarHandler, SystemSettingsHandler: systemSettingsHandler,
ConnManager: connManager, SidecarHandler: sidecarHandler,
QueueProcessor: queueProcessor, ConnManager: connManager,
DeviceAuthMiddleware: deviceAuthMiddleware, QueueProcessor: queueProcessor,
JobsHandler: jobsHandler, DeviceAuthMiddleware: deviceAuthMiddleware,
LoginTracker: loginAttemptTracker, JobsHandler: jobsHandler,
LoginTracker: loginAttemptTracker,
} }
// Register all routes and get ebook handler // Register all routes and get ebook handler
+30 -29
View File
@@ -36,35 +36,36 @@ func (cv *CustomValidator) Validate(i interface{}) error {
// Config holds all dependencies needed for route registration // Config holds all dependencies needed for route registration
type Config struct { type Config struct {
Echo *echo.Echo Echo *echo.Echo
Queries *database.Queries Queries *database.Queries
Cfg *config.Config Cfg *config.Config
DBPool interface{} // pgxpool.Pool interface DBPool interface{} // pgxpool.Pool interface
AuthHandler *handlers.AuthHandler AuthHandler *handlers.AuthHandler
LibraryHandler *handlers.LibraryHandler LibraryHandler *handlers.LibraryHandler
DeviceHandler *handlers.DeviceHandler DeviceHandler *handlers.DeviceHandler
MediaHandler *handlers.MediaHandler MediaHandler *handlers.MediaHandler
MatchingHandler *handlers.MatchingHandler MatchingHandler *handlers.MatchingHandler
KOReaderHandler *handlers.KOReaderHandler ProcessingIssuesHandler *handlers.ProcessingIssuesHandler
WSHandler *handlers.WSHandler KOReaderHandler *handlers.KOReaderHandler
ConflictHandler *handlers.ConflictHandler WSHandler *handlers.WSHandler
AnalyticsHandler *handlers.AnalyticsHandler ConflictHandler *handlers.ConflictHandler
QueueHandler *handlers.QueueHandler AnalyticsHandler *handlers.AnalyticsHandler
CollectionHandler *handlers.CollectionHandler QueueHandler *handlers.QueueHandler
Worker *services.Worker CollectionHandler *handlers.CollectionHandler
FiltersHandler *handlers.FiltersHandler Worker *services.Worker
DashboardHandler *handlers.DashboardHandler FiltersHandler *handlers.FiltersHandler
DashboardService *services.DashboardService DashboardHandler *handlers.DashboardHandler
OPDSHandler *handlers.OPDSHandler DashboardService *services.DashboardService
SystemSettingsHandler *handlers.SystemSettingsHandler OPDSHandler *handlers.OPDSHandler
ConnManager *sync.ConnectionManager SystemSettingsHandler *handlers.SystemSettingsHandler
QueueProcessor *sync.SyncQueueProcessor ConnManager *sync.ConnectionManager
DeviceAuthMiddleware *middleware.DeviceAuthMiddleware QueueProcessor *sync.SyncQueueProcessor
LoginTracker *ratelimit.LoginAttemptTracker DeviceAuthMiddleware *middleware.DeviceAuthMiddleware
ScannerHandler *handlers.Handler LoginTracker *ratelimit.LoginAttemptTracker
JobsHandler *handlers.JobsHandler ScannerHandler *handlers.Handler
SidecarHandler *handlers.SidecarHandler JobsHandler *handlers.JobsHandler
ReaderHandler *handlers.ReaderHandler SidecarHandler *handlers.SidecarHandler
ReaderHandler *handlers.ReaderHandler
} }
// createJWTMiddleware creates a JWT middleware with proper user context setup // createJWTMiddleware creates a JWT middleware with proper user context setup