// Compose the primary web route registrations. const registerAuthRoutes = require('./auth'); const registerPagesRoutes = require('./admin/pages'); const registerAccountRoutes = require('./admin/account'); const registerUsersRoutes = require('./admin/users'); const registerPlaylistRoutes = require('./admin/playlists'); const registerManageRoutes = require('./admin/manage'); const registerScreenCommandRoutes = require('./admin/client-commands'); const registerAnnouncementRoutes = require('./signage/announcements/routes'); const registerContentRoutes = require('./admin/content'); const registerRootDataSourceRoutes = require('./admin/data-sources'); const registerApiSourceRoutes = require('./data-sources/api-sources/routes'); const registerRssFeedRoutes = require('./data-sources/rss-feeds/routes'); const registerTimetableRoutes = require('./data-sources/timetables/routes'); const registerWeatherRoutes = require('./data-sources/weather'); const registerSettingsRoutes = require('./settings/background-tasks'); const registerFontRoutes = require('./settings/fonts'); const registerSettingsPageRoutes = require('./settings/routes'); const registerAuditLogRoutes = require('./settings/audit-log'); const registerAboutRoutes = require('./settings/about/routes'); const registerInternalSyncRoutes = require('./internal/sync'); const registerScreensRoutes = require('./signage/screens/routes'); const registerOnboardingRoutes = require('./onboarding'); const { PERMISSIONS, normalizePermissionKeys } = require('#src/rbac'); function registerRoutes(app, deps) { // Group routes by the dependency bundle they need. registerAuthAndAccountRoutes(app, deps); registerOnboardingRoutes(app, { pool: deps.pool, playerInternalBaseUrl: deps.playerInternalBaseUrl, requirePermission: deps.requirePermission }); registerSignageRoutes(app, deps); registerSettingsAndContentRoutes(app, deps); registerSettingsPageRoutes(app, { pool: deps.pool, pages: deps.pages, mediaDir: deps.mediaDir, requirePermission: deps.requirePermission, recordRequestAuditEvent: deps.recordRequestAuditEvent ,sendAccountEmail: deps.sendAccountEmail ,createOneTimeToken: deps.createOneTimeToken }); registerAuditLogRoutes(app, { pool: deps.pool, formatDashboardDate: deps.formatDashboardDate, setAuthMessageCookie: deps.setAuthMessageCookie }); registerAboutRoutes(app, deps); registerInternalSyncRoutes(app, { pool: deps.pool, backgroundTaskQueue: deps.backgroundTaskQueue, uploadSyncService: deps.uploadSyncService, mediaDir: deps.mediaDir }); registerScreensRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, mediaDir: deps.mediaDir, formatDashboardDate: deps.formatDashboardDate, buildDashboardState: deps.buildDashboardState, fetchScreensByPlaylistId: deps.fetchScreensByPlaylistId, requirePermission: deps.requirePermission, getScreenDeleteBlockMessage: deps.playerActionService.getScreenDeleteBlockMessage, getScreenConnections: deps.playerActionService.getScreenConnections, }); } function registerAuthAndAccountRoutes(app, deps) { // Auth, profile, and user management routes share the same session helpers. registerAuthRoutes(app, { pool: deps.pool, pages: deps.pages, createUserSession: deps.createUserSession, setSessionCookie: deps.setSessionCookie, getSessionMaxAgeMs: deps.getSessionMaxAgeMs, getConfiguredMaxActiveSessions: deps.getConfiguredMaxActiveSessions, clearSessionCookie: deps.clearSessionCookie, setAuthMessageCookie: deps.setAuthMessageCookie, consumeAuthMessageCookie: deps.consumeAuthMessageCookie, parseCookies: deps.parseCookies, hashSessionToken: deps.hashSessionToken, verifyPassword: deps.verifyPassword, hashPassword: deps.hashPassword, validatePasswordStrength: deps.validatePasswordStrength, sessionCookieName: deps.sessionCookieName, recordRequestAuditEvent: deps.recordRequestAuditEvent ,sendAccountEmail: deps.sendAccountEmail ,createOneTimeToken: deps.createOneTimeToken ,getConnection: deps.pool.getConnection ? deps.pool.getConnection.bind(deps.pool) : null ,rbacData: deps.rbacData }); registerPagesRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, requirePermission: deps.requirePermission, buildDashboardState: deps.buildDashboardState, fetchScreensByPlaylistId: deps.fetchScreensByPlaylistId, getScreenDeleteBlockMessage: deps.playerActionService.getScreenDeleteBlockMessage, getScreenConnections: deps.playerActionService.getScreenConnections, }); registerAccountRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, formatDashboardDate: deps.formatDashboardDate, getAuditUserId: deps.getAuditUserId, verifyPassword: deps.verifyPassword, hashPassword: deps.hashPassword, validatePasswordStrength: deps.validatePasswordStrength, createUserSession: deps.createUserSession, setSessionCookie: deps.setSessionCookie, getSessionMaxAgeMs: deps.getSessionMaxAgeMs, parseCookies: deps.parseCookies, hashSessionToken: deps.hashSessionToken, sessionCookieName: deps.sessionCookieName, recordRequestAuditEvent: deps.recordRequestAuditEvent ,sendAccountEmail: deps.sendAccountEmail ,createOneTimeToken: deps.createOneTimeToken }); registerUsersRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, formatDashboardDate: deps.formatDashboardDate, getAuditUserId: deps.getAuditUserId, hashPassword: deps.hashPassword, validatePasswordStrength: deps.validatePasswordStrength, readArrayField: deps.readArrayField, rbacData: deps.rbacData, requirePermission: deps.requirePermission, recordRequestAuditEvent: deps.recordRequestAuditEvent ,sendAccountEmail: deps.sendAccountEmail ,createOneTimeToken: deps.createOneTimeToken ,hashSessionToken: deps.hashSessionToken ,getRequestOrigin: deps.getRequestOrigin }); } function registerSignageRoutes(app, deps) { // Screen, playlist, and command routes share the player-facing wiring. registerPlaylistRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, fetchOrderedPlaylistSlides: deps.fetchOrderedPlaylistSlides, fetchScreensByPlaylistId: deps.fetchScreensByPlaylistId, fetchPlaylistCanvasId: deps.fetchPlaylistCanvasId, readArrayField: deps.readArrayField, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, notifyPlayerScreens: deps.notifyPlayerScreens, broadcastDashboardState: deps.broadcastDashboardState, getPlaylistDeleteBlockMessage: deps.playerActionService.getPlaylistDeleteBlockMessage, requirePermission: deps.requirePermission, recordRequestAuditEvent: deps.recordRequestAuditEvent }); registerManageRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, notifyPlayerScreens: deps.notifyPlayerScreens, broadcastDashboardState: deps.broadcastDashboardState, getScreenDeleteBlockMessage: deps.playerActionService.getScreenDeleteBlockMessage, getScreenConnections: deps.playerActionService.getScreenConnections, forwardPlayerCommand: deps.playerActionService.forwardPlayerCommand, forwardPlayerCommandToBaseUrl: deps.playerActionService.forwardPlayerCommandToBaseUrl, forwardPlayerCommandToDevice: deps.playerActionService.forwardPlayerCommandToDevice, requirePermission: deps.requirePermission, recordRequestAuditEvent: deps.recordRequestAuditEvent }); registerAnnouncementRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, forwardAnnouncementRefresh: deps.playerActionService.forwardAnnouncementRefresh, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, requirePermission: deps.requirePermission }); registerScreenCommandRoutes(app, { pool: deps.pool, common: deps.common, forwardPlayerCommand: deps.playerActionService.forwardPlayerCommand, forwardPlayerCommandToBaseUrl: deps.playerActionService.forwardPlayerCommandToBaseUrl, forwardPlayerCommandToDevice: deps.playerActionService.forwardPlayerCommandToDevice, getScreenConnections: deps.playerActionService.getScreenConnections, isClientNameAvailable: deps.isClientNameAvailable, findAvailableClientName: deps.findAvailableClientName, withClientNameReservation: deps.withClientNameReservation, broadcastDashboardState: deps.broadcastDashboardState, recordRequestAuditEvent: deps.recordRequestAuditEvent, requirePermission: deps.requirePermission }); } function registerSettingsAndContentRoutes(app, deps) { // Content, data-source, RBAC, and settings routes share the admin-side services. const registerRbacRoutes = require('./admin/rbac'); registerRbacRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, getAuditUserId: deps.getAuditUserId, rbacData: deps.rbacData, readArrayField: deps.readArrayField, permissions: PERMISSIONS, normalizePermissionKeys: normalizePermissionKeys, requirePermission: deps.requirePermission, recordRequestAuditEvent: deps.recordRequestAuditEvent }); registerContentRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, upload: deps.upload, uploadDir: deps.uploadDir, fetchScreensBySlideId: deps.fetchScreensBySlideId, fetchScreensByTemplateId: deps.fetchScreensByTemplateId, collectUploadReferencesFromSlide: deps.collectUploadReferencesFromSlide, collectUploadReferencesFromTemplate: deps.collectUploadReferencesFromTemplate, collectUploadReferencesFromPayload: deps.collectUploadReferencesFromPayload, removeUnusedUploadFiles: deps.removeUnusedUploadFiles, syncPlaylistUploadsOnChange: deps.syncPlaylistUploadsOnChange, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, notifyPlayerScreens: deps.notifyPlayerScreens, broadcastDashboardState: deps.broadcastDashboardState, backgroundTaskQueue: deps.backgroundTaskQueue, hasAnyPermission: deps.hasAnyPermission, setAuthMessageCookie: deps.setAuthMessageCookie, getSlideDeleteBlockMessage: deps.playerActionService.getSlideDeleteBlockMessage, getTemplateDeleteBlockMessage: deps.playerActionService.getTemplateDeleteBlockMessage, getCanvasSizeDeleteBlockMessage: deps.playerActionService.getCanvasSizeDeleteBlockMessage, requirePermission: deps.requirePermission, recordRequestAuditEvent: deps.recordRequestAuditEvent }); registerRootDataSourceRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, formatDashboardDate: deps.formatDashboardDate, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, parseDateTimeLocal: deps.parseDateTimeLocal, backgroundTaskQueue: deps.backgroundTaskQueue, dataSourceTasks: deps.dataSourceTasks, setAuthMessageCookie: deps.setAuthMessageCookie, requirePermission: deps.requirePermission, section: 'root' }); registerApiSourceRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, formatDashboardDate: deps.formatDashboardDate, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, parseDateTimeLocal: deps.parseDateTimeLocal, backgroundTaskQueue: deps.backgroundTaskQueue, dataSourceTasks: deps.dataSourceTasks, setAuthMessageCookie: deps.setAuthMessageCookie, requirePermission: deps.requirePermission }); registerRssFeedRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, formatDashboardDate: deps.formatDashboardDate, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, parseDateTimeLocal: deps.parseDateTimeLocal, backgroundTaskQueue: deps.backgroundTaskQueue, dataSourceTasks: deps.dataSourceTasks, setAuthMessageCookie: deps.setAuthMessageCookie, requirePermission: deps.requirePermission }); registerTimetableRoutes(app, { pool: deps.pool, common: deps.common, pages: deps.pages, formatDashboardDate: deps.formatDashboardDate, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, parseDateTimeLocal: deps.parseDateTimeLocal, backgroundTaskQueue: deps.backgroundTaskQueue, dataSourceTasks: deps.dataSourceTasks, setAuthMessageCookie: deps.setAuthMessageCookie, requirePermission: deps.requirePermission }); registerWeatherRoutes(app, { pool: deps.pool, common: deps.common, getAuditUserId: deps.getAuditUserId, redirectAfterSave: deps.redirectAfterSave, dataSourceTasks: deps.dataSourceTasks, backgroundTaskQueue: deps.backgroundTaskQueue, recordRequestAuditEvent: deps.recordRequestAuditEvent, requirePermission: deps.requirePermission }); registerSettingsRoutes(app, { pages: deps.pages, backgroundTaskQueue: deps.backgroundTaskQueue, setAuthMessageCookie: deps.setAuthMessageCookie }); registerFontRoutes(app, { pool: deps.pool, pages: deps.pages, upload: deps.upload, uploadDir: deps.uploadDir, backgroundTaskQueue: deps.backgroundTaskQueue, setAuthMessageCookie: deps.setAuthMessageCookie, requirePermission: deps.requirePermission }); } module.exports = { registerRoutes };