|
|
@@ -11,9 +11,9 @@ module.exports = function(crowi) {
|
|
|
, STATUS_SUSPENDED = 3
|
|
|
, STATUS_DELETED = 4
|
|
|
, STATUS_INVITED = 5
|
|
|
- , USER_PUBLIC_FIELDS = '_id image googleId name username email status createdAt' // TODO: どこか別の場所へ...
|
|
|
+ , USER_PUBLIC_FIELDS = '_id image googleId name username email introduction status createdAt admin' // TODO: どこか別の場所へ...
|
|
|
|
|
|
- , PAGE_ITEMS = 20
|
|
|
+ , PAGE_ITEMS = 50
|
|
|
|
|
|
, userEvent = crowi.event('user')
|
|
|
|
|
|
@@ -57,6 +57,19 @@ module.exports = function(crowi) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ function generateRandomTempPassword () {
|
|
|
+ var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!=-_';
|
|
|
+ var password = '';
|
|
|
+ var len = 12;
|
|
|
+
|
|
|
+ for (var i = 0; i < len; i++) {
|
|
|
+ var randomPoz = Math.floor(Math.random() * chars.length);
|
|
|
+ password += chars.substring(randomPoz, randomPoz+1);
|
|
|
+ }
|
|
|
+
|
|
|
+ return password;
|
|
|
+ }
|
|
|
+
|
|
|
function generatePassword (password) {
|
|
|
var hasher = crypto.createHash('sha256');
|
|
|
hasher.update(crowi.env.PASSWORD_SEED + password);
|
|
|
@@ -244,6 +257,19 @@ module.exports = function(crowi) {
|
|
|
return true;
|
|
|
};
|
|
|
|
|
|
+ userSchema.statics.filterToPublicFields = function(user) {
|
|
|
+ var filteredUser = {};
|
|
|
+ var fields = USER_PUBLIC_FIELDS.split(' ');
|
|
|
+ for (var i = 0; i < fields.length; i++) {
|
|
|
+ var key = fields[i];
|
|
|
+ if (user[key]) {
|
|
|
+ filteredUser[key] = user[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return filteredUser;
|
|
|
+ };
|
|
|
+
|
|
|
userSchema.statics.findUsers = function(options, callback) {
|
|
|
var sort = options.sort || {status: 1, createdAt: 1};
|
|
|
|
|
|
@@ -326,6 +352,31 @@ module.exports = function(crowi) {
|
|
|
}, { sortBy : sort });
|
|
|
};
|
|
|
|
|
|
+ userSchema.statics.findUsersByPartOfEmail = function(emailPart, options) {
|
|
|
+ const status = options.status || null;
|
|
|
+ const emailPartRegExp = new RegExp(emailPart.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
|
|
|
+ const User = this;
|
|
|
+
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ const query = User.find({ email: emailPartRegExp }, USER_PUBLIC_FIELDS);
|
|
|
+
|
|
|
+ if (status) {
|
|
|
+ query.and({status});
|
|
|
+ }
|
|
|
+
|
|
|
+ query
|
|
|
+ .limit(PAGE_ITEMS + 1)
|
|
|
+ .exec((err, userData) => {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+
|
|
|
+ return resolve(userData);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
userSchema.statics.findUserByUsername = function(username) {
|
|
|
var User = this;
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
@@ -428,6 +479,30 @@ module.exports = function(crowi) {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ userSchema.statics.resetPasswordByRandomString = function(id) {
|
|
|
+ var User = this;
|
|
|
+
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ User.findById(id, function (err, userData) {
|
|
|
+ if (!userData) {
|
|
|
+ return reject(new Error('User not found'));
|
|
|
+ }
|
|
|
+
|
|
|
+ // is updatable check
|
|
|
+ // if (userData.isUp
|
|
|
+ var newPassword = generateRandomTempPassword();
|
|
|
+ userData.setPassword(newPassword);
|
|
|
+ userData.save(function(err, userData) {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+
|
|
|
+ resolve({user: userData, newPassword: newPassword});
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
userSchema.statics.createUsersByInvitation = function(emailList, toSendEmail, callback) {
|
|
|
var User = this
|
|
|
, createdUserList = []
|
|
|
@@ -573,6 +648,7 @@ module.exports = function(crowi) {
|
|
|
userSchema.statics.STATUS_DELETED = STATUS_DELETED;
|
|
|
userSchema.statics.STATUS_INVITED = STATUS_INVITED;
|
|
|
userSchema.statics.USER_PUBLIC_FIELDS = USER_PUBLIC_FIELDS;
|
|
|
+ userSchema.statics.PAGE_ITEMS = PAGE_ITEMS;
|
|
|
|
|
|
return mongoose.model('User', userSchema);
|
|
|
};
|