module.exports = function registerScreensRoutes(app, deps) { const pool = deps.pool; const common = deps.common; const pages = deps.pages; const buildDashboardState = deps.buildDashboardState; const { buildPagination } = require('../../../lib/pagination'); const requirePermission = deps.requirePermission; const LIST_PAGE_SIZE = 10; function requireQueryPermission(readPermissionKey, editPermissionKey) { return function (req, res, next) { const permissionKey = req.query && req.query.edit ? editPermissionKey : readPermissionKey; return requirePermission(permissionKey)(req, res, next); }; } function applyConnectionCounts(screens, dashboardScreens) { const countsById = new Map(); const countsBySlug = new Map(); (dashboardScreens || []).forEach(function (screen) { const count = Number(screen && screen.player_connection_count || 0); const id = screen && screen.id !== undefined && screen.id !== null ? String(screen.id) : ''; const slug = String(screen && screen.slug || '').trim(); if (id) { countsById.set(id, count); } if (slug) { countsBySlug.set(slug, count); } }); return (screens || []).map(function (screen) { const slug = String(screen && screen.slug || '').trim(); const id = screen && screen.id !== undefined && screen.id !== null ? String(screen.id) : ''; const playerConnectionCount = countsBySlug.has(slug) ? countsBySlug.get(slug) : countsById.get(id) || 0; return Object.assign({}, screen, { player_connection_count: playerConnectionCount }); }); } app.get('/screens', requireQueryPermission('screens.read', 'screens.update'), async function (req, res, next) { try { if (req.query.edit) { const screen = await common.fetchScreenById(pool, Number(req.query.edit)); if (!screen) { return res.status(404).send('Screen not found'); } const editData = await common.fetchScreenEditData(pool); return res.send(pages.renderScreenEditPage(screen, editData, req.query.message ? String(req.query.message) : '', req.currentUser)); } const page = Math.max(1, Math.floor(Number(req.query.page) || 1)); const search = common.getSearchQuery(req); const sort = common.getSortQuery(req); const direction = common.getSortDirectionQuery(req); const dashboardState = await buildDashboardState(pool); const data = await common.fetchScreensPage(pool, page, LIST_PAGE_SIZE, search, sort, direction); res.send(pages.renderScreensPage({ screens: applyConnectionCounts(data.screens || [], dashboardState.screens || []), pagination: buildPagination(data.totalItems, data.currentPage, 'page', { search: search, sort: sort, direction: direction }, LIST_PAGE_SIZE, 'screens', 'Screen pages') }, req.query.message ? String(req.query.message) : '', req.currentUser)); } catch (error) { next(error); } }); app.get('/screens/:id/edit', requirePermission('screens.update'), async function (req, res, next) { try { const screen = await common.fetchScreenById(pool, Number(req.params.id)); if (!screen) { return res.status(404).send('Screen not found'); } const editData = await common.fetchScreenEditData(pool); return res.send(pages.renderScreenEditPage(screen, editData, req.query.message ? String(req.query.message) : '', req.currentUser)); } catch (error) { next(error); } }); };