Check already joined ()

Signed-off-by: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com>
This commit is contained in:
Denis Bykhov 2022-08-29 12:29:36 +06:00 committed by GitHub
parent 99880588fb
commit 251c67f9fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 84 additions and 1 deletions
plugins/login-resources/src
server/account/src

View File

@ -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<string, string> = 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] })
}
}
</script>
<Form

View File

@ -268,6 +268,56 @@ export async function selectWorkspace (workspace: string): Promise<[Status, Work
}
}
export async function checkJoined (inviteId: string): Promise<[Status, WorkspaceLoginInfo | undefined]> {
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<string, string> = 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<any> = await response.json()
return [result.error ?? OK, result.result]
} catch (err) {
return [unknownError(err), undefined]
}
}
export async function getInviteLink (): Promise<string> {
const accountsUrl = getMetadata(login.metadata.AccountsUrl)

View File

@ -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<WorkspaceLoginInfo> {
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<any>) {
export const methods = {
login: wrap(login),
join: wrap(join),
checkJoin: wrap(checkJoin),
signUpJoin: wrap(signUpJoin),
selectWorkspace: wrap(selectWorkspace),
getUserWorkspaces: wrap(getUserWorkspaces),