From 3b6bfbc5521b28a87ba5af6070b8450fad54ca1f Mon Sep 17 00:00:00 2001 From: catarak Date: Fri, 2 Sep 2016 14:51:30 -0400 Subject: [PATCH] check for duplicate email and username --- client/modules/User/components/SignupForm.js | 10 ++++--- client/modules/User/pages/SignupView.js | 28 +++++++++++++++++++- server/controllers/user.controller.js | 20 ++++++++++++++ server/routes/user.routes.js | 2 ++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/client/modules/User/components/SignupForm.js b/client/modules/User/components/SignupForm.js index d107dd2e..8fef09f9 100644 --- a/client/modules/User/components/SignupForm.js +++ b/client/modules/User/components/SignupForm.js @@ -1,8 +1,7 @@ import React, { PropTypes } from 'react'; function SignupForm(props) { - const { fields: { username, email, password, confirmPassword }, handleSubmit } = props; - console.log(props.fields); + const { fields: { username, email, password, confirmPassword }, handleSubmit, submitting, invalid, pristine } = props; return (

@@ -45,7 +44,7 @@ function SignupForm(props) { /> {confirmPassword.touched && confirmPassword.error && {confirmPassword.error}}

- +
); } @@ -58,7 +57,10 @@ SignupForm.propTypes = { confirmPassword: PropTypes.string.isRequired }).isRequired, handleSubmit: PropTypes.func.isRequired, - signUpUser: PropTypes.func.isRequired + signUpUser: PropTypes.func.isRequired, + submitting: PropTypes.bool, + invalid: PropTypes.bool, + pristine: PropTypes.bool }; export default SignupForm; diff --git a/client/modules/User/pages/SignupView.js b/client/modules/User/pages/SignupView.js index 3a39a1ae..fca4d8d3 100644 --- a/client/modules/User/pages/SignupView.js +++ b/client/modules/User/pages/SignupView.js @@ -3,6 +3,7 @@ import { bindActionCreators } from 'redux'; import * as UserActions from '../actions'; import { reduxForm } from 'redux-form'; import SignupForm from '../components/SignupForm'; +import axios from 'axios'; function SignupView(props) { return ( @@ -23,6 +24,24 @@ function mapDispatchToProps(dispatch) { return bindActionCreators(UserActions, dispatch); } +function asyncValidate(formProps, dispatch, props) { + const fieldToValidate = props.form._active; + if (fieldToValidate) { + const queryParams = {}; + queryParams[fieldToValidate] = formProps[fieldToValidate]; + queryParams.check_type = fieldToValidate; + return axios.get('/api/signup/duplicate_check', { params: queryParams }) + .then(response => { + if (response.data.exists) { + const error = {}; + error[fieldToValidate] = response.data.message; + throw error; + } + }); + } + return Promise.resolve(true).then(() => {}); +} + function validate(formProps) { const errors = {}; @@ -54,8 +73,15 @@ function validate(formProps) { return errors; } +function onSubmitFail(errors) { + console.log(errors); +} + export default reduxForm({ form: 'signup', fields: ['username', 'email', 'password', 'confirmPassword'], - validate + onSubmitFail, + validate, + asyncValidate, + asyncBlurFields: ['username', 'email'] }, mapStateToProps, mapDispatchToProps)(SignupView); diff --git a/server/controllers/user.controller.js b/server/controllers/user.controller.js index 488aca5f..e21b9d92 100644 --- a/server/controllers/user.controller.js +++ b/server/controllers/user.controller.js @@ -31,6 +31,26 @@ export function createUser(req, res, next) { }); } +export function duplicateUserCheck(req, res) { + const checkType = req.query.check_type; + const value = req.query[checkType]; + const query = {}; + query[checkType] = value; + User.findOne(query, (err, user) => { + if (user) { + return res.json({ + exists: true, + message: `This ${checkType} is already taken.`, + type: checkType + }); + } + return res.json({ + exists: false, + type: checkType + }); + }); +} + export function updatePreferences(req, res) { User.findById(req.user.id, (err, user) => { if (err) { diff --git a/server/routes/user.routes.js b/server/routes/user.routes.js index 5dde252a..c40f4924 100644 --- a/server/routes/user.routes.js +++ b/server/routes/user.routes.js @@ -4,6 +4,8 @@ const router = new Router(); router.route('/signup').post(UserController.createUser); +router.route('/signup/duplicate_check').get(UserController.duplicateUserCheck); + router.route('/preferences').put(UserController.updatePreferences); export default router;