diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.js | 33 | ||||
| -rw-r--r-- | src/hooks/index.js | 19 | ||||
| -rw-r--r-- | src/index.js | 9 | ||||
| -rw-r--r-- | src/middleware/index.js | 16 | ||||
| -rw-r--r-- | src/middleware/logger.js | 24 | ||||
| -rw-r--r-- | src/middleware/not-found-handler.js | 9 | ||||
| -rw-r--r-- | src/services/authentication/index.js | 14 | ||||
| -rw-r--r-- | src/services/index.js | 18 | ||||
| -rw-r--r-- | src/services/meal/hooks/index.js | 31 | ||||
| -rw-r--r-- | src/services/meal/index.js | 29 | ||||
| -rw-r--r-- | src/services/meal/meal-model.js | 38 | ||||
| -rw-r--r-- | src/services/user/hooks/index.js | 51 | ||||
| -rw-r--r-- | src/services/user/index.js | 29 | ||||
| -rw-r--r-- | src/services/user/user-model.js | 36 |
14 files changed, 356 insertions, 0 deletions
diff --git a/src/app.js b/src/app.js new file mode 100644 index 0000000..9830783 --- /dev/null +++ b/src/app.js @@ -0,0 +1,33 @@ +'use strict'; + +const path = require('path'); +const serveStatic = require('feathers').static; +const favicon = require('serve-favicon'); +const compress = require('compression'); +const cors = require('cors'); +const feathers = require('feathers'); +const configuration = require('feathers-configuration'); +const hooks = require('feathers-hooks'); +const rest = require('feathers-rest'); +const bodyParser = require('body-parser'); + +const middleware = require('./middleware'); +const services = require('./services'); + +const app = feathers(); + +app.configure(configuration(path.join(__dirname, '..'))); + +app.use(compress()) + .options('*', cors()) + .use(cors()) + .use(favicon( path.join(app.get('public'), 'favicon.ico') )) + .use('/', serveStatic( app.get('public') )) + .use(bodyParser.json()) + .use(bodyParser.urlencoded({ extended: true })) + .configure(hooks()) + .configure(rest()) + .configure(services) + .configure(middleware); + +module.exports = app; diff --git a/src/hooks/index.js b/src/hooks/index.js new file mode 100644 index 0000000..2b122bb --- /dev/null +++ b/src/hooks/index.js @@ -0,0 +1,19 @@ +'use strict'; + +// Add any common hooks you want to share across services in here. +// +// Below is an example of how a hook is written and exported. Please +// see http://docs.feathersjs.com/hooks/readme.html for more details +// on hooks. + +const hooks = require('feathers-hooks'); +const auth = require('feathers-authentication').hooks; +const or = require('promise-or'); + +exports.restrictToOwnersOrAdmins = function() { + var ownerHook = auth.restrictToOwner() + var adminHook = auth.restrictToRoles({ roles: ["admin"] }) + return function(hook) { + return or(ownerHook(hook), adminHook(hook)) + }; +}; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..30e2908 --- /dev/null +++ b/src/index.js @@ -0,0 +1,9 @@ +'use strict'; + +const app = require('./app'); +const port = app.get('port'); +const server = app.listen(port); + +server.on('listening', () => + console.log(`Feathers application started on ${app.get('host')}:${port}`) +);
\ No newline at end of file diff --git a/src/middleware/index.js b/src/middleware/index.js new file mode 100644 index 0000000..6d655fa --- /dev/null +++ b/src/middleware/index.js @@ -0,0 +1,16 @@ +'use strict'; + +const handler = require('feathers-errors/handler'); +const notFound = require('./not-found-handler'); +const logger = require('./logger'); + +module.exports = function() { + // Add your custom middleware here. Remember, that + // just like Express the order matters, so error + // handling middleware should go last. + const app = this; + + app.use(notFound()); + app.use(logger(app)); + app.use(handler()); +}; diff --git a/src/middleware/logger.js b/src/middleware/logger.js new file mode 100644 index 0000000..22ea137 --- /dev/null +++ b/src/middleware/logger.js @@ -0,0 +1,24 @@ +'use strict'; + +const winston = require('winston'); + +module.exports = function(app) { + // Add a logger to our app object for convenience + app.logger = winston; + + return function(error, req, res, next) { + if (error) { + const message = `${error.code ? `(${error.code}) ` : '' }Route: ${req.url} - ${error.message}`; + + if (error.code === 404) { + winston.info(message); + } + else { + winston.error(message); + winston.info(error.stack); + } + } + + next(error); + }; +}; diff --git a/src/middleware/not-found-handler.js b/src/middleware/not-found-handler.js new file mode 100644 index 0000000..cb0ee51 --- /dev/null +++ b/src/middleware/not-found-handler.js @@ -0,0 +1,9 @@ +'use strict'; + +const errors = require('feathers-errors'); + +module.exports = function() { + return function(req, res, next) { + next(new errors.NotFound('Page not found')); + }; +}; diff --git a/src/services/authentication/index.js b/src/services/authentication/index.js new file mode 100644 index 0000000..d5a66b5 --- /dev/null +++ b/src/services/authentication/index.js @@ -0,0 +1,14 @@ +'use strict'; + +const authentication = require('feathers-authentication'); + + +module.exports = function() { + const app = this; + + let config = app.get('auth'); + + + + app.configure(authentication(config)); +}; diff --git a/src/services/index.js b/src/services/index.js new file mode 100644 index 0000000..a05c097 --- /dev/null +++ b/src/services/index.js @@ -0,0 +1,18 @@ +'use strict'; +const authentication = require('./authentication'); +const user = require('./user'); +const meal = require('./meal'); +const Sequelize = require('sequelize'); +module.exports = function() { + const app = this; + + const sequelize = new Sequelize(app.get('mysql'), { + dialect: 'mysql', + logging: false + }); + app.set('sequelize', sequelize); + + app.configure(authentication); + app.configure(user); + app.configure(meal); +}; diff --git a/src/services/meal/hooks/index.js b/src/services/meal/hooks/index.js new file mode 100644 index 0000000..2e2795a --- /dev/null +++ b/src/services/meal/hooks/index.js @@ -0,0 +1,31 @@ +'use strict'; + +const globalHooks = require('../../../hooks'); +const hooks = require('feathers-hooks'); +const auth = require('feathers-authentication').hooks; + +exports.before = { + all: [ + auth.verifyToken(), + auth.populateUser(), + auth.restrictToAuthenticated(), + globalHooks.restrictToOwnersOrAdmins(), + ], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] +}; + +exports.after = { + all: [], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] +}; + diff --git a/src/services/meal/index.js b/src/services/meal/index.js new file mode 100644 index 0000000..88ca1bd --- /dev/null +++ b/src/services/meal/index.js @@ -0,0 +1,29 @@ +'use strict'; + +const service = require('feathers-sequelize'); +const meal = require('./meal-model'); +const hooks = require('./hooks'); + +module.exports = function(){ + const app = this; + + const options = { + Model: meal(app.get('sequelize')), + paginate: { + default: 5, + max: 25 + } + }; + + // Initialize our service with any options it requires + app.use('/meals', service(options)); + + // Get our initialize service to that we can bind hooks + const mealService = app.service('/meals'); + + // Set up our before hooks + mealService.before(hooks.before); + + // Set up our after hooks + mealService.after(hooks.after); +}; diff --git a/src/services/meal/meal-model.js b/src/services/meal/meal-model.js new file mode 100644 index 0000000..d15b244 --- /dev/null +++ b/src/services/meal/meal-model.js @@ -0,0 +1,38 @@ +'use strict'; + +// meal-model.js - A sequelize model +// +// See http://docs.sequelizejs.com/en/latest/docs/models-definition/ +// for more of what you can do here. + +const Sequelize = require('sequelize'); + +module.exports = function(sequelize) { + const meal = sequelize.define('meals', { + name: { + type: Sequelize.STRING, + allowNull: false + }, + date: { + type: Sequelize.DATE, + allowNull: false + }, + calories: { + type: Sequelize.INTEGER, + allowNull: false + }, + user_id: { + type: Sequelize.INTEGER, + references: { + model: sequelize.model('users'), + key: 'id', + } + }, + }, { + freezeTableName: true + }); + + meal.sync(); + + return meal; +}; diff --git a/src/services/user/hooks/index.js b/src/services/user/hooks/index.js new file mode 100644 index 0000000..9dfe425 --- /dev/null +++ b/src/services/user/hooks/index.js @@ -0,0 +1,51 @@ +'use strict'; + +const globalHooks = require('../../../hooks'); +const hooks = require('feathers-hooks'); +const auth = require('feathers-authentication').hooks; + +exports.before = { + all: [], + find: [ + auth.verifyToken(), + auth.populateUser(), + auth.restrictToAuthenticated() + ], + get: [ + auth.verifyToken(), + auth.populateUser(), + auth.restrictToAuthenticated(), + auth.restrictToOwner({ ownerField: 'id' }) + ], + create: [ + auth.hashPassword() + ], + update: [ + auth.verifyToken(), + auth.populateUser(), + auth.restrictToAuthenticated(), + auth.restrictToOwner({ ownerField: 'id' }) + ], + patch: [ + auth.verifyToken(), + auth.populateUser(), + auth.restrictToAuthenticated(), + auth.restrictToOwner({ ownerField: 'id' }) + ], + remove: [ + auth.verifyToken(), + auth.populateUser(), + auth.restrictToAuthenticated(), + auth.restrictToOwner({ ownerField: 'id' }) + ] +}; + +exports.after = { + all: [hooks.remove('password')], + find: [], + get: [], + create: [], + update: [], + patch: [], + remove: [] +}; diff --git a/src/services/user/index.js b/src/services/user/index.js new file mode 100644 index 0000000..3f3438f --- /dev/null +++ b/src/services/user/index.js @@ -0,0 +1,29 @@ +'use strict'; + +const service = require('feathers-sequelize'); +const user = require('./user-model'); +const hooks = require('./hooks'); + +module.exports = function(){ + const app = this; + + const options = { + Model: user(app.get('sequelize')), + paginate: { + default: 5, + max: 25 + } + }; + + // Initialize our service with any options it requires + app.use('/users', service(options)); + + // Get our initialize service to that we can bind hooks + const userService = app.service('/users'); + + // Set up our before hooks + userService.before(hooks.before); + + // Set up our after hooks + userService.after(hooks.after); +}; diff --git a/src/services/user/user-model.js b/src/services/user/user-model.js new file mode 100644 index 0000000..03db95b --- /dev/null +++ b/src/services/user/user-model.js @@ -0,0 +1,36 @@ +'use strict'; + +// user-model.js - A sequelize model +// +// See http://docs.sequelizejs.com/en/latest/docs/models-definition/ +// for more of what you can do here. + +const Sequelize = require('sequelize'); + +module.exports = function(sequelize) { + const user = sequelize.define('users', { + email: { + type: Sequelize.STRING, + allowNull: false, + unique: true + }, + password: { + type: Sequelize.STRING, + allowNull: false + }, + role: { + type: Sequelize.ENUM('user', 'manager', 'admin'), + allowNull: false + }, + goal: { + type: Sequelize.INTEGER, + allowNull: false + }, + }, { + freezeTableName: true + }); + + user.sync(); + + return user; +}; |
