import { createAssetModule } from "@metis/assets/module"; import { createCompanyModule } from "@metis/companies/module"; import { SequelizeSessionStore, createIdentityModule, migrateIdentity, } from "@metis/identity/module"; import { createResourceModule } from "@metis/resources/module"; import session from "express-session"; import type { Sequelize } from "sequelize"; import type { readDatabaseEnvironment } from "../../config/database"; export async function createIdentityRuntime( database: Sequelize, environment: ReturnType, options: { legacyResourceFixtures?: boolean } = {} ) { await database.authenticate(); await migrateIdentity(database); const identity = await createIdentityModule(database, environment.APP_ORIGIN); const companies = await createCompanyModule( database, identity.authenticate, options.legacyResourceFixtures === true && environment.NODE_ENV === "test" ); const resources = await createResourceModule(database, identity.authenticate); const assets = await createAssetModule(database, identity.authenticate); const mail = await companies.initializeMail(assets.services.inventory); const profiles = await companies.initializeProfiles( assets.services.inventory, resources.services.inventory ); await resources.migrateLegacy(); const dashboard = companies.initializeDashboard( assets.services.dashboard, resources.services.dashboard ); const store = new SequelizeSessionStore(database); const middleware = session({ name: "metis.sid", secret: environment.SESSION_SECRET, store, resave: false, saveUninitialized: false, cookie: { httpOnly: true, sameSite: "strict", secure: environment.NODE_ENV === "production", maxAge: 8 * 60 * 60 * 1000, }, }); return { register: (app: Parameters[0]) => { identity.register(app); companies.register(app); assets.register(app); resources.register(app); mail.register(app); profiles.register(app); dashboard.register(app); }, middleware, // El almacén relacional no utiliza un temporizador de fondo. stop: () => undefined, }; }