diff --git a/index.js b/index.js index 2d63899..0a9eabd 100644 --- a/index.js +++ b/index.js @@ -21,14 +21,14 @@ logger.add(new winston.transports.Console({ 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()); +container.registerInstance('Logger', logger); +container.registerType('AsyncFs', AsyncFs); +container.registerType('DateTimeProvider', DateTimeProvider); +container.registerType('ApiRoutes', ApiRoutes); +container.registerType('NotificationRepository', NotificationRepository); +container.registerType('NotificationFacade', NotificationFacade); +container.registerType('TransportProvider', TransportProvider); +container.registerType('SubjectParser', SubjectParser); async function asyncMain() @@ -47,7 +47,7 @@ async function asyncMain() } - container.register('Config', c => config); + container.registerInstance('Config', config); await container.NotificationRepository.init(); @@ -57,7 +57,7 @@ async function asyncMain() app.use(express.json()); app.use(express.urlencoded({ extended: false })); - app.use('/api', container.ApiRoutes.create(express)); + app.use('/api', container.ApiRoutes.createRouter(express)); app.use('/', express.static('frontend/dist')); app.listen(config.port, () => diff --git a/src/asyncfs.js b/src/asyncfs.js index ef26e46..dfec577 100644 --- a/src/asyncfs.js +++ b/src/asyncfs.js @@ -3,6 +3,9 @@ const fs = require('fs').promises; class AsyncFs { + static create = () => new this(); + + async exists(path) { try diff --git a/src/container.js b/src/container.js index 155fd30..46d68be 100644 --- a/src/container.js +++ b/src/container.js @@ -1,5 +1,5 @@ /* - * Original concept and code by Magnus Tovslid: + * Modified version of code by Magnus Tovslid: * https://medium.com/@magnusjt/ioc-container-in-nodejs-e7aea8a89600 */ class Container @@ -9,7 +9,22 @@ class Container this.services = {}; } - register(name, factory) + + // Assumes the class has a static method called create which accepts + // a Container style object + registerType(name, type) + { + this.registerFactory(name, c => type.create(c)); + } + + + registerInstance(name, instance) + { + this.registerFactory(name, () => instance); + } + + + registerFactory(name, factory) { Object.defineProperty(this, name, { get: () => diff --git a/src/datetimeprovider.js b/src/datetimeprovider.js index 1c3d95f..bf408b1 100644 --- a/src/datetimeprovider.js +++ b/src/datetimeprovider.js @@ -3,6 +3,9 @@ const { DateTime } = require('luxon'); class DateTimeProvider { + static create = () => new this(); + + unixTimestamp() { return Math.floor(DateTime.now().toSeconds()); diff --git a/src/notification/facade.js b/src/notification/facade.js index d18bbfb..2ad2168 100644 --- a/src/notification/facade.js +++ b/src/notification/facade.js @@ -1,5 +1,9 @@ class NotificationFacade { + static create = container => new this(container.Logger, container.DateTimeProvider, container.TransportProvider, + container.SubjectParser, container.NotificationRepository, container.Config); + + constructor(logger, dateTimeProvider, transportProvider, subjectParser, notificationRepository, config) { this.logger = logger; diff --git a/src/notification/repository.js b/src/notification/repository.js index ac570ee..f06cadd 100644 --- a/src/notification/repository.js +++ b/src/notification/repository.js @@ -4,6 +4,9 @@ const crypto = require('crypto'); class NotificationRepository { + static create = container => new this(container.Logger, container.DateTimeProvider, container.AsyncFs, container.Config); + + constructor(logger, dateTimeProvider, asyncFs, config) { this.logger = logger; diff --git a/src/routes/api.js b/src/routes/api.js index 2e41adf..43229a0 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -1,5 +1,8 @@ class ApiRoutes { + static create = container => new this(container.logger, container.NotificationFacade, container.Config); + + constructor(logger, notificationFacade, config) { this.logger = logger; @@ -8,7 +11,7 @@ class ApiRoutes } - create(express) + createRouter(express) { const router = express.Router(); diff --git a/src/subjectparser.js b/src/subjectparser.js index 028f270..a908537 100644 --- a/src/subjectparser.js +++ b/src/subjectparser.js @@ -1,5 +1,8 @@ class SubjectParser { + static create = () => new this(); + + parse(subject) { // Possible formats: diff --git a/src/transport/provider.js b/src/transport/provider.js index b7f5d2d..b9f3ec1 100644 --- a/src/transport/provider.js +++ b/src/transport/provider.js @@ -7,6 +7,9 @@ const transportMap = { class TransportProvider { + static create = () => new this(); + + byType(type) { return transportMap.hasOwnProperty(type) ? transportMap[type] : null;