import type { RequestHandler } from "express"; import type { Sequelize } from "sequelize"; import { AccessUseCases } from "./application/access.use-cases"; import { CompanyUseCases } from "./application/company.use-cases"; import { CompanyInputMapper } from "./application/company-input.mapper"; import type { IMailInventoryService } from "./application/mail-configuration.repository"; import { MailConfigurationUseCases } from "./application/mail-configuration.use-cases"; import type { IWorkProfileInventoryService } from "./application/work-profile.repository"; import { WorkProfileUseCases } from "./application/work-profile.use-cases"; import { registerAccessRoutes } from "./infrastructure/http/access.routes"; import { registerCompanyRoutes } from "./infrastructure/http/company.routes"; import { registerMailRoutes } from "./infrastructure/http/mail-configuration.routes"; import { registerWorkProfileRoutes } from "./infrastructure/http/work-profile.routes"; import { AccessPersistenceMapper, SequelizeAccessRepository, migrateAccess, } from "./infrastructure/persistence/access-persistence"; import { initializeCompanyModels } from "./infrastructure/persistence/company.model"; import { CompanyPersistenceMapper } from "./infrastructure/persistence/company-persistence.mapper"; import { migrateMailConfigurations } from "./infrastructure/persistence/mail-configuration-migration"; import { migrateCompanies } from "./infrastructure/persistence/migrate-companies"; import { migratePeople } from "./infrastructure/persistence/migrate-people"; import { initializePeopleModels } from "./infrastructure/persistence/people.model"; import { SequelizeCompanyRepository } from "./infrastructure/persistence/sequelize-company.repository"; import { SequelizeMailConfigurationRepository } from "./infrastructure/persistence/sequelize-mail-configuration.repository"; import { SequelizeWorkProfileRepository } from "./infrastructure/persistence/sequelize-work-profile.repository"; import { migrateWorkProfiles } from "./infrastructure/persistence/work-profile-migration"; export async function createCompanyModule(database: Sequelize, authenticate: RequestHandler) { await migrateCompanies(database); await migratePeople(database); initializeCompanyModels(database); initializePeopleModels(database); const repository = new SequelizeCompanyRepository(database, new CompanyPersistenceMapper()); await migrateAccess(database); const access = new AccessUseCases( new SequelizeAccessRepository(database, repository, new AccessPersistenceMapper()) ); const useCases = new CompanyUseCases(repository, new CompanyInputMapper()); return { initializeProfiles: async (inventory: IWorkProfileInventoryService) => { await migrateWorkProfiles(database); const profiles = new WorkProfileUseCases( new SequelizeWorkProfileRepository(database, inventory) ); return { register: (app: Parameters[0]) => registerWorkProfileRoutes(app, profiles, authenticate), }; }, initializeMail: async (inventory: IMailInventoryService) => { await migrateMailConfigurations(database); const mail = new MailConfigurationUseCases( new SequelizeMailConfigurationRepository(database, inventory) ); return { register: (app: Parameters[0]) => registerMailRoutes(app, mail, authenticate), }; }, register: (app: Parameters[0]) => { registerCompanyRoutes(app, useCases, authenticate); registerAccessRoutes(app, access, authenticate); }, }; }