-
Notifications
You must be signed in to change notification settings - Fork 546
/
container.js
79 lines (67 loc) · 2.13 KB
/
container.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
const { createContainer, asClass, asFunction, asValue } = require('awilix');
const { scopePerRequest } = require('awilix-express');
const config = require('../config');
const Application = require('./app/Application');
const {
CreateUser,
GetAllUsers,
GetUser,
UpdateUser,
DeleteUser
} = require('./app/user');
const UserSerializer = require('./interfaces/http/user/UserSerializer');
const Server = require('./interfaces/http/Server');
const router = require('./interfaces/http/router');
const loggerMiddleware = require('./interfaces/http/logging/loggerMiddleware');
const errorHandler = require('./interfaces/http/errors/errorHandler');
const devErrorHandler = require('./interfaces/http/errors/devErrorHandler');
const swaggerMiddleware = require('./interfaces/http/swagger/swaggerMiddleware');
const logger = require('./infra/logging/logger');
const SequelizeUsersRepository = require('./infra/user/SequelizeUsersRepository');
const { database, User: UserModel } = require('./infra/database/models');
const container = createContainer();
// System
container
.register({
app: asClass(Application).singleton(),
server: asClass(Server).singleton()
})
.register({
router: asFunction(router).singleton(),
logger: asFunction(logger).singleton()
})
.register({
config: asValue(config)
});
// Middlewares
container
.register({
loggerMiddleware: asFunction(loggerMiddleware).singleton()
})
.register({
containerMiddleware: asValue(scopePerRequest(container)),
errorHandler: asValue(config.production ? errorHandler : devErrorHandler),
swaggerMiddleware: asValue([swaggerMiddleware])
});
// Repositories
container.register({
usersRepository: asClass(SequelizeUsersRepository).singleton()
});
// Database
container.register({
database: asValue(database),
UserModel: asValue(UserModel)
});
// Operations
container.register({
createUser: asClass(CreateUser),
getAllUsers: asClass(GetAllUsers),
getUser: asClass(GetUser),
updateUser: asClass(UpdateUser),
deleteUser: asClass(DeleteUser)
});
// Serializers
container.register({
userSerializer: asValue(UserSerializer)
});
module.exports = container;