From 251c67f9fe28e0e0416b8b349f870cb760006f5c Mon Sep 17 00:00:00 2001 From: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com> Date: Mon, 29 Aug 2022 12:29:36 +0600 Subject: [PATCH] Check already joined (#2262) Signed-off-by: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com> --- .../src/components/Join.svelte | 24 ++++++++- plugins/login-resources/src/utils.ts | 50 +++++++++++++++++++ server/account/src/index.ts | 11 ++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/plugins/login-resources/src/components/Join.svelte b/plugins/login-resources/src/components/Join.svelte index 30e5e0b637..ee1a7799a3 100644 --- a/plugins/login-resources/src/components/Join.svelte +++ b/plugins/login-resources/src/components/Join.svelte @@ -17,10 +17,11 @@ import { fetchMetadataLocalStorage, getCurrentLocation, navigate, setMetadataLocalStorage } from '@anticrm/ui' import Form from './Form.svelte' - import { join, signUpJoin } from '../utils' + import { checkJoined, join, signUpJoin } from '../utils' import login from '../plugin' import { workbenchId } from '@anticrm/workbench' + import { onMount } from 'svelte' const location = getCurrentLocation() let page = 'login' @@ -89,6 +90,27 @@ $: secondaryButtonAction = () => { page = 'signUp' } + + onMount(() => { + check() + }) + + async function check () { + if (location.query?.inviteId === undefined || location.query?.inviteId === null) return + status = new Status(Severity.INFO, login.status.ConnectingToServer, {}) + const [, result] = await checkJoined(location.query.inviteId) + status = OK + if (result !== undefined) { + const tokens: Record = fetchMetadataLocalStorage(login.metadata.LoginTokens) ?? {} + setMetadata(login.metadata.LoginToken, result.token) + tokens[result.workspace] = result.token + setMetadataLocalStorage(login.metadata.LoginTokens, tokens) + setMetadataLocalStorage(login.metadata.LoginEndpoint, result.endpoint) + setMetadataLocalStorage(login.metadata.LoginEmail, result.email) + + navigate({ path: [workbenchId, result.workspace] }) + } + }
{ + const accountsUrl = getMetadata(login.metadata.AccountsUrl) + + if (accountsUrl === undefined) { + throw new Error('accounts url not specified') + } + + const overrideToken = getMetadata(login.metadata.OverrideLoginToken) + const email = fetchMetadataLocalStorage(login.metadata.LoginEmail) ?? '' + if (overrideToken !== undefined) { + const endpoint = getMetadata(login.metadata.OverrideEndpoint) + if (endpoint !== undefined) { + return [OK, { token: overrideToken, endpoint, email, workspace: DEV_WORKSPACE }] + } + } + + let token = getMetadata(login.metadata.LoginToken) + if (token === undefined) { + const tokens: Record = fetchMetadataLocalStorage(login.metadata.LoginTokens) ?? {} + token = Object.values(tokens)[0] + if (token === undefined) { + const loc = getCurrentLocation() + loc.path[1] = 'login' + loc.path.length = 2 + navigate(loc) + return [unknownStatus('Please login'), undefined] + } + } + + const request: Request<[string]> = { + method: 'checkJoin', + params: [inviteId] + } + + try { + const response = await fetch(accountsUrl, { + method: 'POST', + headers: { + Authorization: 'Bearer ' + token, + 'Content-Type': 'application/json' + }, + body: serialize(request) + }) + const result: Response = await response.json() + return [result.error ?? OK, result.result] + } catch (err) { + return [unknownError(err), undefined] + } +} + export async function getInviteLink (): Promise { const accountsUrl = getMetadata(login.metadata.AccountsUrl) diff --git a/server/account/src/index.ts b/server/account/src/index.ts index fe1a5bac81..bb69bf14ff 100644 --- a/server/account/src/index.ts +++ b/server/account/src/index.ts @@ -622,6 +622,16 @@ export async function removeWorkspace (db: Db, email: string, workspace: string) await db.collection(ACCOUNT_COLLECTION).updateOne({ _id: accountId }, { $pull: { workspaces: workspaceId } }) } +/** + * @public + */ +export async function checkJoin (db: Db, token: string, inviteId: ObjectId): Promise { + const { email } = decodeToken(token) + const invite = await getInvite(db, inviteId) + const workspace = await checkInvite(invite, email) + return await selectWorkspace(db, token, workspace) +} + /** * @public */ @@ -735,6 +745,7 @@ function wrap (f: (db: Db, ...args: any[]) => Promise) { export const methods = { login: wrap(login), join: wrap(join), + checkJoin: wrap(checkJoin), signUpJoin: wrap(signUpJoin), selectWorkspace: wrap(selectWorkspace), getUserWorkspaces: wrap(getUserWorkspaces),