UNPKG

ep_adminpads2

Version:

Etherpad plugin to list and delete pads in /admin.

118 lines (100 loc) 3.55 kB
'use strict'; const $ = require('cheerio').load(''); const eejs = require('ep_etherpad-lite/node/eejs'); const padManager = require('ep_etherpad-lite/node/db/PadManager'); const api = require('ep_etherpad-lite/node/db/API'); let ioNs = null; const queryLimit = 12; const isNumeric = (arg) => typeof arg === 'number' || (typeof arg === 'string' && parseInt(arg)); const regExpQuote = (x) => x.toString().replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); const search = async (query) => { const {padIDs} = await padManager.listAllPads(); const data = { progress: 1, messageId: 'ep_adminpads2_search-done', query, total: padIDs.length, }; let maxResult; let result = padIDs; if (query.pattern != null && query.pattern !== '') { let pattern = `*${query.pattern}*`; pattern = regExpQuote(pattern); pattern = pattern.replace(/(\\\*)+/g, '.*'); pattern = `^${pattern}$`; const regex = new RegExp(pattern, 'i'); result = result.filter(regex.test.bind(regex)); } data.total = result.length; maxResult = result.length - 1; if (maxResult < 0) { maxResult = 0; } if (!isNumeric(query.offset) || query.offset < 0) { query.offset = 0; } else if (query.offset > maxResult) { query.offset = maxResult; } if (!isNumeric(query.limit) || query.limit < 0) { query.limit = queryLimit; } data.results = result.map((padName) => ({padName, lastEdited: '', userCount: 0})); if (!data.results.length) data.messageId = 'ep_adminpads2_no-results'; await Promise.all(data.results.map(async (entry) => { const pad = await padManager.getPad(entry.padName); entry.userCount = api.padUsersCount(entry.padName).padUsersCount; entry.lastEdited = await pad.getLastEdit(); })); const sorted = data.results.sort((a, b) => a.lastEdited - b.lastEdited); data.results = sorted.slice(query.offset, query.offset + query.limit); return data; }; exports.expressCreateServer = (hookName, {app}, cb) => { app.get('/admin/pads', (req, res) => { res.send(eejs.require('ep_adminpads2/templates/admin/pads.html', {errors: []})); }); return cb(); }; exports.socketio = (hookName, {io}, cb) => { ioNs = io.of('/pluginfw/admin/pads'); ioNs.on('connection', (socket) => { const _search = async (query) => { try { const result = await search(query); socket.emit('search-result', result); } catch (err) { socket.emit('search-error', err.stack ? err.stack : err.toString()); } }; socket.on('load', () => _search({pattern: '', offset: 0, limit: queryLimit})); socket.on('search', _search); socket.on('delete', async (padId) => { const padExists = await padManager.doesPadExists(padId); if (padExists) { // pad exists, remove const pad = await padManager.getPad(padId); await pad.remove(); socket.emit('progress', {progress: 1}); } }); }); return cb(); }; const updatePads = (hookName, context, cb) => { ioNs.emit('progress', {progress: 1}); return cb(); }; exports.padRemove = updatePads; exports.padCreate = updatePads; exports.eejsBlock_adminMenu = (hookName, context, cb) => { const ul = $('<ul>').html(context.content); const pfx = ul.find('li a').attr('href').match(/^((?:\.\.\/)*)/)[1]; ul.append( $('<li>').append( $('<a>') .attr('href', `${pfx}pads`) .attr('data-l10n-id', 'ep_adminpads2_manage-pads') .text('Manage pads'))); context.content = ul.html(); return cb(); };