const Container = require('./src/container'); const winston = require('winston'); const express = require('express'); const AsyncFs = require('./src/asyncfs'); const DateTimeProvider = require('./src/datetimeprovider'); const ApiRoutes = require('./src/routes/api'); const NotificationRepository = require('./src/notification/repository'); const NotificationFacade = require('./src/notification/facade'); const TransportProvider = require('./src/transport/provider'); const SubjectParser = require('./src/subjectparser'); const logger = winston.createLogger({ level: 'verbose', }); logger.add(new winston.transports.Console({ format: winston.format.simple() })) const container = new Container(); container.register('Logger', c => logger); container.register('AsyncFs', c => new AsyncFs()); container.register('DateTimeProvider', c => new DateTimeProvider()); container.register('ApiRoutes', c => new ApiRoutes(c.Logger, c.NotificationFacade, c.Config)); container.register('NotificationRepository', c => new NotificationRepository(c.Logger, c.DateTimeProvider, c.AsyncFs, c.Config)); container.register('NotificationFacade', c => new NotificationFacade(c.Logger, c.DateTimeProvider, c.TransportProvider, c.SubjectParser, c.NotificationRepository, c.Config)); container.register('TransportProvider', c => new TransportProvider()); container.register('SubjectParser', c => new SubjectParser()); async function asyncMain() { let config; if (await container.AsyncFs.exists('config.js')) { logger.verbose('Using config.js'); config = require('./config.js'); } else { logger.verbose('No config.js found, using config.default.js'); config = require('./config.default.js'); } container.register('Config', c => config); await container.NotificationRepository.init(); const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use('/api', container.ApiRoutes.create(express)); app.use('/', express.static('frontend/dist')); app.listen(config.port, () => { logger.info(`NotificationLatch listening at http://localhost:${config.port}`); }); } asyncMain() .catch(err => { logger.error(`Unhandled exception: ${err}`); logger.verbose(err.stack); });