import { Layer } from "effect"; import { PasswordService } from "./services/PasswordService.js"; import { TokenService } from "./services/TokenService.js"; import { UserRepository } from "./services/UserRepository.js"; import { SessionRepository } from "./services/SessionRepository.js"; import { AuditLogService } from "./services/AuditLogService.js"; import { AuthService } from "./services/AuthService.js"; import { DatabaseService } from "../database/db.js"; import { UserManagementLayer } from "../user-management/layers.js"; /** * Creates the complete application layer with all auth services * @param dbConfig Database configuration * @returns Complete layer with all services including DatabaseService */ export const createAppLayer = (dbConfig: { path: string; timeout?: number; verbose?: boolean }) => { // Base database layer const DbLayer = DatabaseService.Live(dbConfig); // Service layers that don't require DatabaseService const IndependentServices = Layer.mergeAll( PasswordService.Live, TokenService.Live ); // Services and repositories that require DatabaseService const DbDependentServices = Layer.mergeAll( AuditLogService.Live, UserRepository.Live, SessionRepository.Live ); // Provide DatabaseService to dependent services const DbDependentWithDb = Layer.provide(DbDependentServices, DbLayer); // Merge all services and database const BaseServices = Layer.mergeAll( IndependentServices, DbDependentWithDb, DbLayer ); // Add user management layer const ServicesWithUserManagement = Layer.mergeAll( BaseServices, UserManagementLayer ); // Provide all dependencies to AuthService const AuthWithDeps = Layer.provide(AuthService.Live, ServicesWithUserManagement); // Complete application layer - merge everything return Layer.mergeAll( ServicesWithUserManagement, AuthWithDeps ); };