From 956a2b915e6ad1095fb03a6d7f7c2894ba5a3961 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 2 Jun 2015 17:27:02 -0700 Subject: [PATCH] initial move to loopback server --- server/boot/authentication.js | 4 ++++ server/boot/explorer.js | 27 +++++++++++++++++++++ server/boot/middlewares.js | 0 server/boot/restApi.js | 4 ++++ server/config.json | 29 ++++++++++++++++++++++ server/datasources.json | 9 +++++++ server/middleware.json | 27 +++++++++++++++++++++ server/model-config.json | 33 +++++++++++++++++++++++++ server/server.js | 45 ++++++++++++++++------------------- 9 files changed, 153 insertions(+), 25 deletions(-) create mode 100644 server/boot/authentication.js create mode 100644 server/boot/explorer.js create mode 100644 server/boot/middlewares.js create mode 100644 server/boot/restApi.js create mode 100644 server/config.json create mode 100644 server/datasources.json create mode 100644 server/middleware.json create mode 100644 server/model-config.json diff --git a/server/boot/authentication.js b/server/boot/authentication.js new file mode 100644 index 0000000000..a87cd08161 --- /dev/null +++ b/server/boot/authentication.js @@ -0,0 +1,4 @@ +module.exports = function enableAuthentication(server) { + // enable authentication + server.enableAuth(); +}; diff --git a/server/boot/explorer.js b/server/boot/explorer.js new file mode 100644 index 0000000000..de40021e5f --- /dev/null +++ b/server/boot/explorer.js @@ -0,0 +1,27 @@ +module.exports = function mountLoopBackExplorer(server) { + var explorer; + try { + explorer = require('loopback-explorer'); + } catch(err) { + // Print the message only when the app was started via `server.listen()`. + // Do not print any message when the project is used as a component. + server.once('started', function() { + console.log( + 'Run `npm install loopback-explorer` to enable the LoopBack explorer' + ); + }); + return; + } + + var restApiRoot = server.get('restApiRoot'); + + var explorerApp = explorer(server, { basePath: restApiRoot }); + server.use('/explorer', explorerApp); + server.once('started', function() { + var baseUrl = server.get('url').replace(/\/$/, ''); + // express 4.x (loopback 2.x) uses `mountpath` + // express 3.x (loopback 1.x) uses `route` + var explorerPath = explorerApp.mountpath || explorerApp.route; + console.log('Browse your REST API at %s%s', baseUrl, explorerPath); + }); +}; diff --git a/server/boot/middlewares.js b/server/boot/middlewares.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/server/boot/restApi.js b/server/boot/restApi.js new file mode 100644 index 0000000000..256579a813 --- /dev/null +++ b/server/boot/restApi.js @@ -0,0 +1,4 @@ +module.exports = function mountRestApi(server) { + var restApiRoot = server.get('restApiRoot'); + server.use(restApiRoot, server.loopback.rest()); +}; diff --git a/server/config.json b/server/config.json new file mode 100644 index 0000000000..8404e744fb --- /dev/null +++ b/server/config.json @@ -0,0 +1,29 @@ +{ + "restApiRoot": "/api", + "host": "0.0.0.0", + "port": 3000, + "remoting": { + "context": { + "enableHttpContext": false + }, + "rest": { + "normalizeHttpPath": false, + "xml": false + }, + "json": { + "strict": false, + "limit": "100kb" + }, + "urlencoded": { + "extended": true, + "limit": "100kb" + }, + "cors": { + "origin": true, + "credentials": true + }, + "errorHandler": { + "disableStackTrace": false + } + } +} diff --git a/server/datasources.json b/server/datasources.json new file mode 100644 index 0000000000..4ce65a253f --- /dev/null +++ b/server/datasources.json @@ -0,0 +1,9 @@ +{ + "db": { + "name": "db", + "connector": "mongodb", + "host": "127.0.0.1", + "database": "foobar", + "port": 27017 + } +} diff --git a/server/middleware.json b/server/middleware.json new file mode 100644 index 0000000000..664cacda58 --- /dev/null +++ b/server/middleware.json @@ -0,0 +1,27 @@ +{ + "initial:before": { + "loopback#favicon": {} + }, + "initial": { + "compression": {} + }, + "session": { + }, + "auth": { + }, + "parse": { + }, + "routes": { + }, + "files": { + "loopback#static": { + "params": "$!../public" + } + }, + "final": { + "loopback#urlNotFound": {} + }, + "final:after": { + "errorhandler": {} + } +} diff --git a/server/model-config.json b/server/model-config.json new file mode 100644 index 0000000000..7c86c514a9 --- /dev/null +++ b/server/model-config.json @@ -0,0 +1,33 @@ +{ + "_meta": { + "sources": [ + "loopback/common/models", + "loopback/server/models", + "../common/models", + "./models" + ] + }, + "User": { + "dataSource": "db" + }, + "AccessToken": { + "dataSource": "db", + "public": false + }, + "ACL": { + "dataSource": "db", + "public": false + }, + "RoleMapping": { + "dataSource": "db", + "public": false + }, + "Role": { + "dataSource": "db", + "public": false + }, + "bonfire": { + "dataSource": "db", + "public": true + } +} diff --git a/server/server.js b/server/server.js index f5ae3b0a41..f9f07a7a22 100755 --- a/server/server.js +++ b/server/server.js @@ -9,7 +9,8 @@ process.on('uncaughtException', function (err) { process.exit(1); // eslint-disable-line }); -var express = require('express'), +var loopback = require('loopback'), + boot = require('loopback-boot'), accepts = require('accepts'), cookieParser = require('cookie-parser'), compress = require('compression'), @@ -51,22 +52,7 @@ var express = require('express'), /** * Create Express server. */ -var app = express(); - -/** - * Connect to MongoDB. - */ -mongoose.connect(secrets.db); -mongoose.connection.on('error', function () { - console.error( - 'MongoDB Connection Error. Please make sure that MongoDB is running.' - ); -}); - -/** - * Express configuration. - */ - +var app = loopback(); app.set('port', process.env.PORT || 3000); app.set('views', path.join(__dirname, 'views')); @@ -191,6 +177,7 @@ app.use(helmet.csp({ safari5: false })); + app.use(function (req, res, next) { // Make user object available in templates. res.locals.user = req.user; @@ -198,9 +185,10 @@ app.use(function (req, res, next) { }); app.use( - express.static(path.join(__dirname, '../public'), { maxAge: 86400000 }) + loopback.static(path.join(__dirname, '../public'), { maxAge: 86400000 }) ); +boot(app, __dirname); app.use(function (req, res, next) { // Remember original destination before login. var path = req.path.split('/')[1]; @@ -273,12 +261,19 @@ if (process.env.NODE_ENV === 'development') { * Start Express server. */ -app.listen(app.get('port'), function () { - console.log( - 'FreeCodeCamp server listening on port %d in %s mode', - app.get('port'), - app.get('env') - ); -}); +app.start = function() { + app.listen(app.get('port'), function () { + console.log( + 'FreeCodeCamp server listening on port %d in %s mode', + app.get('port'), + app.get('env') + ); + }); +}; + +// start the server if `$ node server.js` +if (require.main === module) { + app.start(); +} module.exports = app;