diff --git a/packages/core/src/di/container.ts b/packages/core/src/di/container.ts new file mode 100644 index 0000000..f53d0f4 --- /dev/null +++ b/packages/core/src/di/container.ts @@ -0,0 +1,32 @@ +import "reflect-metadata"; +import { Container } from "inversify"; + +import { AuthModule } from "./modules/auth.module.js"; +import { ContentModule } from "./modules/content.module.js"; +import { DI_RETURN_TYPES, DI_SYMBOLS } from "./types.js"; + +const ApplicationContainer = new Container({ + defaultScope: "Singleton", +}); + +export const initializeContainer = () => { + ApplicationContainer.load(AuthModule); + ApplicationContainer.load(ContentModule); +}; + +export const destroyContainer = () => { + ApplicationContainer.unload(AuthModule); + ApplicationContainer.unload(ContentModule); +}; + +if (process.env.NODE_ENV !== "test") { + initializeContainer(); +} + +export function getInjection( + symbol: K +): DI_RETURN_TYPES[K] { + return ApplicationContainer.get(DI_SYMBOLS[symbol]); +} + +export { ApplicationContainer }; diff --git a/packages/core/src/di/modules/auth.module.ts b/packages/core/src/di/modules/auth.module.ts new file mode 100644 index 0000000..58111f6 --- /dev/null +++ b/packages/core/src/di/modules/auth.module.ts @@ -0,0 +1,16 @@ +import { ContainerModule, interfaces } from "inversify"; + +import type { IUsersRepository } from "@/application/repositories/users.repository.interface.js"; +import type { IAuthenticationService } from "@/application/services/auth.service.interface.js"; +import { MockUsersRepository } from "@/infrastructure/repositories/mock-users.repository.js"; +import { MockAuthenticationService } from "@/infrastructure/services/mock-auth.service.js"; +import { DI_SYMBOLS } from "../types.js"; + +const initializeModule = (bind: interfaces.Bind) => { + bind(DI_SYMBOLS.IUsersRepository).to(MockUsersRepository); + bind(DI_SYMBOLS.IAuthenticationService).to( + MockAuthenticationService + ); +}; + +export const AuthModule = new ContainerModule(initializeModule); diff --git a/packages/core/src/di/modules/content.module.ts b/packages/core/src/di/modules/content.module.ts new file mode 100644 index 0000000..15ca4dd --- /dev/null +++ b/packages/core/src/di/modules/content.module.ts @@ -0,0 +1,13 @@ +import { ContainerModule, interfaces } from "inversify"; + +import type { IArticlesRepository } from "@/application/repositories/articles.repository.interface.js"; +import { MockArticlesRepository } from "@/infrastructure/repositories/mock-articles.repository.js"; +import { DI_SYMBOLS } from "../types.js"; + +const initializeModule = (bind: interfaces.Bind) => { + bind(DI_SYMBOLS.IArticlesRepository).to( + MockArticlesRepository + ); +}; + +export const ContentModule = new ContainerModule(initializeModule); diff --git a/packages/core/src/di/types.ts b/packages/core/src/di/types.ts new file mode 100644 index 0000000..b923ad4 --- /dev/null +++ b/packages/core/src/di/types.ts @@ -0,0 +1,18 @@ +import type { IAuthenticationService } from "@/application/services/auth.service.interface.js"; +import type { ITelemetryService } from "@/application/services/telemetry.service.interface.js"; +import type { IUsersRepository } from "@/application/repositories/users.repository.interface.js"; +import type { IArticlesRepository } from "@/application/repositories/articles.repository.interface.js"; + +export const DI_SYMBOLS = { + IAuthenticationService: Symbol.for("IAuthenticationService"), + ITelemetryService: Symbol.for("ITelemetryService"), + IUsersRepository: Symbol.for("IUsersRepository"), + IArticlesRepository: Symbol.for("IArticlesRepository"), +}; + +export interface DI_RETURN_TYPES { + IAuthenticationService: IAuthenticationService; + ITelemetryService: ITelemetryService; + IUsersRepository: IUsersRepository; + IArticlesRepository: IArticlesRepository; +}