2017-11-14 11:11:22 +01:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* User.js service
|
|
|
|
*
|
|
|
|
* @description: A set of functions similar to controller's actions to avoid code duplication.
|
|
|
|
*/
|
|
|
|
|
2020-10-16 16:53:40 +02:00
|
|
|
const crypto = require('crypto');
|
2020-10-27 11:27:17 +01:00
|
|
|
const bcrypt = require('bcryptjs');
|
2020-10-16 16:53:40 +02:00
|
|
|
|
2021-11-08 15:52:42 +01:00
|
|
|
const { getAbsoluteServerUrl, sanitize } = require('@strapi/utils');
|
2021-07-08 18:15:32 +02:00
|
|
|
const { getService } = require('../utils');
|
2017-11-14 11:11:22 +01:00
|
|
|
|
2021-07-08 11:20:13 +02:00
|
|
|
module.exports = ({ strapi }) => ({
|
2020-04-17 17:33:21 +02:00
|
|
|
/**
|
|
|
|
* Promise to count users
|
|
|
|
*
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
|
|
|
|
|
|
|
count(params) {
|
2021-08-06 18:09:49 +02:00
|
|
|
return strapi.query('plugin::users-permissions.user').count({ where: params });
|
2020-04-17 17:33:21 +02:00
|
|
|
},
|
|
|
|
|
2020-04-24 10:30:37 +02:00
|
|
|
/**
|
|
|
|
* Promise to search count users
|
|
|
|
*
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
|
|
|
|
2017-11-14 11:11:22 +01:00
|
|
|
/**
|
|
|
|
* Promise to add a/an user.
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
2019-07-15 23:16:50 +02:00
|
|
|
async add(values) {
|
2017-11-29 16:10:13 +01:00
|
|
|
if (values.password) {
|
2021-08-02 08:28:10 +02:00
|
|
|
values.password = await getService('user').hashPassword(values);
|
2017-11-29 16:10:13 +01:00
|
|
|
}
|
|
|
|
|
2021-07-30 22:15:17 +02:00
|
|
|
return strapi
|
2021-08-06 18:09:49 +02:00
|
|
|
.query('plugin::users-permissions.user')
|
2021-07-30 22:15:17 +02:00
|
|
|
.create({ data: values, populate: ['role'] });
|
2017-11-14 11:11:22 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Promise to edit a/an user.
|
2022-01-05 23:54:58 +09:00
|
|
|
* @param {string} userId
|
|
|
|
* @param {object} params
|
2017-11-14 11:11:22 +01:00
|
|
|
* @return {Promise}
|
|
|
|
*/
|
2022-01-05 23:54:58 +09:00
|
|
|
async edit(userId, params = {}) {
|
|
|
|
if (params.password) {
|
|
|
|
params.password = await getService('user').hashPassword(params);
|
2017-11-29 16:10:13 +01:00
|
|
|
}
|
|
|
|
|
2022-01-05 23:54:58 +09:00
|
|
|
return strapi.entityService.update(
|
|
|
|
'plugin::users-permissions.user',
|
|
|
|
userId,
|
|
|
|
{
|
|
|
|
data: params,
|
|
|
|
populate: ['role']
|
|
|
|
}
|
|
|
|
);
|
2017-11-14 11:11:22 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2017-12-07 15:27:11 +01:00
|
|
|
* Promise to fetch a/an user.
|
2017-11-14 11:11:22 +01:00
|
|
|
* @return {Promise}
|
|
|
|
*/
|
2020-07-28 10:18:18 +03:00
|
|
|
fetch(params, populate) {
|
2021-08-06 18:09:49 +02:00
|
|
|
return strapi.query('plugin::users-permissions.user').findOne({ where: params, populate });
|
2017-12-07 15:27:11 +01:00
|
|
|
},
|
|
|
|
|
2020-07-28 10:18:18 +03:00
|
|
|
/**
|
|
|
|
* Promise to fetch authenticated user.
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
|
|
|
fetchAuthenticatedUser(id) {
|
2021-07-08 18:15:32 +02:00
|
|
|
return strapi
|
2021-08-06 18:09:49 +02:00
|
|
|
.query('plugin::users-permissions.user')
|
2021-07-08 18:15:32 +02:00
|
|
|
.findOne({ where: { id }, populate: ['role'] });
|
2020-07-28 10:18:18 +03:00
|
|
|
},
|
|
|
|
|
2017-12-07 15:27:11 +01:00
|
|
|
/**
|
|
|
|
* Promise to fetch all users.
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
2019-07-15 23:16:50 +02:00
|
|
|
fetchAll(params, populate) {
|
2021-08-06 18:09:49 +02:00
|
|
|
return strapi.query('plugin::users-permissions.user').findMany({ where: params, populate });
|
2017-11-16 14:12:03 +01:00
|
|
|
},
|
|
|
|
|
2019-07-15 23:16:50 +02:00
|
|
|
hashPassword(user = {}) {
|
2020-10-27 11:27:17 +01:00
|
|
|
return new Promise((resolve, reject) => {
|
2017-11-29 15:46:28 +01:00
|
|
|
if (!user.password || this.isHashed(user.password)) {
|
2017-11-16 14:12:03 +01:00
|
|
|
resolve(null);
|
|
|
|
} else {
|
2018-09-22 18:45:49 +05:30
|
|
|
bcrypt.hash(`${user.password}`, 10, (err, hash) => {
|
2020-10-27 11:27:17 +01:00
|
|
|
if (err) {
|
2020-11-03 17:22:18 +01:00
|
|
|
return reject(err);
|
2020-10-27 11:27:17 +01:00
|
|
|
}
|
2018-04-30 18:26:56 +02:00
|
|
|
resolve(hash);
|
2017-11-16 14:12:03 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2019-07-15 23:16:50 +02:00
|
|
|
isHashed(password) {
|
2017-11-16 14:12:03 +01:00
|
|
|
if (typeof password !== 'string' || !password) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return password.split('$').length === 4;
|
|
|
|
},
|
2017-11-16 14:29:49 +01:00
|
|
|
|
2017-12-07 15:27:11 +01:00
|
|
|
/**
|
|
|
|
* Promise to remove a/an user.
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
2019-07-15 23:16:50 +02:00
|
|
|
async remove(params) {
|
2021-08-06 18:09:49 +02:00
|
|
|
return strapi.query('plugin::users-permissions.user').delete({ where: params });
|
2017-12-07 15:27:11 +01:00
|
|
|
},
|
|
|
|
|
2019-07-15 23:16:50 +02:00
|
|
|
validatePassword(password, hash) {
|
2020-09-01 20:33:37 +05:30
|
|
|
return bcrypt.compare(password, hash);
|
2019-07-15 23:16:50 +02:00
|
|
|
},
|
2020-10-16 16:53:40 +02:00
|
|
|
|
|
|
|
async sendConfirmationEmail(user) {
|
2021-08-02 08:28:10 +02:00
|
|
|
const userPermissionService = getService('users-permissions');
|
2021-09-13 12:03:12 +02:00
|
|
|
const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });
|
2021-11-05 10:45:25 +01:00
|
|
|
const userSchema = strapi.getModel('plugin::users-permissions.user');
|
2020-10-16 16:53:40 +02:00
|
|
|
|
|
|
|
const settings = await pluginStore
|
|
|
|
.get({ key: 'email' })
|
|
|
|
.then(storeEmail => storeEmail['email_confirmation'].options);
|
|
|
|
|
2021-11-05 10:45:25 +01:00
|
|
|
// Sanitize the template's user information
|
2021-11-10 17:08:54 +01:00
|
|
|
const sanitizedUserInfo = await sanitize.sanitizers.defaultSanitizeOutput(userSchema, user);
|
2021-11-05 10:45:25 +01:00
|
|
|
|
2020-10-16 16:53:40 +02:00
|
|
|
const confirmationToken = crypto.randomBytes(20).toString('hex');
|
|
|
|
|
2022-01-05 23:54:58 +09:00
|
|
|
await this.edit(user.id, { confirmationToken });
|
2020-10-16 16:53:40 +02:00
|
|
|
|
|
|
|
settings.message = await userPermissionService.template(settings.message, {
|
|
|
|
URL: `${getAbsoluteServerUrl(strapi.config)}/auth/email-confirmation`,
|
2021-11-05 10:45:25 +01:00
|
|
|
USER: sanitizedUserInfo,
|
2020-10-16 16:53:40 +02:00
|
|
|
CODE: confirmationToken,
|
|
|
|
});
|
|
|
|
|
2021-11-05 10:45:25 +01:00
|
|
|
settings.object = await userPermissionService.template(settings.object, {
|
|
|
|
USER: sanitizedUserInfo,
|
|
|
|
});
|
2020-10-16 16:53:40 +02:00
|
|
|
|
|
|
|
// Send an email to the user.
|
2021-08-19 22:27:00 +02:00
|
|
|
await strapi
|
|
|
|
.plugin('email')
|
|
|
|
.service('email')
|
|
|
|
.send({
|
|
|
|
to: user.email,
|
|
|
|
from:
|
|
|
|
settings.from.email && settings.from.name
|
|
|
|
? `${settings.from.name} <${settings.from.email}>`
|
|
|
|
: undefined,
|
|
|
|
replyTo: settings.response_email,
|
|
|
|
subject: settings.object,
|
|
|
|
text: settings.message,
|
|
|
|
html: settings.message,
|
|
|
|
});
|
2020-10-16 16:53:40 +02:00
|
|
|
},
|
2021-07-08 11:20:13 +02:00
|
|
|
});
|