Refactor and advancements
- Drops mailController, centralized in UserController - Adds views folder for change_password - Improves PromiseRouter to support text results - Improves PromiseRouter to support empty responses for redirects - Adds options to AdaptableController - UsersController gracefully fails when no adapter is set - Refactors GlobalConfig into same style for Routers
This commit is contained in:
@@ -1,31 +1,142 @@
|
||||
import { randomString } from '../cryptoUtils';
|
||||
import { inflate } from '../triggers';
|
||||
import AdaptableController from './AdaptableController';
|
||||
import MailAdapter from '../Adapters/Email/MailAdapter';
|
||||
|
||||
var DatabaseAdapter = require('../DatabaseAdapter');
|
||||
|
||||
export class UserController {
|
||||
|
||||
constructor(appId) {
|
||||
this.appId = appId;
|
||||
export class UserController extends AdaptableController {
|
||||
|
||||
constructor(adapter, appId, options = {}) {
|
||||
super(adapter, appId, options);
|
||||
}
|
||||
|
||||
validateAdapter(adapter) {
|
||||
// Allow no adapter
|
||||
if (!adapter && !this.shouldVerifyEmails) {
|
||||
return;
|
||||
}
|
||||
super.validateAdapter(adapter);
|
||||
}
|
||||
|
||||
expectedAdapterType() {
|
||||
return MailAdapter;
|
||||
}
|
||||
|
||||
get shouldVerifyEmails() {
|
||||
return this.options.verifyUserEmails;
|
||||
}
|
||||
|
||||
setEmailVerifyToken(user) {
|
||||
if (this.shouldVerifyEmails) {
|
||||
user._email_verify_token = randomString(25);
|
||||
user.emailVerified = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
verifyEmail(username, token) {
|
||||
var database = DatabaseAdapter.getDatabaseConnection(this.appId);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
// Trying to verify email when not enabled
|
||||
if (!this.shouldVerifyEmails) {
|
||||
reject();
|
||||
return;
|
||||
}
|
||||
|
||||
var database = this.config.database;
|
||||
|
||||
database.collection('_User').then(coll => {
|
||||
// Need direct database access because verification token is not a parse field
|
||||
return coll.findAndModify({
|
||||
username: username,
|
||||
_email_verify_token: token,
|
||||
}, null, {$set: {emailVerified: true}}, (err, doc) => {
|
||||
if (err || !doc.value) {
|
||||
reject();
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
checkResetTokenValidity(username, token) {
|
||||
var database = this.config.database;
|
||||
return new Promise((resolve, reject) => {
|
||||
database.collection('_User').then(coll => {
|
||||
// Need direct database access because verification token is not a parse field
|
||||
return coll.findAndModify({
|
||||
username: username,
|
||||
_email_verify_token: token,
|
||||
}, null, {$set: {emailVerified: true}}, (err, doc) => {
|
||||
if (err || !doc.value) {
|
||||
reject();
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
// Need direct database access because verification token is not a parse field
|
||||
return coll.findOne({
|
||||
username: username,
|
||||
_email_reset_token: token,
|
||||
}, (err, doc) => {
|
||||
if (err || !doc.value) {
|
||||
reject();
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
setPasswordResetToken(email) {
|
||||
var database = this.config.database;
|
||||
var token = randomString(25);
|
||||
return new Promise((resolve, reject) => {
|
||||
database.collection('_User').then(coll => {
|
||||
// Need direct database access because verification token is not a parse field
|
||||
return coll.findAndModify({
|
||||
email: email,
|
||||
}, null, {$set: {_email_reset_token: token}}, (err, doc) => {
|
||||
if (err || !doc.value) {
|
||||
reject();
|
||||
} else {
|
||||
console.log(doc);
|
||||
resolve(token);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
sendVerificationEmail(user, config = this.config) {
|
||||
if (!this.shouldVerifyEmails) {
|
||||
return;
|
||||
}
|
||||
|
||||
const token = encodeURIComponent(user._email_verify_token);
|
||||
const username = encodeURIComponent(user.username);
|
||||
|
||||
let link = `${config.verifyEmailURL}?token=${token}&username=${username}`;
|
||||
this.adapter.sendVerificationEmail({
|
||||
appName: config.appName,
|
||||
link: link,
|
||||
user: inflate('_User', user),
|
||||
});
|
||||
}
|
||||
|
||||
sendPasswordResetEmail(user, config = this.config) {
|
||||
if (!this.adapter) {
|
||||
return;
|
||||
}
|
||||
|
||||
const token = encodeURIComponent(user._email_reset_token);
|
||||
const username = encodeURIComponent(user.username);
|
||||
|
||||
let link = `${config.requestPasswordResetURL}?token=${token}&username=${username}`
|
||||
this.adapter.sendPasswordResetEmail({
|
||||
appName: config.appName,
|
||||
link: link,
|
||||
user: inflate('_User', user),
|
||||
});
|
||||
}
|
||||
|
||||
sendMail(options) {
|
||||
this.adapter.sendMail(options);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user