From 9f01afca88f1da8d2b1ac066c271e2c281ae51ea Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 10 Feb 2021 11:57:11 +0100 Subject: [PATCH] Add useSSORegistration option for gold users on admin creation --- packages/strapi-admin/ee/controllers/user.js | 36 ++++++++++++++++++++ packages/strapi-admin/ee/validation/user.js | 29 ++++++++++++++++ packages/strapi-admin/validation/user.js | 6 ++++ 3 files changed, 71 insertions(+) create mode 100644 packages/strapi-admin/ee/controllers/user.js create mode 100644 packages/strapi-admin/ee/validation/user.js diff --git a/packages/strapi-admin/ee/controllers/user.js b/packages/strapi-admin/ee/controllers/user.js new file mode 100644 index 0000000000..aaa8aa6124 --- /dev/null +++ b/packages/strapi-admin/ee/controllers/user.js @@ -0,0 +1,36 @@ +'use strict'; + +const { pick } = require('lodash/fp'); +const { validateUserCreationInput } = require('../validation/user'); + +const pickUserCreationAttributes = pick(['firstname', 'lastname', 'email', 'roles']); + +module.exports = { + async create(ctx) { + const { body } = ctx.request; + + try { + await validateUserCreationInput(body); + } catch (err) { + return ctx.badRequest('ValidationError', err); + } + + const attributes = pickUserCreationAttributes(body); + const { useSSORegistration } = body; + + const userAlreadyExists = await strapi.admin.services.user.exists({ email: attributes.email }); + + if (userAlreadyExists) { + return ctx.badRequest('Email already taken'); + } + + if (useSSORegistration) { + Object.assign(attributes, { registrationToken: null, isActive: true }); + } + + const createdUser = await strapi.admin.services.user.create(attributes); + const userInfo = strapi.admin.services.user.sanitizeUser(createdUser); + + ctx.created({ data: userInfo }); + }, +}; diff --git a/packages/strapi-admin/ee/validation/user.js b/packages/strapi-admin/ee/validation/user.js new file mode 100644 index 0000000000..e1a3f314da --- /dev/null +++ b/packages/strapi-admin/ee/validation/user.js @@ -0,0 +1,29 @@ +'use strict'; + +const { yup, formatYupErrors } = require('strapi-utils'); +// eslint-disable-next-line node/no-extraneous-require +const { features } = require('strapi/lib/utils/ee'); +const { schemas } = require('../../validation/user'); + +const handleReject = error => Promise.reject(formatYupErrors(error)); + +const ssoUserCreationInputExtension = yup + .object() + .shape({ + useSSORegistration: yup.boolean(), + }) + .noUnknown(); + +const validateUserCreationInput = data => { + let schema = schemas.userCreationSchema; + + if (features.isEnabled('sso')) { + schema = schema.concat(ssoUserCreationInputExtension); + } + + return schema.validate(data, { strict: true, abortEarly: false }).catch(handleReject); +}; + +module.exports = { + validateUserCreationInput, +}; diff --git a/packages/strapi-admin/validation/user.js b/packages/strapi-admin/validation/user.js index 528522fb2a..e802084279 100644 --- a/packages/strapi-admin/validation/user.js +++ b/packages/strapi-admin/validation/user.js @@ -73,4 +73,10 @@ module.exports = { validateProfileUpdateInput, validateUserUpdateInput, validateUsersDeleteInput, + + schemas: { + userCreationSchema, + usersDeleteSchema, + userUpdateSchema, + }, };