| 
									
										
										
										
											2018-09-03 11:23:18 +01:00
										 |  |  | const path = require('path'); | 
					
						
							| 
									
										
										
										
											2018-10-24 00:24:48 +01:00
										 |  |  | require('dotenv').config({ path: path.resolve(__dirname, '../../.env') }); | 
					
						
							| 
									
										
										
										
											2016-06-23 20:05:30 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 11:15:24 -08:00
										 |  |  | const _ = require('lodash'); | 
					
						
							|  |  |  | const Rx = require('rx'); | 
					
						
							|  |  |  | const loopback = require('loopback'); | 
					
						
							|  |  |  | const boot = require('loopback-boot'); | 
					
						
							|  |  |  | const expressState = require('express-state'); | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  | const createDebugger = require('debug'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-23 16:29:26 +01:00
										 |  |  | const { setupPassport } = require('./component-passport'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  | const log = createDebugger('fcc:server'); | 
					
						
							|  |  |  | // force logger to always output
 | 
					
						
							|  |  |  | // this may be brittle
 | 
					
						
							|  |  |  | log.enabled = true; | 
					
						
							| 
									
										
										
										
											2013-11-26 23:15:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-14 17:22:56 -07:00
										 |  |  | Rx.config.longStackSupport = process.env.NODE_DEBUG !== 'production'; | 
					
						
							| 
									
										
										
										
											2018-01-06 11:15:24 -08:00
										 |  |  | const app = loopback(); | 
					
						
							| 
									
										
										
										
											2015-07-13 18:47:19 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-29 09:55:39 -07:00
										 |  |  | expressState.extend(app); | 
					
						
							| 
									
										
										
										
											2015-07-13 18:47:19 -07:00
										 |  |  | app.set('state namespace', '__fcc__'); | 
					
						
							| 
									
										
										
										
											2014-01-11 22:53:31 -05:00
										 |  |  | app.set('port', process.env.PORT || 3000); | 
					
						
							|  |  |  | app.set('views', path.join(__dirname, 'views')); | 
					
						
							|  |  |  | app.set('view engine', 'jade'); | 
					
						
							| 
									
										
										
										
											2015-08-16 09:54:34 -07:00
										 |  |  | app.use(loopback.token()); | 
					
						
							| 
									
										
										
										
											2015-08-04 13:28:41 +01:00
										 |  |  | app.disable('x-powered-by'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 00:24:48 +01:00
										 |  |  | const createLogOnce = () => { | 
					
						
							|  |  |  |   let called = false; | 
					
						
							|  |  |  |   return str => { | 
					
						
							|  |  |  |     if (called) { | 
					
						
							|  |  |  |       return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     called = true; | 
					
						
							|  |  |  |     return log(str); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | const logOnce = createLogOnce(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | boot(app, __dirname, err => { | 
					
						
							|  |  |  |   if (err) { | 
					
						
							| 
									
										
										
										
											2019-08-09 21:27:26 +03:00
										 |  |  |     // rethrowing the error here because any error thrown in the boot stage
 | 
					
						
							| 
									
										
										
										
											2018-10-24 00:24:48 +01:00
										 |  |  |     // is silent
 | 
					
						
							|  |  |  |     logOnce('The below error was thrown in the boot stage'); | 
					
						
							|  |  |  |     throw err; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-06-04 10:52:12 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-11 22:33:54 -08:00
										 |  |  | setupPassport(app); | 
					
						
							| 
									
										
										
										
											2015-06-04 10:52:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 11:15:24 -08:00
										 |  |  | const { db } = app.datasources; | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  | db.on('connected', _.once(() => log('db connected'))); | 
					
						
							| 
									
										
										
										
											2015-10-14 23:48:48 -07:00
										 |  |  | app.start = _.once(function() { | 
					
						
							| 
									
										
										
										
											2018-01-06 11:15:24 -08:00
										 |  |  |   const server = app.listen(app.get('port'), function() { | 
					
						
							| 
									
										
										
										
											2015-07-01 14:35:15 -07:00
										 |  |  |     app.emit('started'); | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  |     log( | 
					
						
							| 
									
										
										
										
											2017-01-13 21:14:43 -05:00
										 |  |  |       'freeCodeCamp server listening on port %d in %s', | 
					
						
							| 
									
										
										
										
											2015-06-21 18:10:17 -07:00
										 |  |  |       app.get('port'), | 
					
						
							|  |  |  |       app.get('env') | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  |     log(`connecting to db at ${db.settings.url}`); | 
					
						
							| 
									
										
										
										
											2018-01-06 11:15:24 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   process.on('SIGINT', () => { | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  |     log('Shutting down server'); | 
					
						
							| 
									
										
										
										
											2018-01-06 11:15:24 -08:00
										 |  |  |     server.close(() => { | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  |       log('Server is closed'); | 
					
						
							| 
									
										
										
										
											2018-01-06 11:15:24 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-01-06 11:24:08 -08:00
										 |  |  |     log('closing db connection'); | 
					
						
							| 
									
										
										
										
											2018-08-23 16:29:26 +01:00
										 |  |  |     db.disconnect().then(() => { | 
					
						
							|  |  |  |       log('DB connection closed'); | 
					
						
							|  |  |  |       // exit process
 | 
					
						
							|  |  |  |       // this may close kept alive sockets
 | 
					
						
							|  |  |  |       // eslint-disable-next-line no-process-exit
 | 
					
						
							|  |  |  |       process.exit(0); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-06-21 18:10:17 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-10-14 23:48:48 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2015-06-21 18:37:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-24 22:22:40 -07:00
										 |  |  | module.exports = app; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 18:37:29 -07:00
										 |  |  | // start the server if `$ node server.js`
 | 
					
						
							| 
									
										
										
										
											2015-07-24 22:22:40 -07:00
										 |  |  | // in production use `$npm start-production`
 | 
					
						
							|  |  |  | // or `$node server/production` to start the server
 | 
					
						
							|  |  |  | // and wait for DB handshake
 | 
					
						
							| 
									
										
										
										
											2015-06-21 18:37:29 -07:00
										 |  |  | if (require.main === module) { | 
					
						
							| 
									
										
										
										
											2015-07-24 22:22:40 -07:00
										 |  |  |   app.start(); | 
					
						
							| 
									
										
										
										
											2015-06-21 18:10:17 -07:00
										 |  |  | } |