-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
138 lines (115 loc) · 4.91 KB
/
server.js
File metadata and controls
138 lines (115 loc) · 4.91 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// -------------------------------------------------------------------------
// Pending Tasks:
// Create mongo indexes
// Add permissions in middleware auth
// Add foreign keys
// -------------------------------------------------------------------------
'use strict'
const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
// Config properties
const resourcesProps = require('./config/resources_props')
const serverProps = require('./config/server_props')
const authProps = require('./config/auth_props')
// Utils
const validateConfigProps = require('./utils/config_props_validator')
const compileResourcesSchemas = require('./utils/resources_schemas_compiler')
const openMongoCollection = require('./utils/mongo_utils').openMongoCollection
const loginSchema = require('./utils/login_schema')
// Middlewares
const auth = require('./middleware/authentication/auth')
const validateResources = require('./middleware/resources-schemas-validator/resources_validator.js')
// Routers
const router_login = require('./routers_endpoints/router_login')
const router_resource = require('./routers_endpoints/router_resource')
const router_rest_api_doc = require('./routers_endpoints/router_rest_api_doc')
const router_react_app = require('./routers_endpoints/router_react_app')
// ----------------------------------------------
// Validating config props with internal schemas
// ----------------------------------------------
try {
validateConfigProps(authProps, resourcesProps, serverProps)
} catch(error) {
console.log(error.message)
process.exit()
}
// ----------------------------
// Compiling resources schemas
// ----------------------------
try {
compileResourcesSchemas(__dirname, resourcesProps)
} catch(error) {
console.log('ERROR:', error.message)
process.exit()
}
// -------------------------------
// Opening connections to MongoDB
// -------------------------------
let promises = resourcesProps.map(resource =>
openMongoCollection(resource.resource, resource.mongodb_uri, resource.mongodb_database, resource.mongodb_collection, resource.mongodb_poolSize)
)
if (authProps.enable_auth) {
let login_col = authProps.users_datasource
promises.push(openMongoCollection('login', login_col.mongodb_uri, login_col.mongodb_database, login_col.mongodb_collection, 5))
}
Promise.all(promises)
.then(mongo_cols => {
console.log('\nOpen MongoDB connections:')
mongo_cols.forEach(col => {
let resourceSchema
if (col.resource === 'login') {
resourceSchema = './utils/login_schema.js'
} else {
resourceSchema = resourcesProps.filter(x => x.resource === col.resource)[0].schema
}
console.log(` ... opened: '${col.col_name}' (${col.mongodb_uri}/${col.db_name}) (resource: ${col.resource}) (schema: ${resourceSchema})`)
})
createApp(mongo_cols)
})
.catch(error => {
console.log('ERROR:', error.message)
process.exit()
})
// -------------------
// Create express App
// -------------------
const createApp = (mongo_cols) => {
const app = express()
app.use( bodyParser.json({ limit: '50mb' }) )
app.use( cors() )
const url_base = `http://${serverProps.server_ip}:${serverProps.server_port}`
console.log('\nInstantiate endpoints (express app):')
// --------------
// Root endpoint
// --------------
if (serverProps.isProduction) {
app.use('/', router_react_app(__dirname))
console.log(`\n... Mounting React App: ${url_base}/`)
} else {
app.use('/', router_rest_api_doc(url_base, resourcesProps, authProps, loginSchema))
console.log(`\n... Mounting REST API documentation endpoint: ${url_base}/`)
}
// ------------------------------------------------------
// Login: instantiate router first, then middleware auth
// ------------------------------------------------------
if (authProps.enable_auth) {
let loginCollection = mongo_cols.filter(x => x.resource === 'login')[0].collection
app.use('/login', router_login(authProps, loginSchema, loginCollection))
app.use((req, res, next) => { auth(req, res, next) })
console.log(`\n... Mounting Login endpoint to get auth token: ${url_base}/login`)
}
// ------------------------------------------------------------------------------
// Resources: middleware to validate JSON schemas first, then instantiate router
// ------------------------------------------------------------------------------
let resource_cols = mongo_cols.filter(x => x.resource !== 'login')
resource_cols.forEach(resource => {
console.log('\n... Mounting endpoints [GET (all), GET, POST, PUT, PATCH, DELETE] for resource path:', `${url_base}/${resource.resource}`)
app.use((req, res, next) => { validateResources(req, res, next, resourcesProps) })
app.use(`/${resource.resource}`, router_resource(resource.collection))
})
// -----------------
// Launching server
// -----------------
app.listen(serverProps.server_port, () => { console.log(`\nServer running on port ${serverProps.server_port} ...`) })
}