metis-desk/modules/companies/src/api/module.ts
2026-10-05 09:53:29 +02:00

69 lines
3.6 KiB
TypeScript

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<typeof registerWorkProfileRoutes>[0]) =>
registerWorkProfileRoutes(app, profiles, authenticate),
};
},
initializeMail: async (inventory: IMailInventoryService) => {
await migrateMailConfigurations(database);
const mail = new MailConfigurationUseCases(
new SequelizeMailConfigurationRepository(database, inventory)
);
return {
register: (app: Parameters<typeof registerMailRoutes>[0]) =>
registerMailRoutes(app, mail, authenticate),
};
},
register: (app: Parameters<typeof registerCompanyRoutes>[0]) => {
registerCompanyRoutes(app, useCases, authenticate);
registerAccessRoutes(app, access, authenticate);
},
};
}