CleverStack/clever-users

View on GitHub
Gruntfile.js

Summary

Maintainability
D
1 day
Test Coverage
module.exports = function(grunt) {
  'use strict';

  var fs            = require('fs')
    , path          = require('path')
    , crypto        = require('crypto')
    , underscore    = require('underscore')
    , config        = require('config')
    , moduleSeedFile = path.resolve(path.join(__dirname, 'schema', 'seedData.json'))
    , moduleSeedData = {}
    , seedDataDefaults    = underscore.clone(config[ 'clever-users' ].seedDataPromptDefaults)
    , projectSeedFile      = path.join(process.cwd(), 'schema', 'seedData.json')
    , seedData          = {}
    , foundUser     = false;

  if (fs.existsSync(moduleSeedFile)) {
    moduleSeedData   = require(moduleSeedFile);
    underscore.extend(seedData, moduleSeedData);
  }

  if (fs.existsSync(projectSeedFile)) {
    underscore.extend(seedData, require(projectSeedFile));
  }

  seedData.UserModel = seedData.UserModel || [];

  return [{
    prompt: {
      usersSeedDataPrompt: {
        options: {
          questions: [
            {
              config: 'cleverusers.username',
              type: 'input',
              message: 'Default Username',
              default: seedDataDefaults.username,
            },
            {
              type: 'confirm',
              config: 'cleverusers.overwrite',
              message: 'Overwrite existing user with the same username?',
              when: function(answers) {
                seedData.UserModel.forEach(function(user, i) {
                  if (user.username === answers[ 'cleverusers.username' ]) {
                    if (foundUser === false) {
                      foundUser = [];
                    }
                    foundUser.push(i);
                  }
                });

                return foundUser !== false;
              }
            },
            {
              config: 'cleverusers.password',
              type: 'password',
              message: 'Default Users Password',
              default: seedDataDefaults.password,
              when: function(answers) {
                if (answers[ 'cleverusers.overwrite' ] === undefined || answers[ 'cleverusers.overwrite' ] === true) {
                  return true;
                } else {
                  grunt.fail.fatal('Username `' + answers[ 'cleverusers.username' ] + '` already exists in seed data and you chose not to overwrite it!');
                }
              }
            },
            {
              config: 'cleverusers.email',
              type: 'input',
              message: 'Default Users Email',
              default: seedDataDefaults.email
            },
            {
              type: 'confirm',
              config: 'cleverusers.overwrite',
              message: 'Overwrite existing user with the same email?',
              when: function(answers) {
                if (answers[ 'cleverusers.overwrite' ] === true) {
                  return false;
                } else {
                  seedData.UserModel.forEach(function(user, i) {
                    if (user.email === answers[ 'cleverusers.email' ]) {
                      foundUser = i;
                    }
                  });

                  return foundUser !== false;
                }
              }
            },
            {
              config: 'cleverusers.firstName',
              type: 'input',
              message: 'Default Users Firstname',
              default: foundUser ? foundUser.firstName : (seedDataDefaults.firstName || ''),
              when: function(answers) {
                if (answers[ 'cleverusers.overwrite' ] === undefined || answers[ 'cleverusers.overwrite' ] === true) {
                  return true;
                } else {
                  grunt.fail.fatal('Email `' + answers[ 'cleverusers.email' ] + '` already exists in seed data and you chose not to overwrite it!');
                }
              }
            },
            {
              config: 'cleverusers.lastName',
              type: 'input',
              message: 'Default Users Lastname',
              default: foundUser ? foundUser.lastName : (seedDataDefaults.lastName || ''),
            },
            {
              config: 'cleverusers.phone',
              type: 'input',
              message: 'Default Users Phone Number',
              default: foundUser ? foundUser.phone : (seedDataDefaults.phone || ''),
            },
            {
              config: 'cleverusers.hasAdminRight',
              type: 'confirm',
              message: 'Default User has admin rights'
            },
            {
              config: 'cleverusers.confirmed',
              type: 'confirm',
              message: 'Default User has confirmed their email'
            },
            {
              config: 'cleverusers.active',
              type: 'confirm',
              message: 'Default User has an active account'
            }
          ]
        }
      }
    }
  }, function(grunt) {
    grunt.loadNpmTasks('grunt-prompt');
    
    grunt.registerTask('prompt:cleverUsersSeed', [ 'prompt:usersSeedDataPrompt', 'usersSeedData' ]);
    grunt.registerTask('usersSeedData', 'Creates seed data for clever-users module', function() {
      var conf = grunt.config('cleverusers');

      // Make sure the required array is there
      seedData.UserModel = seedData.UserModel || [];

      // Remove the user if there is a duplicate
      if (foundUser !== false) {
        foundUser.forEach(function(user) {
          if (seedData.UserModel[ user ].associations) {
            conf.associations = seedData.UserModel[ user ].associations;
          }
          seedData.UserModel.splice(user, 1);
        });
      }
      delete conf.overwrite;

      // Update the password hash
      conf.password = crypto.createHash('sha1').update(conf.password).digest('hex');

      seedData.UserModel.push(conf);

      fs.writeFileSync(projectSeedFile, JSON.stringify(seedData, null, '  '));
      delete moduleSeedData.UserModel;
      fs.writeFileSync(moduleSeedFile, JSON.stringify(moduleSeedData, null, '  '));

      console.log('You should run `grunt db` to rebase and seed this data in your database...');
    });
  }];
};