/* jslint node: true */ 'use strict'; // ENiGMA½ const MenuModule = require('./menu_module.js').MenuModule; const User = require('./user.js'); const theme = require('./theme.js'); const login = require('./system_menu_method.js').login; const Config = require('./config.js').get; const messageArea = require('./message_area.js'); const { getISOTimestampString } = require('./database.js'); const UserProps = require('./user_property.js'); // deps const _ = require('lodash'); exports.moduleInfo = { name : 'NUA', desc : 'New User Application', }; const MciViewIds = { userName : 1, password : 9, confirm : 10, errMsg : 11, }; exports.getModule = class NewUserAppModule extends MenuModule { constructor(options) { super(options); const self = this; this.menuMethods = { // // Validation stuff // validatePassConfirmMatch : function(data, cb) { const passwordView = self.viewControllers.menu.getView(MciViewIds.password); return cb(passwordView.getData() === data ? null : new Error('Passwords do not match')); }, viewValidationListener : function(err, cb) { const errMsgView = self.viewControllers.menu.getView(MciViewIds.errMsg); let newFocusId; if(err) { errMsgView.setText(err.message); err.view.clearText(); if(err.view.getId() === MciViewIds.confirm) { newFocusId = MciViewIds.password; self.viewControllers.menu.getView(MciViewIds.password).clearText(); } } else { errMsgView.clearText(); } return cb(newFocusId); }, // // Submit handlers // submitApplication : function(formData, extraArgs, cb) { const newUser = new User(); const config = Config(); newUser.username = formData.value.username; // // We have to disable ACS checks for initial default areas as the user is not yet ready // let confTag = messageArea.getDefaultMessageConferenceTag(self.client, true); // true=disableAcsCheck let areaTag = messageArea.getDefaultMessageAreaTagByConfTag(self.client, confTag, true); // true=disableAcsCheck // can't store undefined! confTag = confTag || ''; areaTag = areaTag || ''; newUser.properties = { [ UserProps.RealName ] : formData.value.realName, [ UserProps.Birthdate ] : getISOTimestampString(formData.value.birthdate), [ UserProps.Sex ] : formData.value.sex, [ UserProps.Location ] : formData.value.location, [ UserProps.Affiliations ] : formData.value.affils, [ UserProps.EmailAddress ] : formData.value.email, [ UserProps.WebAddress ] : formData.value.web, [ UserProps.AccountCreated ] : getISOTimestampString(), [ UserProps.MessageConfTag ] : confTag, [ UserProps.MessageAreaTag ] : areaTag, [ UserProps.TermHeight ] : self.client.term.termHeight, [ UserProps.TermWidth ] : self.client.term.termWidth, // :TODO: Other defaults // :TODO: should probably have a place to create defaults/etc. }; const defaultTheme = _.get(config, 'theme.default'); if('*' === defaultTheme) { newUser.properties[UserProps.ThemeId] = theme.getRandomTheme(); } else { newUser.properties[UserProps.ThemeId] = defaultTheme; } // :TODO: User.create() should validate email uniqueness! const createUserInfo = { password : formData.value.password, sessionId : self.client.session.uniqueId, // used for events/etc. }; newUser.create(createUserInfo, err => { if(err) { self.client.log.warn( { error : err, username : formData.value.username }, 'New user creation failed'); self.gotoMenu(extraArgs.error, err => { if(err) { return self.prevMenu(cb); } return cb(null); }); } else { self.client.log.info( { username : formData.value.username, userId : newUser.userId }, `New user "${formData.value.username}" created`); // Cache SysOp information now // :TODO: Similar to bbs.js. DRY if(newUser.isSysOp()) { config.general.sysOp = { username : formData.value.username, properties : newUser.properties, }; } if(User.AccountStatus.inactive === self.client.user.properties[UserProps.AccountStatus]) { return self.gotoMenu(extraArgs.inactive, cb); } else { // // If active now, we need to call login() to authenticate // return login(self, formData, extraArgs, cb); } } }); }, }; } mciReady(mciData, cb) { return this.standardMCIReadyHandler(mciData, cb); } };