import { Provider } from '@nestjs/common'; // Import interfaces and concrete implementations import { StoredUser } from '@core/identity/domain/repositories/IUserRepository'; import type { IPasswordHashingService } from '@core/identity/domain/services/PasswordHashingService'; import { InMemoryAuthRepository } from '@adapters/identity/persistence/inmemory/InMemoryAuthRepository'; import { InMemoryUserRepository } from '@adapters/identity/persistence/inmemory/InMemoryUserRepository'; import { InMemoryPasswordHashingService } from '@adapters/identity/services/InMemoryPasswordHashingService'; import { ConsoleLogger } from '@adapters/logging/ConsoleLogger'; import { CookieIdentitySessionAdapter } from '@adapters/identity/session/CookieIdentitySessionAdapter'; import { LoginUseCase } from '@core/identity/application/use-cases/LoginUseCase'; import { LogoutUseCase } from '@core/identity/application/use-cases/LogoutUseCase'; import { SignupUseCase } from '@core/identity/application/use-cases/SignupUseCase'; import { AuthSessionPresenter } from './presenters/AuthSessionPresenter'; import { CommandResultPresenter } from './presenters/CommandResultPresenter'; import type { Logger, UseCaseOutputPort } from '@core/shared/application'; import type { LoginResult } from '@core/identity/application/use-cases/LoginUseCase'; import type { SignupResult } from '@core/identity/application/use-cases/SignupUseCase'; import type { LogoutResult } from '@core/identity/application/use-cases/LogoutUseCase'; import type { IAuthRepository } from '@core/identity/domain/repositories/IAuthRepository'; import type { IdentitySessionPort } from '@core/identity/application/ports/IdentitySessionPort'; // Define the tokens for dependency injection export const AUTH_REPOSITORY_TOKEN = 'IAuthRepository'; export const USER_REPOSITORY_TOKEN = 'IUserRepository'; export const PASSWORD_HASHING_SERVICE_TOKEN = 'IPasswordHashingService'; export const LOGGER_TOKEN = 'Logger'; export const IDENTITY_SESSION_PORT_TOKEN = 'IdentitySessionPort'; export const LOGIN_USE_CASE_TOKEN = 'LoginUseCase'; export const SIGNUP_USE_CASE_TOKEN = 'SignupUseCase'; export const LOGOUT_USE_CASE_TOKEN = 'LogoutUseCase'; export const AUTH_SESSION_OUTPUT_PORT_TOKEN = 'AuthSessionOutputPort'; export const COMMAND_RESULT_OUTPUT_PORT_TOKEN = 'CommandResultOutputPort'; export const AuthProviders: Provider[] = [ { provide: AUTH_REPOSITORY_TOKEN, useFactory: (userRepository: InMemoryUserRepository, passwordHashingService: IPasswordHashingService, logger: Logger) => new InMemoryAuthRepository(userRepository, passwordHashingService, logger), inject: [USER_REPOSITORY_TOKEN, PASSWORD_HASHING_SERVICE_TOKEN, LOGGER_TOKEN], }, { provide: USER_REPOSITORY_TOKEN, useFactory: (logger: Logger) => { const initialUsers: StoredUser[] = [ { // Match seeded racing driver id so dashboard works in inmemory mode. id: 'driver-1', email: 'admin@gridpilot.local', passwordHash: 'demo_salt_321nimda', // InMemoryPasswordHashingService: "admin123" reversed. displayName: 'Admin', salt: '', createdAt: new Date(), }, ]; return new InMemoryUserRepository(logger, initialUsers); }, inject: [LOGGER_TOKEN], }, { provide: PASSWORD_HASHING_SERVICE_TOKEN, useClass: InMemoryPasswordHashingService, }, { provide: LOGGER_TOKEN, useClass: ConsoleLogger, }, { provide: IDENTITY_SESSION_PORT_TOKEN, useFactory: (logger: Logger) => new CookieIdentitySessionAdapter(logger), inject: [LOGGER_TOKEN], }, { provide: AuthSessionPresenter, useClass: AuthSessionPresenter, }, { provide: CommandResultPresenter, useClass: CommandResultPresenter, }, { provide: AUTH_SESSION_OUTPUT_PORT_TOKEN, useExisting: AuthSessionPresenter, }, { provide: COMMAND_RESULT_OUTPUT_PORT_TOKEN, useExisting: CommandResultPresenter, }, { provide: LOGIN_USE_CASE_TOKEN, useFactory: ( authRepo: IAuthRepository, passwordHashing: IPasswordHashingService, logger: Logger, output: UseCaseOutputPort, ) => new LoginUseCase(authRepo, passwordHashing, logger, output), inject: [AUTH_REPOSITORY_TOKEN, PASSWORD_HASHING_SERVICE_TOKEN, LOGGER_TOKEN, AUTH_SESSION_OUTPUT_PORT_TOKEN], }, { provide: SIGNUP_USE_CASE_TOKEN, useFactory: ( authRepo: IAuthRepository, passwordHashing: IPasswordHashingService, logger: Logger, output: UseCaseOutputPort, ) => new SignupUseCase(authRepo, passwordHashing, logger, output), inject: [AUTH_REPOSITORY_TOKEN, PASSWORD_HASHING_SERVICE_TOKEN, LOGGER_TOKEN, AUTH_SESSION_OUTPUT_PORT_TOKEN], }, { provide: LOGOUT_USE_CASE_TOKEN, useFactory: (sessionPort: IdentitySessionPort, logger: Logger, output: UseCaseOutputPort) => new LogoutUseCase(sessionPort, logger, output), inject: [IDENTITY_SESSION_PORT_TOKEN, LOGGER_TOKEN, COMMAND_RESULT_OUTPUT_PORT_TOKEN], }, ];