import { randomBytes } from "node:crypto"; import type { Sequelize } from "sequelize"; import { IdentityUseCases } from "./application/identity.use-cases"; import { UserInputMapper } from "./application/user-input.mapper"; import { registerIdentityRoutes } from "./infrastructure/http/identity.routes"; import { requireAuthenticated } from "./infrastructure/http/require-authenticated"; import { migrateIdentity } from "./infrastructure/persistence/migrate-identity"; import { SequelizeSessionStore } from "./infrastructure/persistence/sequelize-session.store"; import { SequelizeUserRepository } from "./infrastructure/persistence/sequelize-user.repository"; import { initializeIdentityModels } from "./infrastructure/persistence/user.model"; import { UserPersistenceMapper } from "./infrastructure/persistence/user-persistence.mapper"; import { ScryptPasswordHasher } from "./infrastructure/security/scrypt-password-hasher"; export { SequelizeSessionStore, migrateIdentity }; export async function createIdentityModule(database: Sequelize, origin: string) { initializeIdentityModels(database); const passwords = new ScryptPasswordHasher(); const users = new SequelizeUserRepository(database, new UserPersistenceMapper()); const useCases = new IdentityUseCases( users, passwords, new UserInputMapper(passwords), await passwords.hash(randomBytes(32).toString("hex")) ); return { authenticate: requireAuthenticated(useCases), register: (app: Parameters[0]) => registerIdentityRoutes(app, useCases, origin), }; }