@@ -82,61 +82,97 @@ function updateNetlifyUser (key, usersUrl, adminAuthHeader){
82
82
}
83
83
}
84
84
85
- function handler ( event , context , callback ) {
85
+ function checkNetlifyUserHasDbToken ( usersUrl , adminAuthHeader ) {
86
+ console . log ( "Checking Netlify user account...." )
87
+ return new Promise ( ( resolve , reject ) => {
88
+ fetch ( usersUrl , {
89
+ method : "GET" ,
90
+ headers : { Authorization : adminAuthHeader } ,
91
+ } )
92
+ . then ( response => response . json ( ) )
93
+ . then ( data => {
94
+ let dbToken = data . app_metadata . faunadb_token
95
+ console . log ( "Does user have DB token?" , dbToken ) ;
96
+ if ( ! ! dbToken === true ) {
97
+ resolve ( data )
98
+ }
99
+ else if ( ! ! dbToken === false ) {
100
+ resolve ( false )
101
+ }
102
+ } )
103
+ . catch ( e => {
104
+ console . error ( "error authorising user" , e )
105
+ reject ( e )
106
+ } ) ;
86
107
87
- // the context of the netlify function needs to be set to idenity
88
- // is set when calling this function with
108
+ } )
109
+ }
110
+
111
+ function handler ( event , context , callback ) {
89
112
90
113
const { identity, user } = context . clientContext ;
91
114
92
- //block if user hits endpoint direclty
115
+ //Guard if user hits this function URL direclty
93
116
if ( ! user ) {
94
117
return callback ( null , {
95
118
statusCode : 401 ,
96
119
body : "<img src='https://media.tenor.co/images/fb288a6182d05e93d8e731cec487a0ad/tenor.gif' alt='You should'nt be here...'>"
97
120
} ) ;
98
121
}
99
122
123
+ // Try-block required as we cant guarantee the event.body can parse correctly
124
+ // if it fails it results in a runtime error.
100
125
try {
101
126
let payload = JSON . parse ( event . body ) ;
102
127
let userData = payload . user ;
103
128
const usersUrl = `${ identity . url } /admin/users/${ userData . id } ` ;
104
129
const adminAuthHeader = `Bearer ${ identity . token } ` ;
105
130
106
131
console . log ( "admin url check" , usersUrl )
132
+ console . log ( "bearer token check" , adminAuthHeader )
107
133
108
-
109
- //TODO - check if user already exists in db
110
- // if so send the current netlify user object
111
-
112
- const password = generator . generate ( {
113
- length : 10 ,
114
- numbers : true
115
- } ) ;
116
-
117
- console . log ( "Creating user in DB via external signup" )
118
-
119
- createUser ( userData , password )
120
- . then ( ( user ) => obtainToken ( user , password ) )
121
- . then ( ( key ) => updateNetlifyUser ( key , usersUrl , adminAuthHeader ) )
122
- . then ( ( resp ) => {
123
- console . log ( "Received response: " , resp )
134
+ checkNetlifyUserHasDbToken ( usersUrl , adminAuthHeader )
135
+ . then ( ( resp ) => {
136
+ if ( ! ! resp === true ) {
137
+ //send the callback and end the process
138
+ console . log ( "User has DB token present, ending process" )
124
139
callback ( null , {
125
140
statusCode : 200 ,
126
141
body : JSON . stringify ( resp )
127
142
} )
128
- } )
129
- . catch ( ( error ) => {
130
- console . error ( "Unable to create a user account" , error )
131
- callback ( null , {
132
- statusCode : 500 ,
133
- body : JSON . stringify ( {
134
- error : error
143
+ return
144
+ } else {
145
+ // As no DB token is present, we can gurantee this is brand new signup
146
+ // therefor go ahead and create the new user in the DB
147
+ console . log ( "New user, creating user in DB via external signup" )
148
+
149
+ const password = generator . generate ( {
150
+ length : 10 ,
151
+ numbers : true
152
+ } ) ;
153
+
154
+ createUser ( userData , password )
155
+ . then ( ( user ) => obtainToken ( user , password ) )
156
+ . then ( ( key ) => updateNetlifyUser ( key , usersUrl , adminAuthHeader ) )
157
+ . then ( ( resp ) => {
158
+ console . log ( "Received response: " , ! ! resp )
159
+ callback ( null , {
160
+ statusCode : 200 ,
161
+ body : JSON . stringify ( resp . data )
162
+ } )
135
163
} )
136
- } )
137
- } )
138
- }
139
- catch ( error ) {
164
+ . catch ( ( error ) => {
165
+ console . error ( "Unable to create a user account" , error )
166
+ callback ( null , {
167
+ statusCode : 500 ,
168
+ body : JSON . stringify ( {
169
+ error : error
170
+ } )
171
+ } )
172
+ } )
173
+ }
174
+ } )
175
+ } catch ( error ) {
140
176
let errorMessage = "Cant process the given payload"
141
177
callback ( null , {
142
178
statusCode : 418 ,
0 commit comments