// dtp-sites-cli.js // Copyright (C) 2021 Digital Telepresence, LLC // License: Apache-2.0 'use strict'; require('dotenv').config(); const path = require('path'); const mongoose = require('mongoose'); const { SitePlatform, SiteAsync, SiteLog, } = require(path.join(__dirname, 'lib', 'site-lib')); module.pkg = require(path.join(__dirname, 'package.json')); module.config = { componentName: 'sites-cli', root: __dirname, site: { name: process.env.DTP_SITE_NAME, description: process.env.DTP_SITE_DESCRIPTION, domain: process.env.DTP_SITE_DOMAIN, domainKey: process.env.DTP_SITE_DOMAIN_KEY, company: process.env.DTP_SITE_COMPANY || 'Digital Telepresence, LLC', }, }; module.log = new SiteLog(module, module.config.componentName); module.createDomain = async (target) => { const Domain = mongoose.model('Domain'); try { const domain = await Domain.create({ name: target }); module.log.info('domain created', { domain }); } catch (error) { module.log.error('failed to create domain', { target, error }); } }; module.grantPermission = async (target, permission) => { const User = mongoose.model('User'); try { const user = await User.findOne({ email: target }).select('+permissions +flags'); switch (permission) { case 'admin': user.flags.isAdmin = true; break; case 'moderator': user.flags.isModerator = true; break; case 'login': user.permissions.canLogin = true; break; default: throw new Error(`Invalid permission: ${permission}`); } await user.save(); module.log.info('user updated', { user: user._id }); } catch (error) { module.log.error('failed to grant permission', { app: module.app, target, permission, error }); } }; module.revokePermission = async (target, permission) => { const User = mongoose.model('User'); try { const user = await User.findOne({ email: target }).select('+permissions +flags'); switch (permission) { case 'admin': user.flags.isAdmin = false; break; case 'moderator': user.flags.isModerator = false; break; case 'login': user.permissions.canLogin = false; break; default: throw new Error(`Invalid permission: ${permission}`); } await user.save(); module.log.info('user updated', { user: user._id }); } catch (error) { module.log.error('failed to revoke permission', { app: module.app, target, permission, error }); } }; module.dvrIngest = async (episodeId) => { const jobQueue = module.services.jobQueue.getJobQueue('dvr-ingest', module.config.jobQueues['dvr-ingest']); const job = await jobQueue.add({ episodeId }); module.log.info('job created', { id: job.id }); }; /* * SERVER INIT */ (async ( ) => { const argv = require('argv'); // https://www.npmjs.com/package/argv argv.version(module.pkg.version); argv.option([ { name: 'action', short: 'a', type: 'string', description: 'The action to perform', example: 'sites-cli --action=grant --permission=moderator email email ...', }, { name: 'permission', short: 'p', type: 'string', description: 'The permission(s) being added or removed', example: 'sites-cli --action=grant --permission=admin email email ...' }, ]); try { await SitePlatform.startPlatform(module); } catch (error) { module.log.error('failed to start DTP Sites platform', { error }); return; } try { module.app = argv.run(); await SiteAsync.each(module.app.targets, async (target) => { module.log.info('processing target', { target }); switch (module.app.options.action) { case 'create-domain': await module.createDomain(target); break; case 'grant': await module.grantPermission(target, module.app.options.permission); break; case 'revoke': await module.revokePermission(target, module.app.options.permission); break; case 'dvr-ingest': await module.dvrIngest(target); break; default: throw new Error(`invalid action: ${module.app.options.action}`); } }); process.exit(0); } catch (error) { module.log.error('failed to process target', { app: module.app, error }); } })();