Source: cli/index.js

/** @module cli */
/* eslint no-case-declarations: 0, no-console: 0 */
const path = require('path')
const { defaultLocale, defaultTranslation } = require('../l10n')

const exec = path.basename(process.argv[1]),
  command = process.argv[2],
  options = process.argv.slice(3)

function help() {
  console.error(`Usage: ${process.argv0} ${exec} command [options]
  Commands:
    dumptranslation [--empty] [--hints] - show translation skeleton
    createsuperuser user password       - create superuser
    init [--all]                        - (re)create user table or all tables, drop all data`)
}

function dumpTranslations(sequelizeInstance, empty = false, hints = false) {
  if (empty)
    Object.keys(defaultTranslation[defaultLocale].ui).map(
      key => (defaultTranslation[defaultLocale].ui[key] = '')
    )
  Object.keys(sequelizeInstance.models).map(modelName => {
    const model = sequelizeInstance.models[modelName]
    const fields = Object.keys(model.attributes)
      .filter(fName => !model.attributes[fName].references)
      .concat(Object.keys(model.associations))
    defaultTranslation[defaultLocale].models = Object.assign(
      defaultTranslation[defaultLocale].models || {},
      {
        [model.name]: {
          label: empty ? '' : model.options.name.singular,
          plural: empty ? '' : model.options.name.plural,
          [hints ? 'hint' : undefined]: '',
          fields: fields.reduce(
            (acc, curr) =>
              Object.assign(acc, {
                [curr]: empty ? '' : curr,
                [hints ? curr + '_hint' : undefined]: ''
              }),
            {}
          )
        }
      }
    )
  })
  defaultTranslation[defaultLocale].actions = {
    delete: 'Delete'
  }
  return JSON.stringify(defaultTranslation, null, 2)
}

/**
 * node cli -h
 * @method cli
 * @param {Sequelize} sequelizeInstance db connection
 */
module.exports = function cli(sequelizeInstance) {
  const User = require('../userSession').userModelBuilder(sequelizeInstance)
  switch (command) {
    case 'dumptranslation':
      console.log(
        dumpTranslations(
          sequelizeInstance,
          options.includes('--empty'),
          options.includes('--hints')
        )
      )
      break
    case 'createsuperuser':
      const [username, password] = options
      if (username && password) {
        User.create(
          {
            username,
            password,
            superuser: true,
            enabled: true
          },
          {
            logging: false
          }
        )
          .then(() => console.log(`User ${username} created`))
          .catch(e => console.error(e.name, e.message))
          .then(() => sequelizeInstance.close())
      } else help()
      break
    case 'init':
      const object = options[0] === '--all' ? sequelizeInstance : User,
        message =
          options[0] === '--all'
            ? 'All tables are initialized'
            : 'User table is initialized'
      object
        .sync({
          force: true,
          logging: false
        })
        .then(() => console.log(message))
        .catch(e => console.error(e.name, e.message))
        .then(() => sequelizeInstance.close())
      break
    default:
      help()
  }
}