@@ -11,31 +11,31 @@ var batch = require('./batch'),
11
11
multer = require ( 'multer' ) ,
12
12
Parse = require ( 'parse/node' ) . Parse ,
13
13
httpRequest = require ( './httpRequest' ) ;
14
-
15
- import PromiseRouter from './PromiseRouter' ;
16
- import { GridStoreAdapter } from './Adapters/Files/GridStoreAdapter' ;
17
- import { S3Adapter } from './Adapters/Files/S3Adapter' ;
18
- import { FilesController } from './Controllers/FilesController' ;
19
14
20
15
import ParsePushAdapter from './Adapters/Push/ParsePushAdapter' ;
21
- import { PushController } from './Controllers/PushController' ;
22
-
23
- import { ClassesRouter } from './Routers/ClassesRouter' ;
24
- import { InstallationsRouter } from './Routers/InstallationsRouter' ;
25
- import { UsersRouter } from './Routers/UsersRouter' ;
26
- import { SessionsRouter } from './Routers/SessionsRouter' ;
27
- import { RolesRouter } from './Routers/RolesRouter' ;
16
+ import passwordReset from './passwordReset' ;
17
+ import PromiseRouter from './PromiseRouter' ;
18
+ import SimpleMailgunAdapter from './Adapters/Email/SimpleMailgunAdapter' ;
19
+ import verifyEmail from './verifyEmail' ;
20
+ import { AdapterLoader } from './Adapters/AdapterLoader' ;
28
21
import { AnalyticsRouter } from './Routers/AnalyticsRouter' ;
22
+ import { ClassesRouter } from './Routers/ClassesRouter' ;
23
+ import { FileLoggerAdapter } from './Adapters/Logger/FileLoggerAdapter' ;
24
+ import { FilesController } from './Controllers/FilesController' ;
25
+ import { FilesRouter } from './Routers/FilesRouter' ;
29
26
import { FunctionsRouter } from './Routers/FunctionsRouter' ;
30
- import { SchemasRouter } from './Routers/SchemasRouter ' ;
27
+ import { GridStoreAdapter } from './Adapters/Files/GridStoreAdapter ' ;
31
28
import { IAPValidationRouter } from './Routers/IAPValidationRouter' ;
32
- import { PushRouter } from './Routers/PushRouter' ;
33
- import { FilesRouter } from './Routers/FilesRouter' ;
34
- import { LogsRouter } from './Routers/LogsRouter' ;
35
-
36
- import { AdapterLoader } from './Adapters/AdapterLoader' ;
37
- import { FileLoggerAdapter } from './Adapters/Logger/FileLoggerAdapter' ;
29
+ import { InstallationsRouter } from './Routers/InstallationsRouter' ;
38
30
import { LoggerController } from './Controllers/LoggerController' ;
31
+ import { LogsRouter } from './Routers/LogsRouter' ;
32
+ import { PushController } from './Controllers/PushController' ;
33
+ import { PushRouter } from './Routers/PushRouter' ;
34
+ import { RolesRouter } from './Routers/RolesRouter' ;
35
+ import { S3Adapter } from './Adapters/Files/S3Adapter' ;
36
+ import { SchemasRouter } from './Routers/SchemasRouter' ;
37
+ import { SessionsRouter } from './Routers/SessionsRouter' ;
38
+ import { UsersRouter } from './Routers/UsersRouter' ;
39
39
40
40
// Mutate the Parse object to add the Cloud Code handlers
41
41
addParseCloud ( ) ;
@@ -66,6 +66,7 @@ addParseCloud();
66
66
67
67
function ParseServer ( {
68
68
appId,
69
+ appName,
69
70
masterKey,
70
71
databaseAdapter,
71
72
filesAdapter,
@@ -83,6 +84,8 @@ function ParseServer({
83
84
enableAnonymousUsers = true ,
84
85
oauth = { } ,
85
86
serverURL = '' ,
87
+ verifyUserEmails = false ,
88
+ emailAdapter,
86
89
} ) {
87
90
if ( ! appId || ! masterKey ) {
88
91
throw 'You must provide an appId and masterKey!' ;
@@ -105,8 +108,7 @@ function ParseServer({
105
108
throw "argument 'cloud' must either be a string or a function" ;
106
109
}
107
110
}
108
-
109
-
111
+
110
112
const filesControllerAdapter = AdapterLoader . load ( filesAdapter , GridStoreAdapter ) ;
111
113
const pushControllerAdapter = AdapterLoader . load ( push , ParsePushAdapter ) ;
112
114
const loggerControllerAdapter = AdapterLoader . load ( loggerAdapter , FileLoggerAdapter ) ;
@@ -116,7 +118,19 @@ function ParseServer({
116
118
const filesController = new FilesController ( filesControllerAdapter ) ;
117
119
const pushController = new PushController ( pushControllerAdapter ) ;
118
120
const loggerController = new LoggerController ( loggerControllerAdapter ) ;
119
-
121
+
122
+ if ( verifyUserEmails ) {
123
+ if ( typeof appName !== 'string' ) {
124
+ throw 'An app name is required when using email verification.' ;
125
+ }
126
+ if ( ! emailAdapter ) {
127
+ throw 'User email verification was enabled, but no email adapter was provided' ;
128
+ }
129
+ if ( typeof emailAdapter . sendVerificationEmail !== 'function' ) {
130
+ throw 'Invalid email adapter: no sendVerificationEmail() function was provided' ;
131
+ }
132
+ }
133
+
120
134
cache . apps [ appId ] = {
121
135
masterKey : masterKey ,
122
136
collectionPrefix : collectionPrefix ,
@@ -131,7 +145,8 @@ function ParseServer({
131
145
loggerController : loggerController ,
132
146
enableAnonymousUsers : enableAnonymousUsers ,
133
147
oauth : oauth ,
134
- } ;
148
+ verifyUserEmails : verifyUserEmails ,
149
+ } ;
135
150
136
151
// To maintain compatibility. TODO: Remove in v2.1
137
152
if ( process . env . FACEBOOK_APP_ID ) {
@@ -148,6 +163,9 @@ function ParseServer({
148
163
149
164
// File handling needs to be before default middlewares are applied
150
165
api . use ( '/' , new FilesRouter ( ) . getExpressRouter ( ) ) ;
166
+ api . use ( '/request_password_reset' , passwordReset . reset ( appName , appId ) ) ;
167
+ api . get ( '/password_reset_success' , passwordReset . success ) ;
168
+ api . get ( '/verify_email' , verifyEmail ) ;
151
169
152
170
// TODO: separate this from the regular ParseServer object
153
171
if ( process . env . TESTING == 1 ) {
@@ -172,7 +190,7 @@ function ParseServer({
172
190
new LogsRouter ( ) ,
173
191
new IAPValidationRouter ( )
174
192
] ;
175
-
193
+
176
194
if ( process . env . PARSE_EXPERIMENTAL_CONFIG_ENABLED || process . env . TESTING ) {
177
195
routers . push ( require ( './global_config' ) ) ;
178
196
}
@@ -233,5 +251,6 @@ function getClassName(parseClass) {
233
251
234
252
module . exports = {
235
253
ParseServer : ParseServer ,
236
- S3Adapter : S3Adapter
254
+ S3Adapter : S3Adapter ,
255
+ SimpleMailgunAdapter : SimpleMailgunAdapter ,
237
256
} ;
0 commit comments