diff --git a/backend/src/controllers/DashboardBackendController.ts b/backend/src/controllers/DashboardBackendController.ts index 472c391..9992eb4 100644 --- a/backend/src/controllers/DashboardBackendController.ts +++ b/backend/src/controllers/DashboardBackendController.ts @@ -19,7 +19,8 @@ import { DASHBOARD_API_UPDATE_MY_WORKSPACE_USER_WORKSPACE_ID, DASHBOARD_API_UPDATE_MY_WORKSPACE_USER_PATH, DASHBOARD_API_UPDATE_MY_WORKSPACE_USER_USER_ID, - VALID_ADMIN_DOMAINS + VALID_ADMIN_DOMAINS, + DASHBOARD_API_GET_MY_WORKSPACE_USER_BY_PROFILE_PATH } from "../fi/hg/dashboard/constants/dashboard-api"; import { @@ -161,6 +162,64 @@ export class DashboardBackendController { } } + // *********** WORSKPACE USER PROFILE *********** + + /** + * Returns profile for a workspace + * + * @param token + * @param parentIdString + */ + @GetMapping(DASHBOARD_API_GET_MY_WORKSPACE_USER_BY_PROFILE_PATH) + public static async getMyWorkspaceUserByProfile( + @RequestHeader(DASHBOARD_AUTHORIZATION_HEADER_NAME, { + required: true + }) + token: string, + @PathVariable(DASHBOARD_API_GET_MY_WORKSPACE_USER_LIST_WORKSPACE_ID, {required: true}) + parentIdString: string + ): Promise> { + try { + + if ( !token ) { + LOG.warn(`Warning! No authentication token provided.`); + return ResponseEntity.internalServerError().body( + createErrorDTO('Access denied', 403) + ); + } + + const workspaceId: string = trim(parentIdString ?? ''); + LOG.debug(`getMyWorkspaceUserList: workspaceId: `, workspaceId); + + const email: string | undefined = JwtService.decodePayloadSubject(token); + if ( !email ) { + LOG.warn(`Warning! Token did not have an email address.`, token); + return ResponseEntity.internalServerError().body( + createErrorDTO('Access denied', 403) + ); + } + + if ( !this._emailTokenService.verifyToken(email, token, true) ) { + LOG.debug(`getMyWorkspaceUserList: Access denied for email: `, email, token); + return ResponseEntity.internalServerError().body( + createErrorDTO('Access denied', 403) + ); + } + + const userList: User[] = await this._backend.getUserListForWorkspace(workspaceId); + + const profiles: User[] = userList.filter(user => user.email === email); + + return profiles[0]; + + } catch (err) { + LOG.error(`getMyWorkspaceUserList: ERROR: `, err); + return ResponseEntity.internalServerError().body( + createErrorDTO('Internal Server Error', 500) + ); + } + } + // *********** WORKSPACES *********** diff --git a/backend/src/fi/hg/core b/backend/src/fi/hg/core index 97c6792..9eec067 160000 --- a/backend/src/fi/hg/core +++ b/backend/src/fi/hg/core @@ -1 +1 @@ -Subproject commit 97c67921ae5ded832d9f19a5cc86e1f88a1f0062 +Subproject commit 9eec0676d58a1257f7b0cd038475bd3bbec58c95 diff --git a/backend/src/fi/hg/dashboard b/backend/src/fi/hg/dashboard index f22aab8..6c60546 160000 --- a/backend/src/fi/hg/dashboard +++ b/backend/src/fi/hg/dashboard @@ -1 +1 @@ -Subproject commit f22aab8506668099848ad835213c491892b84914 +Subproject commit 6c60546d7905b01f5edc8f7290b261aaae6c2443 diff --git a/backend/src/fi/hg/node b/backend/src/fi/hg/node index dadc59d..d970484 160000 --- a/backend/src/fi/hg/node +++ b/backend/src/fi/hg/node @@ -1 +1 @@ -Subproject commit dadc59d065a6a4705d98f310b3e54148f021c6ca +Subproject commit d97048435a77587f69c22661101892aacda35e38 diff --git a/frontend/src/components/common/layout/appMenu/AppMenu.tsx b/frontend/src/components/common/layout/appMenu/AppMenu.tsx index 2b80957..038fcac 100644 --- a/frontend/src/components/common/layout/appMenu/AppMenu.tsx +++ b/frontend/src/components/common/layout/appMenu/AppMenu.tsx @@ -2,9 +2,6 @@ import { APP_MENU_CLASS_NAME } from "../../../../constants/appClassName"; import { NavLink } from "react-router-dom"; -import { - USER_LIST_ROUTE -} from "../../../../constants/route"; import { T_APP_HEADER_NAV_USERS } from "../../../../constants/translation"; @@ -12,6 +9,9 @@ import { useCallback, MouseEvent } from "react"; import { useEmailAuthSession } from "../../../../fi/hg/frontend/hooks/useEmailAuthSession"; import { SetProfileMenuOpenCallback } from "../../../../fi/hg/frontend/hooks/useDropdownToggleWithoutWindowSizeAndScroll"; import { TranslationFunction } from "../../../../fi/hg/core/types/TranslationFunction"; +import {useCurrentWorkspaceId} from "../../../../hooks/workspace/useCurrentWorkspaceId"; +import {LogService} from "../../../../fi/hg/core/LogService"; +import {getWorkspaceUserListRoute, MY_WORKSPACE_LIST_ROUTE} from "../../../../constants/route"; import "./AppMenu.scss"; export interface MenuProps { @@ -19,7 +19,7 @@ export interface MenuProps { readonly className?: string; readonly changeMenuState: SetProfileMenuOpenCallback; } - +const LOG = LogService.createLogger('AppMenu'); export function AppMenu (props: MenuProps) { const t = props?.t; @@ -27,6 +27,9 @@ export function AppMenu (props: MenuProps) { const setMenuOpen = props.changeMenuState; const session = useEmailAuthSession(); + const workspaceId = useCurrentWorkspaceId(); + const workspaceUserListRoute = workspaceId ? getWorkspaceUserListRoute(workspaceId): MY_WORKSPACE_LIST_ROUTE; + const closeMenuCallback = useCallback( (event: MouseEvent) => { if ( event ) { @@ -66,7 +69,7 @@ export function AppMenu (props: MenuProps) { {t(T_APP_HEADER_NAV_USERS)} diff --git a/frontend/src/components/common/layout/appNav/AppNav.tsx b/frontend/src/components/common/layout/appNav/AppNav.tsx index 9eb47cf..18a1633 100644 --- a/frontend/src/components/common/layout/appNav/AppNav.tsx +++ b/frontend/src/components/common/layout/appNav/AppNav.tsx @@ -3,11 +3,12 @@ import { APP_NAV_CLASS_NAME } from "../../../../constants/appClassName"; import { TranslationFunction } from "../../../../fi/hg/core/types/TranslationFunction"; import { NavLink } from "react-router-dom"; -import { ABOUT_ROUTE, USER_LIST_ROUTE } from "../../../../constants/route"; +import {ABOUT_ROUTE, getWorkspaceUserListRoute, MY_WORKSPACE_LIST_ROUTE} from "../../../../constants/route"; import { T_APP_HEADER_NAV_HOME, T_APP_HEADER_NAV_USERS } from "../../../../constants/translation"; -import "./AppNav.scss"; import { Icon } from "../../../../fi/hg/frontend/components/icon/Icon"; import { HomeIcon, UserListIcon } from "../../../../assets/icons"; +import {useCurrentWorkspaceId} from "../../../../hooks/workspace/useCurrentWorkspaceId"; +import "./AppNav.scss"; export interface AppNavProps { readonly t : TranslationFunction; @@ -19,6 +20,9 @@ export function AppNav (props: AppNavProps) { const t = props?.t; const className = props?.className; + const workspaceId = useCurrentWorkspaceId(); + const workspaceUserListRoute = workspaceId ? getWorkspaceUserListRoute(workspaceId): MY_WORKSPACE_LIST_ROUTE; + return (