67 lines
1.6 KiB
JavaScript
67 lines
1.6 KiB
JavaScript
import appConfig from '../../config/app.js';
|
|
import User from '../../models/user.js';
|
|
import Role from '../../models/role.js';
|
|
import emailQueue from '../../queues/email.js';
|
|
import {
|
|
REMOVE_AFTER_30_DAYS_OR_150_JOBS,
|
|
REMOVE_AFTER_7_DAYS_OR_50_JOBS,
|
|
} from '../../helpers/remove-job-configuration.js';
|
|
|
|
const createUser = async (_parent, params, context) => {
|
|
context.currentUser.can('create', 'User');
|
|
|
|
const { fullName, email } = params.input;
|
|
|
|
const existingUser = await User.query().findOne({
|
|
email: email.toLowerCase(),
|
|
});
|
|
|
|
if (existingUser) {
|
|
throw new Error('User already exists!');
|
|
}
|
|
|
|
const userPayload = {
|
|
fullName,
|
|
email,
|
|
status: 'invited',
|
|
};
|
|
|
|
try {
|
|
context.currentUser.can('update', 'Role');
|
|
|
|
userPayload.roleId = params.input.role.id;
|
|
} catch {
|
|
// void
|
|
const role = await Role.query().findOne({ key: 'admin' });
|
|
userPayload.roleId = role.id;
|
|
}
|
|
|
|
const user = await User.query().insert(userPayload);
|
|
|
|
await user.generateInvitationToken();
|
|
|
|
const jobName = `Invitation Email - ${user.id}`;
|
|
const acceptInvitationUrl = `${appConfig.webAppUrl}/accept-invitation?token=${user.invitationToken}`;
|
|
|
|
const jobPayload = {
|
|
email: user.email,
|
|
subject: 'You are invited!',
|
|
template: 'invitation-instructions',
|
|
params: {
|
|
fullName: user.fullName,
|
|
acceptInvitationUrl,
|
|
},
|
|
};
|
|
|
|
const jobOptions = {
|
|
removeOnComplete: REMOVE_AFTER_7_DAYS_OR_50_JOBS,
|
|
removeOnFail: REMOVE_AFTER_30_DAYS_OR_150_JOBS,
|
|
};
|
|
|
|
await emailQueue.add(jobName, jobPayload, jobOptions);
|
|
|
|
return { user, acceptInvitationUrl };
|
|
};
|
|
|
|
export default createUser;
|