diff --git a/__test__/auth/CachingRepositoryAccessReaderConfig.ts b/__test__/auth/CachingRepositoryAccessReaderConfig.test.ts similarity index 96% rename from __test__/auth/CachingRepositoryAccessReaderConfig.ts rename to __test__/auth/CachingRepositoryAccessReaderConfig.test.ts index 8833cc64..f75c636c 100644 --- a/__test__/auth/CachingRepositoryAccessReaderConfig.ts +++ b/__test__/auth/CachingRepositoryAccessReaderConfig.test.ts @@ -55,11 +55,11 @@ test("It caches fetched repository names for user", async () => { async get() { return null }, - async set(userId, value) { + async set() {}, + async setExpiring(userId: string, value: string) { cachedUserId = userId cachedRepositoryNames = value }, - async setExpiring() {}, async delete() {} }, repositoryAccessReader: { diff --git a/__test__/auth/GuestAccessTokenRepository.test.ts b/__test__/auth/GuestAccessTokenRepository.test.ts new file mode 100644 index 00000000..5c089cd3 --- /dev/null +++ b/__test__/auth/GuestAccessTokenRepository.test.ts @@ -0,0 +1,52 @@ +import { GuestAccessTokenRepository } from "../../src/features/auth/domain" + +test("It reads access token for user", async () => { + let readUserId: string | undefined + const sut = new GuestAccessTokenRepository({ + async get(userId) { + readUserId = userId + return "foo" + }, + async setExpiring() {}, + async delete() {} + }) + const accessToken = await sut.get("1234") + expect(readUserId).toBe("1234") + expect(accessToken).toBe("foo") +}) + +test("It stores access token for user", async () => { + let storedUserId: string | undefined + let storedToken: string | undefined + let storedTimeToLive: number | undefined + const sut = new GuestAccessTokenRepository({ + async get() { + return "foo" + }, + async setExpiring(userId, token, timeToLive) { + storedUserId = userId + storedToken = token + storedTimeToLive = timeToLive + }, + async delete(userId) {} + }) + await sut.set("1234", "bar") + expect(storedUserId).toBe("1234") + expect(storedToken).toBe("bar") + expect(storedTimeToLive).toBeGreaterThan(0) +}) + +test("It deletes access token for user", async () => { + let deletedUserId: string | undefined + const sut = new GuestAccessTokenRepository({ + async get() { + return "foo" + }, + async setExpiring() {}, + async delete(userId) { + deletedUserId = userId + } + }) + await sut.delete("1234") + expect(deletedUserId).toBe("1234") +}) diff --git a/__test__/auth/GuestAccessTokenService.test.ts b/__test__/auth/GuestAccessTokenService.test.ts index ceeceb4a..708a630d 100644 --- a/__test__/auth/GuestAccessTokenService.test.ts +++ b/__test__/auth/GuestAccessTokenService.test.ts @@ -13,7 +13,7 @@ test("It gets the access token for the user", async () => { readUserId = userId return "foo" }, - async setExpiring() {} + async set() {} }, dataSource: { async getAccessToken() { @@ -38,7 +38,7 @@ test("It refreshes access token on demand when there is no cached access token", async get() { return null }, - async setExpiring() {} + async set() {} }, dataSource: { async getAccessToken() { diff --git a/__test__/auth/RepositoryRestrictingAccessTokenDataSource.ts b/__test__/auth/RepositoryRestrictingAccessTokenDataSource.test.ts similarity index 100% rename from __test__/auth/RepositoryRestrictingAccessTokenDataSource.ts rename to __test__/auth/RepositoryRestrictingAccessTokenDataSource.test.ts diff --git a/src/features/auth/domain/accessToken/GuestAccessTokenRepository.ts b/src/features/auth/domain/accessToken/GuestAccessTokenRepository.ts new file mode 100644 index 00000000..7a93cef0 --- /dev/null +++ b/src/features/auth/domain/accessToken/GuestAccessTokenRepository.ts @@ -0,0 +1,25 @@ +export interface IRepository { + get(userId: string): Promise + setExpiring(userId: string, token: string, timeToLive: number): Promise + delete(userId: string): Promise +} + +export default class GuestAccessTokenRepository { + private readonly repository: IRepository + + constructor(repository: IRepository) { + this.repository = repository + } + + async get(userId: string): Promise { + return await this.repository.get(userId) + } + + async set(userId: string, accessToken: string): Promise { + await this.repository.setExpiring(userId, accessToken, 7 * 24 * 3600) + } + + async delete(userId: string): Promise { + await this.repository.delete(userId) + } +} \ No newline at end of file diff --git a/src/features/auth/domain/accessToken/GuestAccessTokenService.ts b/src/features/auth/domain/accessToken/GuestAccessTokenService.ts index d2e1a059..a30c26f3 100644 --- a/src/features/auth/domain/accessToken/GuestAccessTokenService.ts +++ b/src/features/auth/domain/accessToken/GuestAccessTokenService.ts @@ -6,7 +6,7 @@ export interface IUserIDReader { export interface Repository { get(userId: string): Promise - setExpiring(userId: string, token: string, timeToLive: number): Promise + set(userId: string, token: string): Promise } export interface DataSource { @@ -47,7 +47,7 @@ export default class GuestAccessTokenService implements IAccessTokenService { private async getNewAccessToken(): Promise { const userId = await this.userIdReader.getUserId() const newAccessToken = await this.dataSource.getAccessToken(userId) - await this.repository.setExpiring(userId, newAccessToken, 7 * 24 * 3600) + await this.repository.set(userId, newAccessToken) return newAccessToken } } \ No newline at end of file diff --git a/src/features/auth/domain/accessToken/index.ts b/src/features/auth/domain/accessToken/index.ts index fd3cb104..b575dda2 100644 --- a/src/features/auth/domain/accessToken/index.ts +++ b/src/features/auth/domain/accessToken/index.ts @@ -1,3 +1,4 @@ +export { default as GuestAccessTokenRepository } from "./GuestAccessTokenRepository" export { default as GuestAccessTokenService } from "./GuestAccessTokenService" export { default as HostAccessTokenService } from "./HostAccessTokenService" export { default as LockingAccessTokenService } from "./LockingAccessTokenService"