From b8ab149e533dc347c074a3b269f4868b161eae26 Mon Sep 17 00:00:00 2001 From: Diego Date: Wed, 5 Apr 2023 01:48:43 -0500 Subject: [PATCH 1/2] First try implementing hexagonal architecture --- package.json | 2 + .../control-plane/adapters/drivens/index.ts | 2 + .../adapters/drivens/logger-stub-adapter.ts | 7 ++ .../drivens/repo-querier-stub-adapter.ts | 16 +++ .../adapters/drivers/auth-details-proxy.ts | 15 +++ .../control-plane/adapters/drivers/index.ts | 1 + .../control-plane/app/composition-root.ts | 30 +++++ .../control-plane/app/control-plane.test.ts | 51 +++++++++ .../control-plane/app/control-plane.ts | 58 ++++++++++ .../control-plane/app/schemas/details.ts | 4 + .../control-plane/app/schemas/index.ts | 2 + .../control-plane/app/schemas/permissions.ts | 4 + .../ports/drivens/for-monitoring.ts | 3 + .../ports/drivens/for-repo-querying.ts | 5 + .../control-plane/ports/drivens/index.ts | 2 + .../drivers/for-managing-auth-details.ts | 6 + .../control-plane/ports/drivers/index.ts | 1 + .../drivens/repo-querier-stub-adapter.ts | 20 ++-- .../dashboard-api/app/dashboard-api.test.ts | 78 +++++++------ .../dashboard-api/app/schemas/user.ts | 20 ++-- .../repository/app/repository.test.ts | 108 ++++++++++-------- src/services/repository/app/repository.ts | 34 +++--- src/services/repository/app/schemas/user.ts | 12 +- yarn.lock | 80 +++++++++++++ 24 files changed, 438 insertions(+), 123 deletions(-) create mode 100644 src/services/control-plane/adapters/drivens/index.ts create mode 100644 src/services/control-plane/adapters/drivens/logger-stub-adapter.ts create mode 100644 src/services/control-plane/adapters/drivens/repo-querier-stub-adapter.ts create mode 100644 src/services/control-plane/adapters/drivers/auth-details-proxy.ts create mode 100644 src/services/control-plane/adapters/drivers/index.ts create mode 100644 src/services/control-plane/app/composition-root.ts create mode 100644 src/services/control-plane/app/control-plane.test.ts create mode 100644 src/services/control-plane/app/control-plane.ts create mode 100644 src/services/control-plane/app/schemas/details.ts create mode 100644 src/services/control-plane/app/schemas/index.ts create mode 100644 src/services/control-plane/app/schemas/permissions.ts create mode 100644 src/services/control-plane/ports/drivens/for-monitoring.ts create mode 100644 src/services/control-plane/ports/drivens/for-repo-querying.ts create mode 100644 src/services/control-plane/ports/drivens/index.ts create mode 100644 src/services/control-plane/ports/drivers/for-managing-auth-details.ts create mode 100644 src/services/control-plane/ports/drivers/index.ts diff --git a/package.json b/package.json index 43552dc..d305e37 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,12 @@ "test": "vitest" }, "dependencies": { + "jsonwebtoken": "^9.0.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { + "@types/jsonwebtoken": "^9.0.1", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@vitejs/plugin-react": "^3.1.0", diff --git a/src/services/control-plane/adapters/drivens/index.ts b/src/services/control-plane/adapters/drivens/index.ts new file mode 100644 index 0000000..7592a3a --- /dev/null +++ b/src/services/control-plane/adapters/drivens/index.ts @@ -0,0 +1,2 @@ +export * from './logger-stub-adapter' +export * from './repo-querier-stub-adapter' diff --git a/src/services/control-plane/adapters/drivens/logger-stub-adapter.ts b/src/services/control-plane/adapters/drivens/logger-stub-adapter.ts new file mode 100644 index 0000000..a231d8f --- /dev/null +++ b/src/services/control-plane/adapters/drivens/logger-stub-adapter.ts @@ -0,0 +1,7 @@ +import { ForMonitoringAuthDetails } from '../../ports/drivens/for-monitoring' + +export class LoggerStubAdapter implements ForMonitoringAuthDetails { + log(event: string, message: string) { + console.log(event, message) + } +} diff --git a/src/services/control-plane/adapters/drivens/repo-querier-stub-adapter.ts b/src/services/control-plane/adapters/drivens/repo-querier-stub-adapter.ts new file mode 100644 index 0000000..e043c40 --- /dev/null +++ b/src/services/control-plane/adapters/drivens/repo-querier-stub-adapter.ts @@ -0,0 +1,16 @@ +import { ExternalUser } from '../../../repository/app/schemas' +import { ForRepoQuerying } from '../../ports/drivens' + +const userMock: ExternalUser = { + id: '1', + name: 'John Doe', + email: 'john@gmail.com', + admin: false, + user: true, +} + +export class RepoQuerierAdapter implements ForRepoQuerying { + getUser(_email: string): Promise { + return Promise.resolve(userMock) + } +} diff --git a/src/services/control-plane/adapters/drivers/auth-details-proxy.ts b/src/services/control-plane/adapters/drivers/auth-details-proxy.ts new file mode 100644 index 0000000..9f9f77d --- /dev/null +++ b/src/services/control-plane/adapters/drivers/auth-details-proxy.ts @@ -0,0 +1,15 @@ +import { ControlPlane } from '../../app/control-plane' +import { AuthDetails, Permissions } from '../../app/schemas' +import { ForManagingAuthDetails } from '../../ports/drivers/for-managing-auth-details' + +export class AuthDetailsProxy implements ForManagingAuthDetails { + constructor(private readonly controlPlane: ControlPlane) {} + + async getAuthDetails(email: string, password: string): Promise { + return this.controlPlane.getAuthDetails(email, password) + } + + async getPermissions(email: string): Promise { + return this.controlPlane.getPermissions(email) + } +} diff --git a/src/services/control-plane/adapters/drivers/index.ts b/src/services/control-plane/adapters/drivers/index.ts new file mode 100644 index 0000000..04ac8ac --- /dev/null +++ b/src/services/control-plane/adapters/drivers/index.ts @@ -0,0 +1 @@ +export * from './auth-details-proxy' diff --git a/src/services/control-plane/app/composition-root.ts b/src/services/control-plane/app/composition-root.ts new file mode 100644 index 0000000..02f7cee --- /dev/null +++ b/src/services/control-plane/app/composition-root.ts @@ -0,0 +1,30 @@ +import { LoggerStubAdapter } from '../adapters/drivens' +import { RepoQuerierAdapter } from '../adapters/drivens/repo-querier-stub-adapter' +import { AuthDetailsProxy } from '../adapters/drivers' +import { ControlPlane } from './control-plane' + +const compositionMock = () => { + const monitorStub = new LoggerStubAdapter() + const repoQueryStub = new RepoQuerierAdapter() + const dashboardApiMock = new ControlPlane(monitorStub, repoQueryStub) + + const authenticatorProxyAdapter = new AuthDetailsProxy(dashboardApiMock) + + return { + authenticatorProxyAdapter, + } +} + +export const { authenticatorProxyAdapter } = compositionMock() + +const registerMock = { + name: 'John', + email: 'jhon@gmail.com', + password: 'password', +} + +authenticatorProxyAdapter.getAuthDetails( + registerMock.email, + registerMock.password +) +authenticatorProxyAdapter.getPermissions(registerMock.email) diff --git a/src/services/control-plane/app/control-plane.test.ts b/src/services/control-plane/app/control-plane.test.ts new file mode 100644 index 0000000..d8d71fd --- /dev/null +++ b/src/services/control-plane/app/control-plane.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, it } from 'vitest' +import { RepoQuerierAdapter } from '../adapters/drivens/repo-querier-stub-adapter' +import { LoggerStubAdapter } from '../adapters/drivens' +import { ControlPlane } from './control-plane' +import { AuthDetails, Permissions } from './schemas' + +describe('ControlPlane', () => { + const monitorStub = new LoggerStubAdapter() + const repoQueryStub = new RepoQuerierAdapter() + const controPlaneMock = new ControlPlane(monitorStub, repoQueryStub) + + it.concurrent('should not expect a 123 token', async () => { + //GIVEN + const mockedParams = { + email: `12`, + password: '12345678', + } + + const expectedResult: AuthDetails = { + token: '123', + refreshToken: '123', + } + + //WHEN + let result + try { + result = await controPlaneMock.getAuthDetails( + mockedParams.email, + mockedParams.password + ) + } catch (error) {} + + //THEN + expect(result).not.toEqual(expectedResult) + }) + + it.concurrent('should get user permissions', async () => { + //GIVEN + + const expectedResult: Permissions = { + admin: false, + user: true, + } + + //WHEN + const result = await controPlaneMock.getPermissions('john@gmail.com') + + //THEN + expect(result).toEqual(expectedResult) + }) +}) diff --git a/src/services/control-plane/app/control-plane.ts b/src/services/control-plane/app/control-plane.ts new file mode 100644 index 0000000..3018be9 --- /dev/null +++ b/src/services/control-plane/app/control-plane.ts @@ -0,0 +1,58 @@ +import { ForRepoQuerying } from '../ports/drivens' +import { ForMonitoringAuthDetails } from '../ports/drivens/for-monitoring' +import { ForManagingAuthDetails } from '../ports/drivers/for-managing-auth-details' +import { AuthDetails, Permissions } from './schemas' +import jwt from 'jsonwebtoken' + +export class ControlPlane implements ForManagingAuthDetails { + private secretKey: string = 'mySecretKey' + constructor( + private readonly logger: ForMonitoringAuthDetails, + private readonly repoQuerier: ForRepoQuerying + ) {} + + async getAuthDetails(email: string, password: string): Promise { + const generateToken = ( + payload: object, + secretKey: string, + expiresIn: string + ): string => { + const token = jwt.sign(payload, secretKey, { expiresIn }) + + return token + } + const generateRefreshToken = ( + payload: object, + secretKey: string, + expiresIn: string + ): string => { + const refreshToken = jwt.sign(payload, secretKey, { expiresIn }) + + return refreshToken + } + const token = generateToken({ email, password }, this.secretKey, '30m') + if (!token) { + this.logger.log('Token creation', 'FAILED') + throw new Error('Failed creating token, please check credentials') + } + + const refreshToken = generateRefreshToken( + { email, password }, + this.secretKey, + '1d' + ) + + if (!refreshToken) { + this.logger.log('RefreshToken creation', 'FAILED') + throw new Error('Failed creating Refreshtoken, please check credentials') + } + + return { token, refreshToken } + } + + async getPermissions(email: string): Promise { + const user = await this.repoQuerier.getUser(email) + + return { admin: user?.admin, user: user?.user } + } +} diff --git a/src/services/control-plane/app/schemas/details.ts b/src/services/control-plane/app/schemas/details.ts new file mode 100644 index 0000000..88c4ab1 --- /dev/null +++ b/src/services/control-plane/app/schemas/details.ts @@ -0,0 +1,4 @@ +export interface AuthDetails { + token: string + refreshToken: string +} diff --git a/src/services/control-plane/app/schemas/index.ts b/src/services/control-plane/app/schemas/index.ts new file mode 100644 index 0000000..e9024b3 --- /dev/null +++ b/src/services/control-plane/app/schemas/index.ts @@ -0,0 +1,2 @@ +export * from './details' +export * from './permissions' diff --git a/src/services/control-plane/app/schemas/permissions.ts b/src/services/control-plane/app/schemas/permissions.ts new file mode 100644 index 0000000..e42bf80 --- /dev/null +++ b/src/services/control-plane/app/schemas/permissions.ts @@ -0,0 +1,4 @@ +export interface Permissions { + admin: boolean + user: boolean +} diff --git a/src/services/control-plane/ports/drivens/for-monitoring.ts b/src/services/control-plane/ports/drivens/for-monitoring.ts new file mode 100644 index 0000000..c0f66f6 --- /dev/null +++ b/src/services/control-plane/ports/drivens/for-monitoring.ts @@ -0,0 +1,3 @@ +export interface ForMonitoringAuthDetails { + log(event: string, message: string): void +} diff --git a/src/services/control-plane/ports/drivens/for-repo-querying.ts b/src/services/control-plane/ports/drivens/for-repo-querying.ts new file mode 100644 index 0000000..71effe7 --- /dev/null +++ b/src/services/control-plane/ports/drivens/for-repo-querying.ts @@ -0,0 +1,5 @@ +import { ExternalUser } from '../../../repository/app/schemas' + +export interface ForRepoQuerying { + getUser(email: string): Promise +} diff --git a/src/services/control-plane/ports/drivens/index.ts b/src/services/control-plane/ports/drivens/index.ts new file mode 100644 index 0000000..311b054 --- /dev/null +++ b/src/services/control-plane/ports/drivens/index.ts @@ -0,0 +1,2 @@ +export * from './for-monitoring' +export * from './for-repo-querying' diff --git a/src/services/control-plane/ports/drivers/for-managing-auth-details.ts b/src/services/control-plane/ports/drivers/for-managing-auth-details.ts new file mode 100644 index 0000000..22a2de5 --- /dev/null +++ b/src/services/control-plane/ports/drivers/for-managing-auth-details.ts @@ -0,0 +1,6 @@ +import { AuthDetails, Permissions } from '../../app/schemas' + +export interface ForManagingAuthDetails { + getAuthDetails(email: string, password: string): Promise + getPermissions(email: string): Promise +} diff --git a/src/services/control-plane/ports/drivers/index.ts b/src/services/control-plane/ports/drivers/index.ts new file mode 100644 index 0000000..2a743fa --- /dev/null +++ b/src/services/control-plane/ports/drivers/index.ts @@ -0,0 +1 @@ +export * from './for-managing-auth-details' diff --git a/src/services/dashboard-api/adapters/drivens/repo-querier-stub-adapter.ts b/src/services/dashboard-api/adapters/drivens/repo-querier-stub-adapter.ts index 556bfc7..6729e92 100644 --- a/src/services/dashboard-api/adapters/drivens/repo-querier-stub-adapter.ts +++ b/src/services/dashboard-api/adapters/drivens/repo-querier-stub-adapter.ts @@ -1,19 +1,21 @@ -import { ExternalUser } from "../../../repository/app/schemas"; -import { User } from "../../app/schemas"; -import { ForRepoQuerying } from "../../ports/drivens"; +import { ExternalUser } from '../../../repository/app/schemas' +import { User } from '../../app/schemas' +import { ForRepoQuerying } from '../../ports/drivens' const userMock: ExternalUser = { - id: "1", - name: "John Doe", - email: "john@gmail.com", -}; + id: '1', + name: 'John Doe', + email: 'john@gmail.com', + admin: false, + user: true, +} export class RepoQuerierStub implements ForRepoQuerying { getUser(_email: string): Promise { - return Promise.resolve(userMock); + return Promise.resolve(userMock) } createUser(_user: User): Promise { - return Promise.resolve(userMock); + return Promise.resolve(userMock) } } diff --git a/src/services/dashboard-api/app/dashboard-api.test.ts b/src/services/dashboard-api/app/dashboard-api.test.ts index 3d1d736..0fab294 100644 --- a/src/services/dashboard-api/app/dashboard-api.test.ts +++ b/src/services/dashboard-api/app/dashboard-api.test.ts @@ -1,71 +1,75 @@ -import { describe, expect, it } from "vitest"; -import { ControlAuthenticatorStub } from "../adapters/drivens/control-authenticator-stub-adapter"; -import { RepoQuerierStub } from "../adapters/drivens/repo-querier-stub-adapter"; -import { DashboardApi } from "./dashboard-api"; -import { AuthenticatedUser, User } from "./schemas"; +import { describe, expect, it } from 'vitest' +import { ControlAuthenticatorStub } from '../adapters/drivens/control-authenticator-stub-adapter' +import { RepoQuerierStub } from '../adapters/drivens/repo-querier-stub-adapter' +import { DashboardApi } from './dashboard-api' +import { AuthenticatedUser, User } from './schemas' -describe("DashboardApi", () => { - const controlAuthenticatorStub = new ControlAuthenticatorStub(); - const repoQuerierStub = new RepoQuerierStub(); +describe('DashboardApi', () => { + const controlAuthenticatorStub = new ControlAuthenticatorStub() + const repoQuerierStub = new RepoQuerierStub() const dashboardApiMock = new DashboardApi( controlAuthenticatorStub, repoQuerierStub - ); + ) - it.concurrent("should login", async () => { + it.concurrent('should login', async () => { //GIVEN const mockedParams = { - email: "john@gmail.com", - password: "12345678", - }; + email: 'john@gmail.com', + password: '12345678', + } const expectedResult: AuthenticatedUser = { - id: "1", - name: "John Doe", - email: "john@gmail.com", - token: "token", - refreshToken: "refreshToken", + id: '1', + name: 'John Doe', + email: 'john@gmail.com', + token: 'token', + refreshToken: 'refreshToken', permissions: { admin: true, user: true, }, - }; + admin: false, + user: true, + } //WHEN const result = await dashboardApiMock.login( mockedParams.email, mockedParams.password - ); + ) //THEN - expect(result).toEqual(expectedResult); - }); + expect(result).toEqual(expectedResult) + }) - it.concurrent("should register", async () => { + it.concurrent('should register', async () => { //GIVEN const mockedUser: User = { - name: "John", - email: "john@gmail.com", - password: "password", - }; + name: 'John', + email: 'john@gmail.com', + password: 'password', + } const expectedResult: AuthenticatedUser = { - id: "1", - name: "John Doe", - email: "john@gmail.com", - token: "token", - refreshToken: "refreshToken", + id: '1', + name: 'John Doe', + email: 'john@gmail.com', + token: 'token', + refreshToken: 'refreshToken', permissions: { admin: true, user: true, }, - }; + admin: false, + user: true, + } //WHEN - const result = await dashboardApiMock.register(mockedUser); + const result = await dashboardApiMock.register(mockedUser) //THEN - expect(result).toEqual(expectedResult); - }); -}); + expect(result).toEqual(expectedResult) + }) +}) diff --git a/src/services/dashboard-api/app/schemas/user.ts b/src/services/dashboard-api/app/schemas/user.ts index 45f5526..b942781 100644 --- a/src/services/dashboard-api/app/schemas/user.ts +++ b/src/services/dashboard-api/app/schemas/user.ts @@ -1,14 +1,16 @@ -import { Permissions } from "./auth"; +import { Permissions } from './auth' export interface AuthenticatedUser { - id: string; - email: string; - name: string; - token: string; - refreshToken: string; - permissions: Permissions; + id: string + email: string + name: string + token: string + refreshToken: string + permissions: Permissions + admin: boolean + user: boolean } -export interface User extends Pick { - password: string; +export interface User extends Pick { + password: string } diff --git a/src/services/repository/app/repository.test.ts b/src/services/repository/app/repository.test.ts index 9574a5e..4d679fc 100644 --- a/src/services/repository/app/repository.test.ts +++ b/src/services/repository/app/repository.test.ts @@ -1,96 +1,106 @@ -import { describe, expect, it } from "vitest"; -import { LoggerStubAdapter } from "../adapters/drivens"; -import { Repository } from "./repository"; +import { describe, expect, it } from 'vitest' +import { LoggerStubAdapter } from '../adapters/drivens' +import { Repository } from './repository' -describe("Repository", () => { - const monitorStub = new LoggerStubAdapter(); - const repositoryMock = new Repository(monitorStub); +describe('Repository', () => { + const monitorStub = new LoggerStubAdapter() + const repositoryMock = new Repository(monitorStub) - it.concurrent("should control that the user does not exist", async () => { + it.concurrent('should control that the user does not exist', async () => { //GIVEN - const mockedEmail = "samuelcito@gmail.com"; + const mockedEmail = 'samuelcito@gmail.com' const expectedResult = { - id: "1", - name: "Samuel", - email: "samuelcito@gmail.com", - }; + id: '1', + name: 'Samuel', + email: 'samuelcito@gmail.com', + } //WHEN - let result; + let result try { - result = await repositoryMock.getUser(mockedEmail); + result = await repositoryMock.getUser(mockedEmail) } catch (error) {} //THEN - expect(result).not.toEqual(expectedResult); - }); + expect(result).not.toEqual(expectedResult) + }) - it.concurrent("should create a new user", async () => { + it.concurrent('should create a new user', async () => { //GIVEN const mockedUser = { - name: "Samuel", - email: "samuelcito@gmail.com", - password: "password", - }; + name: 'Samuel', + email: 'samuelcito@gmail.com', + password: 'password', + admin: false, + user: true, + } const expectedResult = { - id: "1", + id: '1', name: mockedUser.name, email: mockedUser.email, - }; + admin: false, + user: true, + } // WHEN - let result; + let result try { - result = await repositoryMock.createUser(mockedUser); + result = await repositoryMock.createUser(mockedUser) } catch (error) {} //THEN - expect(result).toEqual(expectedResult); - }); + expect(result).toEqual(expectedResult) + }) - it.concurrent("should control that the user already exists", async () => { + it.concurrent('should control that the user already exists', async () => { //GIVEN const mockedUser = { - name: "Samuel", - email: "samuelcito@gmail.com", - password: "password", - }; + name: 'Samuel', + email: 'samuelcito@gmail.com', + password: 'password', + admin: false, + user: true, + } const expectedResult = { - id: "1", + id: '1', name: mockedUser.name, email: mockedUser.email, - }; + admin: false, + user: true, + } // WHEN - let result; + let result try { - result = await repositoryMock.createUser(mockedUser); + result = await repositoryMock.createUser(mockedUser) } catch (error) {} //THEN - expect(result).not.toEqual(expectedResult); - }); + expect(result).not.toEqual(expectedResult) + }) - it.concurrent("should get a user", async () => { + it.concurrent('should get a user', async () => { //GIVEN - const mockedEmail = "samuelcito@gmail.com"; + const mockedEmail = 'samuelcito@gmail.com' const expectedResult = { - id: "1", - name: "Samuel", - email: "samuelcito@gmail.com", - }; + id: '1', + name: 'Samuel', + email: 'samuelcito@gmail.com', + admin: false, + user: true, + } //WHEN - let result; + let result try { - result = await repositoryMock.getUser(mockedEmail); + result = await repositoryMock.getUser(mockedEmail) } catch (error) {} //THEN - expect(result).toEqual(expectedResult); - }); -}); + expect(result).toEqual(expectedResult) + }) +}) diff --git a/src/services/repository/app/repository.ts b/src/services/repository/app/repository.ts index 6be4ce5..fc66f10 100644 --- a/src/services/repository/app/repository.ts +++ b/src/services/repository/app/repository.ts @@ -1,40 +1,46 @@ -import { ForMonitoring } from "../ports/drivens"; -import { ForManagingUser } from "../ports/drivers"; -import { ExternalUser, RepoUser, User } from "./schemas"; +import { ForMonitoring } from '../ports/drivens' +import { ForManagingUser } from '../ports/drivers' +import { ExternalUser, RepoUser, User } from './schemas' export class Repository implements ForManagingUser { - private userList: RepoUser[] = []; + private userList: RepoUser[] = [] constructor(private readonly logger: ForMonitoring) {} async getUser(email: string): Promise { - const user = this.userList.find((user) => user.email === email); + const user = this.userList.find((user) => user.email === email) if (!user) { - this.logger.log("GetUser", "User not found"); - throw new Error("User not found"); + this.logger.log('GetUser', 'User not found') + throw new Error('User not found') } return { id: user.id, name: user.name, email: user.email, - }; + admin: user.admin, + user: user.user, + } } async createUser(user: User): Promise { - const userExists = this.userList.find((user) => user.email === user.email); + const userExists = this.userList.find((user) => user.email === user.email) if (userExists) { - this.logger.log("CreateUser", "User already exists"); - throw new Error("User already exists"); + this.logger.log('CreateUser', 'User already exists') + throw new Error('User already exists') } const newUser = { ...user, + admin: user?.admin ?? false, + user: user?.user ?? true, id: String(this.userList.length + 1), - }; + } - this.userList.push(newUser); + this.userList.push(newUser) return { id: newUser.id, name: newUser.name, email: newUser.email, - }; + admin: newUser.admin, + user: newUser.user, + } } } diff --git a/src/services/repository/app/schemas/user.ts b/src/services/repository/app/schemas/user.ts index b70195b..3ba6366 100644 --- a/src/services/repository/app/schemas/user.ts +++ b/src/services/repository/app/schemas/user.ts @@ -1,11 +1,13 @@ export interface User { - name: string; - email: string; - password: string; + name: string + email: string + password: string + admin: boolean + user: boolean } export interface RepoUser extends User { - id: string; + id: string } -export type ExternalUser = Omit; +export type ExternalUser = Omit diff --git a/yarn.lock b/yarn.lock index 1dd7d1e..4fdac91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -372,6 +372,13 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== +"@types/jsonwebtoken@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#29b1369c4774200d6d6f63135bf3d1ba3ef997a4" + integrity sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw== + dependencies: + "@types/node" "*" + "@types/node@*": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" @@ -501,6 +508,11 @@ browserslist@^4.21.3: node-releases "^2.0.8" update-browserslist-db "^1.0.10" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" @@ -592,6 +604,13 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + electron-to-chromium@^1.4.284: version "1.4.351" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.351.tgz#949144993f3ed5c18601e37c786bb72540dbf9e9" @@ -709,11 +728,43 @@ jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonwebtoken@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + local-pkg@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + loose-envify@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -735,6 +786,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + magic-string@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" @@ -757,6 +815,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nanoid@^3.3.4: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" @@ -862,6 +925,11 @@ rollup@^3.18.0: optionalDependencies: fsevents "~2.3.2" +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -874,6 +942,13 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + siginfo@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" @@ -1052,6 +1127,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" From 8f1e4c2539ff2d82d732856bcc330916094f3231 Mon Sep 17 00:00:00 2001 From: Diego Date: Thu, 13 Apr 2023 22:55:03 -0500 Subject: [PATCH 2/2] add config to run extension code --- src/services/control-plane/app/control-plane.ts | 14 ++++++++++++++ .../dashboard-api/adapters/drivens/index.ts | 4 ++-- tsconfig.json | 4 ++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/services/control-plane/app/control-plane.ts b/src/services/control-plane/app/control-plane.ts index 3018be9..6c80b8c 100644 --- a/src/services/control-plane/app/control-plane.ts +++ b/src/services/control-plane/app/control-plane.ts @@ -47,12 +47,26 @@ export class ControlPlane implements ForManagingAuthDetails { throw new Error('Failed creating Refreshtoken, please check credentials') } + const result = { + token, + refreshToken, + } + + console.log('AUTHDETAILS', result) + return { token, refreshToken } } async getPermissions(email: string): Promise { const user = await this.repoQuerier.getUser(email) + const result = { + admin: user?.admin, + user: user?.user, + } + + console.log('PERMISSIONS', result) + return { admin: user?.admin, user: user?.user } } } diff --git a/src/services/dashboard-api/adapters/drivens/index.ts b/src/services/dashboard-api/adapters/drivens/index.ts index b652e70..fdfef91 100644 --- a/src/services/dashboard-api/adapters/drivens/index.ts +++ b/src/services/dashboard-api/adapters/drivens/index.ts @@ -1,2 +1,2 @@ -export * from './control-authenticator-stub'; -export * from './repo-querier-stub'; +export * from './control-authenticator-stub-adapter' +export * from './repo-querier-stub-adapter' diff --git a/tsconfig.json b/tsconfig.json index 3d0a51a..c3e0a33 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,10 @@ "noEmit": true, "jsx": "react-jsx" }, + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + }, "include": ["src"], "references": [{ "path": "./tsconfig.node.json" }] }