@@ -30,71 +30,63 @@ const random = (done) => {
3030} ;
3131
3232export function findUserByUsername ( username , cb ) {
33- User . findOne (
34- { username } ,
35- ( err , user ) => {
36- cb ( user ) ;
37- }
38- ) ;
33+ User . findByUsername ( username , ( err , user ) => {
34+ cb ( user ) ;
35+ } ) ;
3936}
4037
4138export function createUser ( req , res , next ) {
39+ const { username, email } = req . body ;
40+ const { password } = req . body ;
41+ const emailLowerCase = email . toLowerCase ( ) ;
4242 const EMAIL_VERIFY_TOKEN_EXPIRY_TIME = Date . now ( ) + ( 3600000 * 24 ) ; // 24 hours
4343 random ( ( tokenError , token ) => {
4444 const user = new User ( {
45- username : req . body . username ,
46- email : req . body . email ,
47- password : req . body . password ,
45+ username,
46+ email : emailLowerCase ,
47+ password,
4848 verified : User . EmailConfirmation . Sent ,
4949 verifiedToken : token ,
5050 verifiedTokenExpires : EMAIL_VERIFY_TOKEN_EXPIRY_TIME ,
5151 } ) ;
5252
53- User . findOne (
54- {
55- $or : [
56- { email : req . body . email } ,
57- { username : req . body . username }
58- ]
59- } ,
60- ( err , existingUser ) => {
61- if ( err ) {
62- res . status ( 404 ) . send ( { error : err } ) ;
63- return ;
64- }
53+ User . findByEmailAndUsername ( email , username , ( err , existingUser ) => {
54+ if ( err ) {
55+ res . status ( 404 ) . send ( { error : err } ) ;
56+ return ;
57+ }
6558
66- if ( existingUser ) {
67- const fieldInUse = existingUser . email === req . body . email ? 'Email' : 'Username' ;
68- res . status ( 422 ) . send ( { error : `${ fieldInUse } is in use` } ) ;
59+ if ( existingUser ) {
60+ const fieldInUse = existingUser . email . toLowerCase ( ) === emailLowerCase ? 'Email' : 'Username' ;
61+ res . status ( 422 ) . send ( { error : `${ fieldInUse } is in use` } ) ;
62+ return ;
63+ }
64+ user . save ( ( saveErr ) => {
65+ if ( saveErr ) {
66+ next ( saveErr ) ;
6967 return ;
7068 }
71- user . save ( ( saveErr ) => {
72- if ( saveErr ) {
73- next ( saveErr ) ;
69+ req . logIn ( user , ( loginErr ) => {
70+ if ( loginErr ) {
71+ next ( loginErr ) ;
7472 return ;
7573 }
76- req . logIn ( user , ( loginErr ) => {
77- if ( loginErr ) {
78- next ( loginErr ) ;
79- return ;
80- }
81-
82- const protocol = process . env . NODE_ENV === 'production' ? 'https' : 'http' ;
83- const mailOptions = renderEmailConfirmation ( {
84- body : {
85- domain : `${ protocol } ://${ req . headers . host } ` ,
86- link : `${ protocol } ://${ req . headers . host } /verify?t=${ token } `
87- } ,
88- to : req . user . email ,
89- } ) ;
90-
91- mail . send ( mailOptions , ( mailErr , result ) => { // eslint-disable-line no-unused-vars
92- res . json ( userResponse ( req . user ) ) ;
93- } ) ;
74+
75+ const protocol = process . env . NODE_ENV === 'production' ? 'https' : 'http' ;
76+ const mailOptions = renderEmailConfirmation ( {
77+ body : {
78+ domain : `${ protocol } ://${ req . headers . host } ` ,
79+ link : `${ protocol } ://${ req . headers . host } /verify?t=${ token } `
80+ } ,
81+ to : req . user . email ,
82+ } ) ;
83+
84+ mail . send ( mailOptions , ( mailErr , result ) => { // eslint-disable-line no-unused-vars
85+ res . json ( userResponse ( req . user ) ) ;
9486 } ) ;
9587 } ) ;
96- }
97- ) ;
88+ } ) ;
89+ } ) ;
9890 } ) ;
9991}
10092
@@ -103,7 +95,10 @@ export function duplicateUserCheck(req, res) {
10395 const value = req . query [ checkType ] ;
10496 const query = { } ;
10597 query [ checkType ] = value ;
106- User . findOne ( query , ( err , user ) => {
98+ // Don't want to use findByEmailOrUsername here, because in this case we do
99+ // want to use case-insensitive search for usernames to prevent username
100+ // duplicates, which overrides the default behavior.
101+ User . findOne ( query ) . collation ( { locale : 'en' , strength : 2 } ) . exec ( ( err , user ) => {
107102 if ( user ) {
108103 return res . json ( {
109104 exists : true ,
@@ -147,7 +142,7 @@ export function resetPasswordInitiate(req, res) {
147142 async . waterfall ( [
148143 random ,
149144 ( token , done ) => {
150- User . findOne ( { email : req . body . email } , ( err , user ) => {
145+ User . findByEmail ( req . body . email , ( err , user ) => {
151146 if ( ! user ) {
152147 res . json ( { success : true , message : 'If the email is registered with the editor, an email has been sent.' } ) ;
153148 return ;
@@ -277,7 +272,7 @@ export function updatePassword(req, res) {
277272}
278273
279274export function userExists ( username , callback ) {
280- User . findOne ( { username } , ( err , user ) => (
275+ User . findByUsername ( username , ( err , user ) => (
281276 user ? callback ( true ) : callback ( false )
282277 ) ) ;
283278}
0 commit comments