Release v2.2.0

This commit is contained in:
2026-08-01 21:41:44 +01:00
parent c643d2fb07
commit d6417b667c
673 changed files with 146752 additions and 7389 deletions
+194
View File
@@ -0,0 +1,194 @@
// 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 registerManageRoutes = require('./admin/manage');
const registerScreenCommandRoutes = require('./admin/client-commands');
const registerAnnouncementRoutes = require('./signage/announcements/routes');
const registerContentRoutes = require('./admin/content');
const registerDataSourceRoutes = require('./admin/data-sources');
const registerSettingsRoutes = require('./settings/background-tasks');
const registerFontRoutes = require('./settings/fonts');
const { PERMISSIONS, normalizePermissionKeys } = require('#src/rbac');
function registerRoutes(app, deps) {
// Group routes by the dependency bundle they need.
registerAuthAndAccountRoutes(app, deps);
registerSignageRoutes(app, deps);
registerSettingsAndContentRoutes(app, deps);
}
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,
clearSessionCookie: deps.clearSessionCookie,
setAuthMessageCookie: deps.setAuthMessageCookie,
consumeAuthMessageCookie: deps.consumeAuthMessageCookie,
parseCookies: deps.parseCookies,
hashSessionToken: deps.hashSessionToken,
verifyPassword: deps.verifyPassword,
sessionCookieName: deps.sessionCookieName
});
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,
createUserSession: deps.createUserSession,
setSessionCookie: deps.setSessionCookie
});
registerUsersRoutes(app, {
pool: deps.pool,
common: deps.common,
pages: deps.pages,
formatDashboardDate: deps.formatDashboardDate,
getAuditUserId: deps.getAuditUserId,
hashPassword: deps.hashPassword,
readArrayField: deps.readArrayField,
rbacData: deps.rbacData,
requirePermission: deps.requirePermission
});
}
function registerSignageRoutes(app, deps) {
// Screen, playlist, and command routes share the player-facing wiring.
registerManageRoutes(app, {
pool: deps.pool,
common: deps.common,
pages: deps.pages,
fetchOrderedPlaylistSlides: deps.fetchOrderedPlaylistSlides,
fetchScreensByPlaylistId: deps.fetchScreensByPlaylistId,
fetchPlaylistCanvasSignature: deps.fetchPlaylistCanvasSignature,
getCanvasSignature: deps.getCanvasSignature,
normalizeScheduleMode: deps.normalizeScheduleMode,
parseDateTimeLocal: deps.parseDateTimeLocal,
parseTimeLocal: deps.parseTimeLocal,
readArrayField: deps.readArrayField,
getAuditUserId: deps.getAuditUserId,
redirectAfterSave: deps.redirectAfterSave,
notifyPlayerScreens: deps.notifyPlayerScreens,
broadcastDashboardState: deps.broadcastDashboardState,
getScreenDeleteBlockMessage: deps.playerActionService.getScreenDeleteBlockMessage,
getScreenConnections: deps.playerActionService.getScreenConnections,
getPlaylistDeleteBlockMessage: deps.playerActionService.getPlaylistDeleteBlockMessage,
forwardPlayerCommand: deps.playerActionService.forwardPlayerCommand,
playerPublicBaseUrl: deps.playerPublicBaseUrl,
requirePermission: deps.requirePermission
});
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,
forwardPlayerCommand: deps.playerActionService.forwardPlayerCommand,
getScreenConnections: deps.playerActionService.getScreenConnections,
isClientNameAvailable: deps.isClientNameAvailable,
withClientNameReservation: deps.withClientNameReservation,
broadcastDashboardState: deps.broadcastDashboardState,
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
});
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
});
registerDataSourceRoutes(app, {
pool: deps.pool,
common: deps.common,
pages: deps.pages,
formatDashboardDate: deps.formatDashboardDate,
getAuditUserId: deps.getAuditUserId,
redirectAfterSave: deps.redirectAfterSave,
backgroundTaskQueue: deps.backgroundTaskQueue,
dataSourceTasks: deps.dataSourceTasks,
setAuthMessageCookie: deps.setAuthMessageCookie,
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 };