From 81314757974311ddfd6aabac9965e110f9dfa55f Mon Sep 17 00:00:00 2001 From: Jovany Date: Sun, 16 Apr 2023 23:20:30 -0600 Subject: [PATCH] feat: implement control plane --- .../control-plane/adapters/drivens/index.ts | 1 + .../adapters/drivens/logger-stub-adapter.ts | 8 +++++ .../control-plane/adapters/drivers/index.ts | 1 + .../managing-authentication-proxy-adapter.ts | 13 ++++++++ .../control-plane/app/composition-root.ts | 20 ++++++++++++ .../control-plane/app/control-plane.test.ts | 31 +++++++++++++++++++ .../control-plane/app/control-plane.ts | 18 +++++++++++ .../control-plane/app/schemas/auth.ts | 8 +++++ .../control-plane/app/schemas/index.ts | 1 + .../ports/drivens/for-monitoring.ts | 7 +++++ .../control-plane/ports/drivens/index.ts | 1 + .../drivers/for-managing-authentication.ts | 8 +++++ .../control-plane/ports/drivers/index.ts | 1 + 13 files changed, 118 insertions(+) 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/drivers/index.ts create mode 100644 src/services/control-plane/adapters/drivers/managing-authentication-proxy-adapter.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/auth.ts create mode 100644 src/services/control-plane/app/schemas/index.ts create mode 100644 src/services/control-plane/ports/drivens/for-monitoring.ts create mode 100644 src/services/control-plane/ports/drivens/index.ts create mode 100644 src/services/control-plane/ports/drivers/for-managing-authentication.ts create mode 100644 src/services/control-plane/ports/drivers/index.ts 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..807622f --- /dev/null +++ b/src/services/control-plane/adapters/drivens/index.ts @@ -0,0 +1 @@ +export * from './logger-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..19408c2 --- /dev/null +++ b/src/services/control-plane/adapters/drivens/logger-stub-adapter.ts @@ -0,0 +1,8 @@ +import { ForMonitoring } from "../../ports/drivens"; +//es un stub que es basicamente un MOCK donde simulamos que solicitamos algo a otro hexagono +//esto se hace para probarlo +export class LoggerStubAdapter implements ForMonitoring { + log(event: string, message: string) { + console.log(event, message); + } +} 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..8d1699f --- /dev/null +++ b/src/services/control-plane/adapters/drivers/index.ts @@ -0,0 +1 @@ +export * from './managing-authentication-proxy-adapter'; diff --git a/src/services/control-plane/adapters/drivers/managing-authentication-proxy-adapter.ts b/src/services/control-plane/adapters/drivers/managing-authentication-proxy-adapter.ts new file mode 100644 index 0000000..e48ceba --- /dev/null +++ b/src/services/control-plane/adapters/drivers/managing-authentication-proxy-adapter.ts @@ -0,0 +1,13 @@ +import { ControlPlane } from '../../app/control-plane'; +import { AuthDetails,Permissions } from '../../app/schemas'; +import { ForManagerAuthentication } from '../../ports/drivers'; + +export class ManagerAuthenticationProxyAdapter implements ForManagerAuthentication{ + constructor(private readonly controlPlane: ControlPlane){} + async getAuthDetails(email: string, password: string): Promise{ + return this.controlPlane.getAuthDetails(email,password); + } + async getPermissions(email: string, password: string): Promise{ + return this.controlPlane.getPermissions(email,password); + } +} \ No newline at end of file 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..2c71d8e --- /dev/null +++ b/src/services/control-plane/app/composition-root.ts @@ -0,0 +1,20 @@ +// Aqui se crea la instancia del hexagono que le da todo lo que necesita para funcionar +//habilita la posibilidad de utilizarlo en forma de mock + +import { ControlPlane } from "./control-plane" +import { LoggerStubAdapter } from '../../repository/adapters/drivens/logger-stub-adapter'; +import { ForManagerAuthentication } from '../ports/drivers'; +import { ManagerAuthenticationProxyAdapter } from "../adapters/drivers/managing-authentication-proxy-adapter"; + +const compositionMock =()=>{ + const loggerStubAdapter = new LoggerStubAdapter(); + const controlPlaneMock = new ControlPlane(loggerStubAdapter);//aqui se ocupa el STUB + + const managerAuthenticationProxy = new ManagerAuthenticationProxyAdapter(controlPlaneMock) + //el driveR del adaptador es el que se utiliza para poder manejar el hexagono y asi poder control los accesos a sus metodos + //NUNCA se se pasa el hexagono + return { + managerAuthenticationProxy + } +} + 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..d858847 --- /dev/null +++ b/src/services/control-plane/app/control-plane.test.ts @@ -0,0 +1,31 @@ +import { describe, it,expect } from "vitest"; +import { LoggerStubAdapter } from "../adapters/drivens"; +import { ControlPlane } from "./control-plane"; +import { ManagerAuthenticationProxyAdapter } from "../adapters/drivers"; + +describe("ControlPlane",()=>{ + const loggerStubAdapter = new LoggerStubAdapter(); + const controlPlaneMock = new ControlPlane(loggerStubAdapter);//aqui se ocupa el STUB + + // const managerAuthenticationProxy = new ManagerAuthenticationProxyAdapter(controlPlaneMock) + + it.concurrent("should get auth description", async()=>{ + const mockedUser = {email:"jovany@gmail.com",password:"123"} + const expectedResult={token:"123", refreshToken:"1234"} + //TODO + //Cambia este resultado, di que se espera recibir un objeto que contec + + const result = await controlPlaneMock.getAuthDetails(mockedUser.email,mockedUser.password); + expect(result).toEqual(expectedResult) + }) + + it.concurrent("should get permissions", async()=>{ + const mockedUser = {email:"jovany@gmail.com",password:"123"} + const expectedResult={admin:true, user:true} + //TODO + //Cambia este resultado, di que se espera recibir un objeto que contec + + const result = await controlPlaneMock.getPermissions(mockedUser.email,mockedUser.password); + expect(result).toEqual(expectedResult) + }) +}) \ No newline at end of file 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..1303c85 --- /dev/null +++ b/src/services/control-plane/app/control-plane.ts @@ -0,0 +1,18 @@ +import { ForManagerAuthentication } from "../ports/drivers"; +import { ForMonitoring } from '../ports/drivens/for-monitoring'; +import { AuthDetails,Permissions } from "./schemas"; +//Mi hexagono que tiene implementado los puertos de los driveR, en este caso es solo uno pero podrian ser mas +export class ControlPlane implements ForManagerAuthentication{ + //el Constructor los DriverN del puerto, osea que son los recurson necesario para que mi hexagono funcione + constructor(private readonly forMonitoring: ForMonitoring){} + + //Los metodos de mi hexagono que vienen de los driveR de los pruertos + async getAuthDetails(email: string, password: string): Promise { + + // const authDetails = await this. + return Promise.resolve({token:"123", refreshToken:"1234"}) + } + async getPermissions(email: string, password: string): Promise { + return Promise.resolve({admin:true,user:true}) + } +} \ No newline at end of file diff --git a/src/services/control-plane/app/schemas/auth.ts b/src/services/control-plane/app/schemas/auth.ts new file mode 100644 index 0000000..5095848 --- /dev/null +++ b/src/services/control-plane/app/schemas/auth.ts @@ -0,0 +1,8 @@ +export interface AuthDetails{ + token:string; + refreshToken:string; +} +export interface Permissions{ + admin: boolean; + user: boolean; +} \ No newline at end of file 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..269586e --- /dev/null +++ b/src/services/control-plane/app/schemas/index.ts @@ -0,0 +1 @@ +export * from './auth'; 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..6279b68 --- /dev/null +++ b/src/services/control-plane/ports/drivens/for-monitoring.ts @@ -0,0 +1,7 @@ +//Los driverN del puerto describer los recursos que necesito de otros hexagonos en este caso +//el hexagono de control plane no necesita nada de otro hexagono +//por lo cual el driveN se va a encargar de hacer el monitoreo + +export interface ForMonitoring { + log(event:string,message:string):void +} 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..9e34804 --- /dev/null +++ b/src/services/control-plane/ports/drivens/index.ts @@ -0,0 +1 @@ +export * from './for-monitoring'; diff --git a/src/services/control-plane/ports/drivers/for-managing-authentication.ts b/src/services/control-plane/ports/drivers/for-managing-authentication.ts new file mode 100644 index 0000000..ae96f71 --- /dev/null +++ b/src/services/control-plane/ports/drivers/for-managing-authentication.ts @@ -0,0 +1,8 @@ +import { AuthDetails,Permissions } from "../../app/schemas"; + +//Los driveR de los Puertos son los que describen mi hexagono, mis CONTRATOS +//en este caso el hexagono de control plane tiene dar detalles de autenticacion y los permisos de los usuarios +export interface ForManagerAuthentication{ + getAuthDetails(email: string, password: string): Promise; + getPermissions(email: string, password: string): Promise; +} \ No newline at end of file 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..434804e --- /dev/null +++ b/src/services/control-plane/ports/drivers/index.ts @@ -0,0 +1 @@ +export * from './for-managing-authentication';