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');
|
2022-01-10 18:11:32 +01:00
|
|
|
const urlJoin = require('url-join');
|
2020-10-16 16:53:40 +02:00
|
|
|
|
2022-03-21 11:04:54 +01:00
|
|
|
const { getAbsoluteAdminUrl, 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) {
|
2022-01-27 10:15:04 +01:00
|
|
|
return strapi.entityService.create('plugin::users-permissions.user', {
|
|
|
|
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 = {}) {
|
2022-01-10 18:11:32 +01: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}
|
|
|
|
*/
|
2022-03-03 22:56:58 +09:00
|
|
|
fetch(id, params) {
|
|
|
|
return strapi.entityService.findOne('plugin::users-permissions.user', id, params);
|
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}
|
|
|
|
*/
|
2022-03-03 22:56:58 +09:00
|
|
|
fetchAll(params) {
|
|
|
|
return strapi.entityService.findMany('plugin::users-permissions.user', params);
|
2017-11-16 14:12:03 +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' })
|
2022-08-08 23:33:39 +02:00
|
|
|
.then((storeEmail) => storeEmail.email_confirmation.options);
|
2020-10-16 16:53:40 +02:00
|
|
|
|
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
|
|
|
|
2022-01-10 18:11:32 +01:00
|
|
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
2020-10-16 16:53:40 +02:00
|
|
|
settings.message = await userPermissionService.template(settings.message, {
|
2022-01-10 18:11:32 +01:00
|
|
|
URL: urlJoin(getAbsoluteServerUrl(strapi.config), apiPrefix, '/auth/email-confirmation'),
|
2022-03-07 16:08:47 +01:00
|
|
|
SERVER_URL: getAbsoluteServerUrl(strapi.config),
|
2022-03-21 11:04:54 +01:00
|
|
|
ADMIN_URL: getAbsoluteAdminUrl(strapi.config),
|
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
|
|
|
});
|