diff --git a/backend/src/apis/humhub/HumHubClient.ts b/backend/src/apis/humhub/HumHubClient.ts index 975dacaa8..6fe04e719 100644 --- a/backend/src/apis/humhub/HumHubClient.ts +++ b/backend/src/apis/humhub/HumHubClient.ts @@ -105,10 +105,7 @@ export class HumHubClient { } public async userByEmailAsync(email: string): Promise> { - const startTime = new Date() const options = await this.createRequestOptions({ email }) - const endTime = new Date() - console.log("time for prepare connection: ", endTime.getTime() - startTime.getTime()) return this.restClient.get('/api/v1/user/get-by-email', options) } diff --git a/backend/src/apis/humhub/__mocks__/HumHubClient.ts b/backend/src/apis/humhub/__mocks__/HumHubClient.ts index a11d8f407..cc9af4d76 100644 --- a/backend/src/apis/humhub/__mocks__/HumHubClient.ts +++ b/backend/src/apis/humhub/__mocks__/HumHubClient.ts @@ -1,5 +1,6 @@ import { User } from '@entity/User' import { UserContact } from '@entity/UserContact' +import { IRestResponse } from 'typed-rest-client' import { GetUser } from '@/apis/humhub/model/GetUser' import { PostUser } from '@/apis/humhub/model/PostUser' @@ -33,6 +34,25 @@ export class HumHubClient { return Promise.resolve(new GetUser(user, 1)) } + public async userByEmailAsync(email: string): Promise> { + const user = new User() + user.emailContact = new UserContact() + user.emailContact.email = email + return Promise.resolve({ + statusCode: 200, + result: new GetUser(user, 1), + headers: {}, + }) + } + + public async userByUsername(username: string): Promise { + const user = new User() + user.alias = username + user.emailContact = new UserContact() + user.emailContact.email = 'testemail@gmail.com' + return Promise.resolve(new GetUser(user, 1)) + } + public async createUser(): Promise { return Promise.resolve() } diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 630f65d59..83ee8f64e 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -73,6 +73,8 @@ import { objectValuesToArray } from '@/util/utilities' import { Location2Point } from './util/Location2Point' +jest.mock('@/apis/humhub/HumHubClient') + jest.mock('@/emails/sendEmailVariants', () => { const originalModule = jest.requireActual('@/emails/sendEmailVariants') return { diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 095b26062..a5309f3fd 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -10,6 +10,7 @@ import { UserContact as DbUserContact } from '@entity/UserContact' import { UserRole } from '@entity/UserRole' import i18n from 'i18n' import { Resolver, Query, Args, Arg, Authorized, Ctx, Mutation, Int } from 'type-graphql' +import { IRestResponse } from 'typed-rest-client' import { v4 as uuidv4 } from 'uuid' import { UserArgs } from '@arg//UserArgs' @@ -32,6 +33,7 @@ import { UserAdmin, SearchUsersResult } from '@model/UserAdmin' import { updateGmsUser } from '@/apis/gms/GmsClient' import { GmsUser } from '@/apis/gms/model/GmsUser' import { HumHubClient } from '@/apis/humhub/HumHubClient' +import { GetUser } from '@/apis/humhub/model/GetUser' import { subscribe } from '@/apis/KlicktippController' import { encode } from '@/auth/JWT' import { RIGHTS } from '@/auth/RIGHTS' @@ -82,8 +84,6 @@ import { setUserRole, deleteUserRole } from './util/modifyUserRole' import { sendUserToGms } from './util/sendUserToGms' import { syncHumhub } from './util/syncHumhub' import { validateAlias } from './util/validateAlias' -import { GetUser } from '@/apis/humhub/model/GetUser' -import { IRestResponse } from 'typed-rest-client' const LANGUAGES = ['de', 'en', 'es', 'fr', 'nl'] const DEFAULT_LANGUAGE = 'de' @@ -146,10 +146,6 @@ export class UserResolver { @Args() { email, password, publisherId }: UnsecureLoginArgs, @Ctx() context: Context, ): Promise { - let humhubUserPromise: Promise> | undefined - if (CONFIG.HUMHUB_ACTIVE && HumHubClient.getInstance()) { - humhubUserPromise = HumHubClient.getInstance()?.userByEmailAsync(email) - } logger.info(`login with ${email}, ***, ${publisherId} ...`) email = email.trim().toLowerCase() const dbUser = await findUserByEmail(email) @@ -164,11 +160,17 @@ export class UserResolver { // TODO we want to catch this on the frontend and ask the user to check his emails or resend code throw new LogError('The User has not set a password yet', dbUser) } - if (!verifyPassword(dbUser, password)) { throw new LogError('No user with this credentials', dbUser) } + // request to humhub and klicktipp run in parallel + let humhubUserPromise: Promise> | undefined + const klicktippStatePromise = getKlicktippState(dbUser.emailContact.email) + if (CONFIG.HUMHUB_ACTIVE && dbUser.humhubAllowed) { + humhubUserPromise = HumHubClient.getInstance()?.userByEmailAsync(email) + } + if (dbUser.passwordEncryptionType !== PasswordEncryptionType.GRADIDO_ID) { dbUser.passwordEncryptionType = PasswordEncryptionType.GRADIDO_ID dbUser.password = encryptPassword(dbUser, password) @@ -190,7 +192,6 @@ export class UserResolver { dbUser.publisherId = publisherId await DbUser.save(dbUser) } - user.klickTipp = await getKlicktippState(dbUser.emailContact.email) context.setHeaders.push({ key: 'token', @@ -199,13 +200,11 @@ export class UserResolver { await EVENT_USER_LOGIN(dbUser) // load humhub state - if (CONFIG.HUMHUB_ACTIVE && user.humhubAllowed) { - const startTime = new Date() + if (humhubUserPromise) { const result = await humhubUserPromise - const endTime = new Date() - console.log("wait for humhub at login ", endTime.getTime() - startTime.getTime()) user.humhubAllowed = result?.result?.account.status === 1 } + user.klickTipp = await klicktippStatePromise logger.info(`successful Login: ${JSON.stringify(user, null, 2)}`) return user } diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 54d42258f..661a4f8e4 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -332,7 +332,7 @@ "hideAmountGDT": "Dein GDT Betrag ist versteckt.", "humhub": { "delete-disabled": "Das Benutzerkonto kann nur im Profil-Menü der Kooperationsplattform gelöscht werden.", - "disabled": "Daten werden nicht in die Gradido Community exportiert", + "disabled": "Daten werden nicht in die Gradido Community exportiert", "enabled": "Daten werden in die Gradido Community exportiert", "naming-format": "Namen anzeigen:", "publish-name": {