From 136a6748a0308e18b296fbb8aca7abe44669f207 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 17 Oct 2019 16:43:48 -0400 Subject: [PATCH] feature(first-register): add first-register routes and pull out auth.routes.js --- demo/collections/User.js | 7 +++ demo/payload.config.js | 7 --- src/index.js | 34 ++---------- src/routes/auth.routes.js | 54 +++++++++++++++++++ src/routes/init.routes.js | 20 +++++++ .../passwordReset.routes.js | 2 +- 6 files changed, 86 insertions(+), 38 deletions(-) create mode 100644 src/routes/auth.routes.js create mode 100644 src/routes/init.routes.js rename src/{auth/passwordResets => routes}/passwordReset.routes.js (99%) diff --git a/demo/collections/User.js b/demo/collections/User.js index 9e2b485c1e..bbafbe41e6 100644 --- a/demo/collections/User.js +++ b/demo/collections/User.js @@ -23,6 +23,13 @@ module.exports = { return next(); }, }, + roles: [ + 'admin', + 'editor', + 'moderator', + 'user', + 'viewer' + ], auth: { strategy: 'jwt', passwordResets: true, diff --git a/demo/payload.config.js b/demo/payload.config.js index a4d301fce6..921323b578 100644 --- a/demo/payload.config.js +++ b/demo/payload.config.js @@ -13,13 +13,6 @@ module.exports = { mongoURL: 'mongodb://localhost/payload', collections: collections, globals: globals, - roles: [ - 'admin', - 'editor', - 'moderator', - 'user', - 'viewer' - ], localization: { locales: [ 'en', diff --git a/src/index.js b/src/index.js index f62f206e9a..725258be6a 100644 --- a/src/index.js +++ b/src/index.js @@ -7,24 +7,22 @@ import jwtStrategy from './auth/jwt'; import fileUpload from 'express-fileupload'; import {upload as uploadMedia, update as updateMedia} from './media/requestHandlers'; import mediaConfig from './media/media.config'; -import passwordResetRoutes from './auth/passwordResets/passwordReset.routes'; +import initRoutes from './routes/init.routes'; import autopopulate from './mongoose/autopopulate.plugin'; import paginate from './mongoose/paginate.plugin'; import buildQueryPlugin from './mongoose/buildQuery.plugin'; import localizationPlugin from './localization/localization.plugin'; import bindModelMiddleware from './mongoose/bindModel.middleware'; import localizationMiddleware from './localization/localization.middleware'; -import checkRoleMiddleware from './auth/checkRole.middleware'; import { query, create, findOne, destroy, update } from './mongoose/requestHandlers'; import { upsert, fetch } from './mongoose/requestHandlers/globals'; import { schemaBaseFields } from './mongoose/schemaBaseFields'; import fieldToSchemaMap from './mongoose/fieldToSchemaMap'; -import authValidate from './auth/validate'; -import authRequestHandlers from './auth/requestHandlers'; import passwordResetConfig from './auth/passwordResets/passwordReset.config'; import validateCollection from './utilities/validateCollection'; import validateGlobal from './utilities/validateGlobal'; import setModelLocaleMiddleware from './mongoose/setModelLocale.middleware'; +import authRoutes from './routes/auth.routes'; class Payload { @@ -118,32 +116,8 @@ class Payload { passport.deserializeUser(model.deserializeUser()); } - let auth = authRequestHandlers(model); - - options.router - .route('/login') - .post(authValidate.login, auth.login); - - options.router - .route('/me') - .post(passport.authenticate(config.auth.strategy, { session: false }), auth.me); - - options.config.roles.forEach((role) => { - options.router - .route(`/role/${role}`) - .get(passport.authenticate(config.auth.strategy, { session: false }), checkRoleMiddleware(role), auth.me); - }); - - // password resets - if (config.auth.passwordResets) { - options.router.use('', passwordResetRoutes(options.config.email, model)); - } - - if (config.auth.registration) { - options.router - .route(`${config.slug}/register`) // TODO: not sure how to incorporate url params like `:pageId` - .post(config.auth.registrationValidation, auth.register); - } + options.router.use('', initRoutes(model)); + options.router.use('', authRoutes(config, model)); } options.router.all(`/${config.slug}*`, diff --git a/src/routes/auth.routes.js b/src/routes/auth.routes.js new file mode 100644 index 0000000000..df75bf3fbb --- /dev/null +++ b/src/routes/auth.routes.js @@ -0,0 +1,54 @@ +import express from 'express'; +import authRequestHandlers from '../auth/requestHandlers'; +import authValidate from '../auth/validate'; +import passport from 'passport'; +import checkRoleMiddleware from '../auth/checkRole.middleware'; +import passwordResetRoutes from './passwordReset.routes'; + +const router = express.Router(); +const authRoutes = (userConfig, User) => { + + let auth = authRequestHandlers(User); + + router + .route('/login') + .post(authValidate.login, auth.login); + + router + .route('/me') + .post(passport.authenticate(userConfig.auth.strategy, { session: false }), auth.me); + + userConfig.roles.forEach((role) => { + router + .route(`/role/${role}`) + .get(passport.authenticate(userConfig.auth.strategy, { session: false }), checkRoleMiddleware(role), auth.me); + }); + + if (userConfig.auth.passwordResets) { + router.use('', passwordResetRoutes(userConfig.email, User)); + } + + if (userConfig.auth.registration) { + router + .route(`${userConfig.slug}/register`) // TODO: not sure how to incorporate url params like `:pageId` + .post(userConfig.auth.registrationValidation, auth.register); + + router + .route('/first-register') + .post(userConfig.auth.registrationValidation, + (req, res, next) => { + User.countDocuments({}, (err, count) => { + if (err) res.status(500).json({ error: err }); + if (count >= 1) + return res.status(403).json({ initialized: true }); + next(); + }) + }, + auth.register + ); + } + + return router; +}; + +export default authRoutes; diff --git a/src/routes/init.routes.js b/src/routes/init.routes.js new file mode 100644 index 0000000000..c7760232ce --- /dev/null +++ b/src/routes/init.routes.js @@ -0,0 +1,20 @@ +import express from 'express'; + +const router = express.Router(); +const initRoutes = User => { + + router + .route('/init') + .get((req, res) => { + User.countDocuments({}, (err, count) => { + if (err) res.status(200).json({ error: err }); + return count >= 1 + ? res.status(200).json({ initialized: true }) + : res.status(200).json({ initialized: false }) + }) + }); + + return router; +}; + +export default initRoutes; diff --git a/src/auth/passwordResets/passwordReset.routes.js b/src/routes/passwordReset.routes.js similarity index 99% rename from src/auth/passwordResets/passwordReset.routes.js rename to src/routes/passwordReset.routes.js index c93aed9f71..b1534bc390 100644 --- a/src/auth/passwordResets/passwordReset.routes.js +++ b/src/routes/passwordReset.routes.js @@ -1,5 +1,5 @@ import express from 'express'; -import passport from 'passport'; +import passport from 'passport/lib'; import * as nodemailer from 'nodemailer'; import * as crypto from 'crypto';