From 53e8043132417a60ee610c262ec51aab40cfcc95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=B8vring?= Date: Wed, 8 Nov 2023 09:32:53 +0100 Subject: [PATCH] Revert "Removes logic resetting has_pending_invitation" This reverts commit 11d6c1f0e45f8f60098d203ea0310021c4938a1a. --- __test__/auth/CompositeLogInHandler.test.ts | 24 +++++++++++++ .../RemoveInvitedFlagLogInHandler.test.ts | 18 ++++++++++ src/composition.ts | 36 +++++++++++-------- .../auth/data/Auth0MetadataUpdater.ts | 28 +++++++++++++++ src/features/auth/data/index.ts | 1 + .../domain/logIn/CompositeLogInHandler.ts | 14 ++++++++ .../logIn/RemoveInvitedFlagLogInHandler.ts | 20 +++++++++++ src/features/auth/domain/logIn/index.ts | 2 ++ 8 files changed, 129 insertions(+), 14 deletions(-) create mode 100644 __test__/auth/CompositeLogInHandler.test.ts create mode 100644 __test__/auth/RemoveInvitedFlagLogInHandler.test.ts create mode 100644 src/features/auth/data/Auth0MetadataUpdater.ts create mode 100644 src/features/auth/domain/logIn/CompositeLogInHandler.ts create mode 100644 src/features/auth/domain/logIn/RemoveInvitedFlagLogInHandler.ts diff --git a/__test__/auth/CompositeLogInHandler.test.ts b/__test__/auth/CompositeLogInHandler.test.ts new file mode 100644 index 00000000..c342ffbb --- /dev/null +++ b/__test__/auth/CompositeLogInHandler.test.ts @@ -0,0 +1,24 @@ +import { CompositeLogInHandler } from "../../src/features/auth/domain" + +test("It invokes all log in handlers for user", async () => { + let userId1: string | undefined + let userId2: string | undefined + let userId3: string | undefined + const sut = new CompositeLogInHandler([{ + async handleLogIn(userId) { + userId1 = userId + } + }, { + async handleLogIn(userId) { + userId2 = userId + } + }, { + async handleLogIn(userId) { + userId3 = userId + } + }]) + await sut.handleLogIn("1234") + expect(userId1).toEqual("1234") + expect(userId2).toEqual("1234") + expect(userId3).toEqual("1234") +}) diff --git a/__test__/auth/RemoveInvitedFlagLogInHandler.test.ts b/__test__/auth/RemoveInvitedFlagLogInHandler.test.ts new file mode 100644 index 00000000..e4a276cd --- /dev/null +++ b/__test__/auth/RemoveInvitedFlagLogInHandler.test.ts @@ -0,0 +1,18 @@ +import { RemoveInvitedFlagLogInHandler } from "../../src/features/auth/domain" + +test("It removes invited flag from specified user", async () => { + let updatedUserId: string | undefined + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + let updatedMetadata: {[key: string]: any} | undefined + const sut = new RemoveInvitedFlagLogInHandler({ + async updateMetadata(userId, metadata) { + updatedUserId = userId + updatedMetadata = metadata + } + }) + await sut.handleLogIn("1234") + expect(updatedUserId).toEqual("1234") + expect(updatedMetadata).toEqual({ + has_pending_invitation: false + }) +}) diff --git a/src/composition.ts b/src/composition.ts index b5432314..46dce15b 100644 --- a/src/composition.ts +++ b/src/composition.ts @@ -22,6 +22,7 @@ import { import { GitHubOAuthTokenRefresher, GitHubInstallationAccessTokenDataSource, + Auth0MetadataUpdater, Auth0RefreshTokenReader, Auth0RepositoryAccessReader, Auth0UserIdentityProviderReader @@ -30,6 +31,7 @@ import { AccessTokenService, CachingRepositoryAccessReaderConfig, CachingUserIdentityProviderReader, + CompositeLogInHandler, CompositeLogOutHandler, CredentialsTransferringLogInHandler, ErrorIgnoringLogOutHandler, @@ -41,6 +43,7 @@ import { LockingAccessTokenService, OAuthTokenRepository, OnlyStaleRefreshingAccessTokenService, + RemoveInvitedFlagLogInHandler, RepositoryRestrictingAccessTokenDataSource, UserDataCleanUpLogOutHandler } from "@/features/auth/domain" @@ -187,20 +190,25 @@ export const projectDataSource = new CachingProjectDataSource( projectRepository ) -export const logInHandler = new CredentialsTransferringLogInHandler({ - isUserGuestReader: new IsUserGuestReader( - userIdentityProviderReader - ), - guestCredentialsTransferrer: new NullObjectCredentialsTransferrer(), - hostCredentialsTransferrer: new HostCredentialsTransferrer({ - refreshTokenReader: new Auth0RefreshTokenReader({ - ...auth0ManagementCredentials, - connection: "github" - }), - oAuthTokenRefresher: gitHubOAuthTokenRefresher, - oAuthTokenRepository: oAuthTokenRepository - }) -}) +export const logInHandler = new CompositeLogInHandler([ + new CredentialsTransferringLogInHandler({ + isUserGuestReader: new IsUserGuestReader( + userIdentityProviderReader + ), + guestCredentialsTransferrer: new NullObjectCredentialsTransferrer(), + hostCredentialsTransferrer: new HostCredentialsTransferrer({ + refreshTokenReader: new Auth0RefreshTokenReader({ + ...auth0ManagementCredentials, + connection: "github" + }), + oAuthTokenRefresher: gitHubOAuthTokenRefresher, + oAuthTokenRepository: oAuthTokenRepository + }) + }), + new RemoveInvitedFlagLogInHandler( + new Auth0MetadataUpdater({ ...auth0ManagementCredentials }) + ) +]) export const logOutHandler = new ErrorIgnoringLogOutHandler( new CompositeLogOutHandler([ diff --git a/src/features/auth/data/Auth0MetadataUpdater.ts b/src/features/auth/data/Auth0MetadataUpdater.ts new file mode 100644 index 00000000..88ffb524 --- /dev/null +++ b/src/features/auth/data/Auth0MetadataUpdater.ts @@ -0,0 +1,28 @@ +import { ManagementClient } from "auth0" + +type Auth0MetadataUpdaterConfig = { + readonly domain: string + readonly clientId: string + readonly clientSecret: string +} + +export default class Auth0MetadataUpdater { + private readonly managementClient: ManagementClient + + constructor(config: Auth0MetadataUpdaterConfig) { + this.managementClient = new ManagementClient({ + domain: config.domain, + clientId: config.clientId, + clientSecret: config.clientSecret + }) + } + + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + async updateMetadata(userId: string, metadata: {[key: string]: any}): Promise { + await this.managementClient.users.update({ + id: userId + }, { + app_metadata: metadata + }) + } +} diff --git a/src/features/auth/data/index.ts b/src/features/auth/data/index.ts index 5db47a9f..8090466b 100644 --- a/src/features/auth/data/index.ts +++ b/src/features/auth/data/index.ts @@ -1,3 +1,4 @@ +export { default as Auth0MetadataUpdater } from "./Auth0MetadataUpdater" export { default as Auth0RefreshTokenReader } from "./Auth0RefreshTokenReader" export { default as Auth0RepositoryAccessReader } from "./Auth0RepositoryAccessReader" export { default as Auth0UserIdentityProviderReader } from "./Auth0UserIdentityProviderReader" diff --git a/src/features/auth/domain/logIn/CompositeLogInHandler.ts b/src/features/auth/domain/logIn/CompositeLogInHandler.ts new file mode 100644 index 00000000..169be4c2 --- /dev/null +++ b/src/features/auth/domain/logIn/CompositeLogInHandler.ts @@ -0,0 +1,14 @@ +import ILogInHandler from "./ILogInHandler" + +export default class CompositeLogInHandler implements ILogInHandler { + private readonly handlers: ILogInHandler[] + + constructor(handlers: ILogInHandler[]) { + this.handlers = handlers + } + + async handleLogIn(userId: string): Promise { + const promises = this.handlers.map(e => e.handleLogIn(userId)) + await Promise.all(promises) + } +} diff --git a/src/features/auth/domain/logIn/RemoveInvitedFlagLogInHandler.ts b/src/features/auth/domain/logIn/RemoveInvitedFlagLogInHandler.ts new file mode 100644 index 00000000..c1565e9d --- /dev/null +++ b/src/features/auth/domain/logIn/RemoveInvitedFlagLogInHandler.ts @@ -0,0 +1,20 @@ +import ILogInHandler from "./ILogInHandler" + +export interface IMetadataUpdater { + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + updateMetadata(userId: string, metadata: {[key: string]: any}): Promise +} + +export default class RemoveInvitedFlagLogInHandler implements ILogInHandler { + private readonly metadataUpdater: IMetadataUpdater + + constructor(metadataUpdater: IMetadataUpdater) { + this.metadataUpdater = metadataUpdater + } + + async handleLogIn(userId: string): Promise { + await this.metadataUpdater.updateMetadata(userId, { + has_pending_invitation: false + }) + } +} diff --git a/src/features/auth/domain/logIn/index.ts b/src/features/auth/domain/logIn/index.ts index 50aadb78..ec98a5e6 100644 --- a/src/features/auth/domain/logIn/index.ts +++ b/src/features/auth/domain/logIn/index.ts @@ -1 +1,3 @@ +export { default as CompositeLogInHandler } from "./CompositeLogInHandler" export { default as CredentialsTransferringLogInHandler } from "./CredentialsTransferringLogInHandler" +export { default as RemoveInvitedFlagLogInHandler } from "./RemoveInvitedFlagLogInHandler"