From 45f5d1fb1a5167a4a8005c86a05f1124a09ac6e9 Mon Sep 17 00:00:00 2001 From: Christopher Kolstad Date: Fri, 13 Aug 2021 10:50:48 +0200 Subject: [PATCH] feat: Adds sendEmail flag to body of create user request (#894) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows frontend to support a toggle for admins wanting to create users and passwords manually, without sending emails to users they create. Co-authored-by: Ivar Conradi Ă˜sthus --- src/lib/routes/admin-api/user-admin.ts | 20 ++++++++-- src/test/e2e/api/admin/user-admin.e2e.test.ts | 40 ++++++++++++++++++- src/test/e2e/helpers/test-helper.ts | 8 ++++ 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/lib/routes/admin-api/user-admin.ts b/src/lib/routes/admin-api/user-admin.ts index cc2218fd7a..2220933eae 100644 --- a/src/lib/routes/admin-api/user-admin.ts +++ b/src/lib/routes/admin-api/user-admin.ts @@ -12,6 +12,14 @@ import { IUnleashServices } from '../../types/services'; import SessionService from '../../services/session-service'; import { IAuthRequest } from '../unleash-types'; +interface ICreateUserBody { + username: string; + email: string; + name: string; + rootRole: number; + sendEmail: boolean; +} + export default class UserAdminController extends Controller { private userService: UserService; @@ -117,8 +125,11 @@ export default class UserAdminController extends Controller { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - async createUser(req: IAuthRequest, res: Response): Promise { - const { username, email, name, rootRole } = req.body; + async createUser( + req: IAuthRequest, + res: Response, + ): Promise { + const { username, email, name, rootRole, sendEmail } = req.body; const { user } = req; try { @@ -131,7 +142,6 @@ export default class UserAdminController extends Controller { }, user, ); - const inviteLink = await this.resetTokenService.createNewUserUrl( createdUser.id, user.email, @@ -139,7 +149,9 @@ export default class UserAdminController extends Controller { let emailSent = false; const emailConfigured = this.emailService.configured(); - if (emailConfigured) { + const reallySendEmail = + emailConfigured && (sendEmail !== undefined ? sendEmail : true); + if (reallySendEmail) { try { await this.emailService.sendGettingStartedMail( createdUser.name, diff --git a/src/test/e2e/api/admin/user-admin.e2e.test.ts b/src/test/e2e/api/admin/user-admin.e2e.test.ts index 6c07415668..05b2433827 100644 --- a/src/test/e2e/api/admin/user-admin.e2e.test.ts +++ b/src/test/e2e/api/admin/user-admin.e2e.test.ts @@ -1,4 +1,4 @@ -import { setupApp } from '../../helpers/test-helper'; +import { setupApp, setupAppWithCustomConfig } from '../../helpers/test-helper'; import dbInit from '../../helpers/database-init'; import getLogger from '../../../fixtures/no-logger'; import { @@ -244,6 +244,44 @@ test('Creates a user and includes inviteLink and emailConfigured', async () => { }); }); +test('Creates a user but does not send email if sendEmail is set to false', async () => { + const myAppConfig = await setupAppWithCustomConfig(stores, { + email: { + host: 'smtp.ethereal.email', + smtpuser: 'rafaela.pouros@ethereal.email', + smtppass: 'CuVPBSvUFBPuqXMFEe', + }, + }); + + await myAppConfig.request + .post('/api/admin/user-admin') + .send({ + email: 'some@getunelash.ai', + name: 'Some Name', + rootRole: editorRole.id, + sendEmail: false, + }) + .set('Content-Type', 'application/json') + .expect(201) + .expect((res) => { + expect(res.body.emailSent).toBeFalsy(); + }); + await myAppConfig.request + .post('/api/admin/user-admin') + .send({ + email: 'some2@getunelash.ai', + name: 'Some2 Name', + rootRole: editorRole.id, + }) + .set('Content-Type', 'application/json') + .expect(201) + .expect((res) => { + expect(res.body.emailSent).toBeTruthy(); + }); + + await myAppConfig.destroy(); +}); + test('generates USER_CREATED event', async () => { expect.assertions(5); const email = 'some@getunelash.ai'; diff --git a/src/test/e2e/helpers/test-helper.ts b/src/test/e2e/helpers/test-helper.ts index ac8415f3af..5c4d8870a9 100644 --- a/src/test/e2e/helpers/test-helper.ts +++ b/src/test/e2e/helpers/test-helper.ts @@ -60,6 +60,14 @@ export async function setupApp(stores: IUnleashStores): Promise { return createApp(stores); } +export async function setupAppWithCustomConfig( + stores: IUnleashStores, + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + customOptions: any, +): Promise { + return createApp(stores, undefined, undefined, customOptions); +} + export async function setupAppWithAuth( stores: IUnleashStores, ): Promise {