diff --git a/src/lib/components/admin/user/UserForm.svelte b/src/lib/components/admin/user/UserForm.svelte index 31e7c378..8698bc11 100644 --- a/src/lib/components/admin/user/UserForm.svelte +++ b/src/lib/components/admin/user/UserForm.svelte @@ -3,77 +3,98 @@ import { getToastStore } from '@skeletonlabs/skeleton'; const toastStore = getToastStore(); - import { type ExtendedUser } from '$lib/models/User'; - import { type Connection } from '$lib/models/Connection'; - import UsersStore from '$lib/stores/Users'; - import ConnectionStore from '$lib/stores/Connections'; - import RoleStore from '$lib/stores/Roles'; - import PrivilegesStore from '$lib/stores/Privileges'; - const { addUser, updateUser } = UsersStore; - const { getConnection } = ConnectionStore; - const { getRole } = RoleStore; - const { getPrivilege } = PrivilegesStore; + import type { ExtendedUser, UserRequest } from '$lib/models/User'; + import type { Connection } from '$lib/models/Connection'; + + import { addUser, updateUser, getUserByEmailAndConnection } from '$lib/stores/Users'; + import { getConnection } from '$lib/stores/Connections'; + import { getRole } from '$lib/stores/Roles'; + import { getPrivilege } from '$lib/stores/Privileges'; export let user: ExtendedUser | undefined = undefined; export let roleList: string[][]; export let connections: Connection[]; - let email = user ? user.email : ''; - let connection = user ? user.connection : ''; - let active = user ? user.active : true; + let email: string = user && user.email ? user.email : ''; + let connection: string = user && user.connection ? user.connection : ''; + let active: boolean = user ? user.active : true; // eslint-disable-next-line @typescript-eslint/no-unused-vars let roles = roleList.map(([_name, uuid]) => ({ uuid, checked: user ? user.roles.includes(uuid) : false, })); + let validationError: string = ''; async function saveUser() { + const selectedRoles = roles.filter((role) => role.checked); + if (selectedRoles.length === 0) { + validationError = 'At least one role must be selected.'; + return; + } else { + validationError = ''; + } + const generalMetadata = JSON.parse(user?.generalMetadata || '{"email":""}'); generalMetadata.email = email; - let newUser = { + let newUser: UserRequest = { email, connection: await getConnection(connection), generalMetadata: JSON.stringify(generalMetadata), active, roles: await Promise.all( - roles - .filter((role) => role.checked) - .map((role) => - getRole(role.uuid).then((role) => ({ - ...role, - privileges: role.privileges.map((uuid: string) => getPrivilege(uuid)), - })), - ), + selectedRoles.map((role) => + getRole(role.uuid).then((role) => ({ + ...role, + privileges: role.privileges.map((uuid: string) => getPrivilege(uuid)), + })), + ), ), }; try { if (user) { await updateUser({ ...newUser, uuid: user.uuid }); } else { + const findUser = await getUserByEmailAndConnection(email, connection); + if (findUser) { + toastStore.trigger({ + message: 'Cannot add a user that already exists.', + background: 'variant-filled-error', + }); + return; + } + await addUser(newUser); } + toastStore.trigger({ - message: `Successfully saved ${newUser ? 'new user' : 'user'} '${email}'`, + message: `Successfully saved ${user ? '' : 'new '}user '${email}'`, background: 'variant-filled-success', }); goto('/admin/users'); } catch (error) { console.error(error); toastStore.trigger({ - message: `An error occured while saving ${newUser ? 'new user' : 'user'} '${email}'`, + message: `An error occured while saving ${user ? '' : 'new '}user '${email}'`, background: 'variant-filled-error', }); } } -
+ + {#if user?.uuid} + + {/if} +