From 6b83fcb8d994a39966187bd3c2322fbdcc1f96d6 Mon Sep 17 00:00:00 2001 From: NEOLPAR Date: Wed, 13 Jul 2022 17:12:44 +0100 Subject: [PATCH 1/2] fixed duplicating users in user creation frontend --- .../users/_components/AddUserModal.svelte | 8 +--- .../builder/portal/manage/users/index.svelte | 45 +++++++++++++------ packages/builder/src/stores/portal/users.js | 5 +++ 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte index 41633300f2..dfb6241e20 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte @@ -8,12 +8,10 @@ Layout, } from "@budibase/bbui" import { groups } from "stores/portal" - import { createEventDispatcher } from "svelte" import { Constants } from "@budibase/frontend-core" export let showOnboardingTypeModal const password = Math.random().toString(36).substring(2, 22) - const dispatch = createEventDispatcher() let disabled let userGroups = [] @@ -39,10 +37,8 @@ { - showOnboardingTypeModal() - dispatch("change", { users: userData, groups: userGroups }) - }} + onConfirm={async () => + showOnboardingTypeModal({ users: userData, groups: userGroups })} size="M" title="Add new user" confirmText="Add user" diff --git a/packages/builder/src/pages/builder/portal/manage/users/index.svelte b/packages/builder/src/pages/builder/portal/manage/users/index.svelte index e6c90ed46d..61fdc18811 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/index.svelte @@ -97,12 +97,15 @@ } }) } - function showOnboardingTypeModal() { + const showOnboardingTypeModal = async addUsersData => { + userData = await removingDuplicities(addUsersData) + if (!userData?.users?.length) return + onboardingTypeModal.show() } async function createUserFlow() { - let emails = userData.map(x => x.email) + let emails = userData?.users?.map(x => x.email) || [] try { const res = await users.invite({ emails: emails, @@ -117,8 +120,29 @@ } } + const removingDuplicities = async userData => { + const currentUserEmails = (await users.fetch())?.map(x => x.email) || [] + const newUsers = [] + + for (const user of userData?.users) { + const { email } = user + + if ( + newUsers.find(x => x.email === email) || + currentUserEmails.includes(email) + ) + continue + + newUsers.push(user) + } + + if (!newUsers.length) + notifications.info("Duplicated! There is no new users to add.") + return { ...userData, users: newUsers } + } + const createUsersFromCsv = async userCsvData => { - const { userEmails, usersRole, userGroups } = userCsvData + const { userEmails, usersRole, userGroups: groups } = userCsvData const users = [] for (const email of userEmails) { @@ -132,13 +156,15 @@ users.push(newUser) } - userData = { groups: userGroups, users: users } + userData = await removingDuplicities({ groups, users }) + if (!userData.users.length) return + return createUser() } async function createUser() { try { - await users.create(userData) + await users.create(await removingDuplicities(userData)) notifications.success("Successfully created user") await groups.actions.init() passwordModal.show() @@ -245,14 +271,7 @@ - (userData = e.detail)} - on:created={async () => { - pageInfo.reset() - await fetchUsers() - }} - {showOnboardingTypeModal} - /> + diff --git a/packages/builder/src/stores/portal/users.js b/packages/builder/src/stores/portal/users.js index 60738f94c8..4b7fe3ecb8 100644 --- a/packages/builder/src/stores/portal/users.js +++ b/packages/builder/src/stores/portal/users.js @@ -23,6 +23,10 @@ export function createUsersStore() { } } + const fetch = async () => { + return await API.getUsers() + } + async function invite({ emails, builder, admin }) { return API.inviteUsers({ emails, @@ -83,6 +87,7 @@ export function createUsersStore() { subscribe, search, get, + fetch, invite, acceptInvite, create, From 529d2c06da88c8a06e838f30440675dd1198abbb Mon Sep 17 00:00:00 2001 From: NEOLPAR Date: Wed, 13 Jul 2022 17:37:03 +0100 Subject: [PATCH 2/2] fixed duplicating users in user creation backend --- .../worker/src/api/controllers/global/users.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/worker/src/api/controllers/global/users.ts b/packages/worker/src/api/controllers/global/users.ts index 82a6b2dd8e..59583c2eb6 100644 --- a/packages/worker/src/api/controllers/global/users.ts +++ b/packages/worker/src/api/controllers/global/users.ts @@ -23,10 +23,23 @@ export const save = async (ctx: any) => { } export const bulkSave = async (ctx: any) => { - let { users: newUsers, groups } = ctx.request.body + let { users: newUsersRequested, groups } = ctx.request.body let usersToSave: any[] = [] let groupsToSave: any[] = [] + const newUsers: any[] = [] const db = tenancy.getGlobalDB() + const currentUserEmails = + (await users.allUsers())?.map((x: any) => x.email) || [] + + for (const newUser of newUsersRequested) { + if ( + newUsers.find((x: any) => x.email === newUser.email) || + currentUserEmails.includes(newUser.email) + ) + continue + + newUsers.push(newUser) + } newUsers.forEach((user: any) => { usersToSave.push(