summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.js33
-rw-r--r--src/hooks/index.js19
-rw-r--r--src/index.js9
-rw-r--r--src/middleware/index.js16
-rw-r--r--src/middleware/logger.js24
-rw-r--r--src/middleware/not-found-handler.js9
-rw-r--r--src/services/authentication/index.js14
-rw-r--r--src/services/index.js18
-rw-r--r--src/services/meal/hooks/index.js31
-rw-r--r--src/services/meal/index.js29
-rw-r--r--src/services/meal/meal-model.js38
-rw-r--r--src/services/user/hooks/index.js51
-rw-r--r--src/services/user/index.js29
-rw-r--r--src/services/user/user-model.js36
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;
+};