const { createContainer, asClass, asFunction, asValue } = require('awilix'); const { Sequelize } = require('sequelize'); const mongoose = require('mongoose'); const fs = require('fs'); const path = require('path'); const config = require('../config'); function setupContainer() { const container = createContainer(); container.register({ sequelize: asFunction(() => { const sequelize = new Sequelize( config.database.postgres.uri, config.database.postgres.options ); const modelsDir = path.join(__dirname, '../models'); fs.readdirSync(modelsDir) .filter( (file) => file.indexOf('.') !== 0 && file.slice(-3) === '.js' && file !== 'bet.model.js' && file !== 'associations.js' ) .forEach((file) => { require(path.join(modelsDir, file))(sequelize); }); const defineAssociations = require('../models/associations'); defineAssociations(sequelize); return sequelize; }).singleton(), mongoose: asValue(mongoose), }); container.register({ usersRepository: asClass( require('../repositories/postgres/users.repository') ).scoped(), groupsRepository: asClass( require('../repositories/postgres/groups.repository') ).scoped(), friendshipsRepository: asClass( require('../repositories/postgres/friendships.repository') ).scoped(), friendRequestsRepository: asClass( require('../repositories/postgres/friendRequests.repository') ).scoped(), betsRepository: asClass( require('../repositories/mongo/bets.repository') ).scoped(), }); container.register({ dataStitchingService: asClass( require('../services/data-stitching.service') ).scoped(), usersService: asClass(require('../services/users.service')).scoped(), groupsService: asClass(require('../services/groups.service')).scoped(), friendsService: asClass(require('../services/friends.service')).scoped(), betsService: asClass(require('../services/bets.service')).scoped(), }); container.register({ betsController: asClass(require('../controllers/bets.controller')).scoped(), groupsController: asClass(require('../controllers/groups.controller')).scoped(), usersController: asClass(require('../controllers/users.controller')).scoped(), friendsController: asClass(require('../controllers/friends.controller')).scoped(), initialDataController: asClass( require('../controllers/initialData.controller') ).scoped(), }); return container; } module.exports = setupContainer;