SylowTech/sylow

View on GitHub
cli/new-entity.js

Summary

Maintainability
A
1 hr
Test Coverage
#!/usr/bin/env node
/* eslint-env node */
/* eslint-disable no-console */

const readline = require('readline');
const mongoose = require('mongoose');
const uuidV4 = require('uuid/v4');
const utils = require('./util');

const entitySchema = {
  _id: { type: String, required: true, default: uuidV4 },
  username: { type: String, required: true },
  domain: { type: String, required: true },
  passwordHash: String,
  passwordSalt: String,
  authoritative: { type: Boolean, default: false },
  admin: { type: Boolean, default: false },
  created: { type: Date, default: Date.now, required: true },
  updated: { type: Date, default: Date.now }
};

function rlFactory(prompt) {
  return readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt
  });
}

function createEntity(username, domain, password, admin) {
  const passwordSalt = utils.generateSalt();
  return new Promise((fulfill) => {
    utils.scrypt(password, passwordSalt, (passwordHash) => {
      const Entity = mongoose.model('Entity', entitySchema);
      fulfill(
        Entity.create({ username, domain, passwordSalt, passwordHash, admin, authoritative: true })
      );
    });
  });
}


module.exports = function newEntity(username, domain, admin) {
  utils.mongooseConnect();

  if (!username) {
    console.error('Name missing');
    process.exit(1);
  } else if (!domain) {
    console.error('Domain missing');
    process.exit(1);
  }

  let password;
  let passwordConfirm;

  const pwPrompt = rlFactory('Password: ');
  pwPrompt.prompt();
  pwPrompt.on('line', (pwd) => {
    password = pwd;
    pwPrompt.close();
  })
    .on('close', () => {
      const pwConfPrompt = rlFactory('Confirm: ');
      pwConfPrompt.prompt();
      pwConfPrompt.on('line', (pwdconf) => {
        passwordConfirm = pwdconf;
        pwConfPrompt.close();
      })
        .on('close', () => {
          if (password !== passwordConfirm) {
            console.error('Passwords did not match.');
            process.exit(1);
          }

          createEntity(username, domain, password, admin)
            .then(() => {
              console.log('Entity saved.');
              process.exit(0);
            })
            .catch((e) => {
              console.error(e.message);
              process.exit(1);
            });
        });
    });
};