Skip to content

Commit 9eb6d42

Browse files
authored
feat(roots-cognito): Adds ensureExternalUserExists to PreSignUp handler (#2)
1 parent ce5e072 commit 9eb6d42

File tree

3 files changed

+76
-2
lines changed

3 files changed

+76
-2
lines changed

examples/javascript/src/lib/jane-service.mjs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ const createUser = async (data, token) => {
2222
}
2323
}
2424

25+
// /** ----- ENSURE EXTERNAL USER ----- */
26+
// export interface ExternalUserData {
27+
// email: string,
28+
// external_id: string,
29+
// pool_id: string,
30+
// user_attributes?: {
31+
// [key: string]: any // eslint-disable-line @typescript-eslint/no-explicit-any
32+
// }
33+
// }
34+
35+
const ensureExternalUserExists = async (data) => {
36+
const response = await apiService.post(`${COGNITO_API}/ensure_external_user_exists`, data)
37+
38+
return {
39+
success: response.statusCode === 200,
40+
errorMessage: response.statusMessage,
41+
}
42+
}
43+
2544
/** ----- USER EXISTS ----- */
2645

2746
const userExists = async (data, token) => {
@@ -149,6 +168,7 @@ export default {
149168
createUser,
150169
getAppClient,
151170
userExists,
171+
ensureExternalUserExists,
152172
verifyCredentials,
153173
validateUser
154174
}

examples/javascript/src/lib/jane-service.spec.mjs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,48 @@ describe('jane service', () => {
248248
})
249249
})
250250

251+
describe('#ensureExternalUserExists', () => {
252+
test('returns valid when the status code is 200', async () => {
253+
jest.spyOn(apiService, 'post').mockImplementationOnce(() => {
254+
return new Promise((resolve) => resolve({ statusCode: 200 }))
255+
})
256+
257+
const { success } = await Jane.ensureExternalUserExists({
258+
259+
external_id: 'test-external-user-id',
260+
pool_id: 'test-pool-id',
261+
user_attributes: {
262+
test_attribute: 'test-value'
263+
}
264+
})
265+
266+
expect(success).toBe(true)
267+
})
268+
269+
test('returns invalid with an error message when the status code is 4xx', async () => {
270+
jest.spyOn(apiService, 'post').mockImplementationOnce(() => {
271+
return new Promise((resolve) =>
272+
resolve({
273+
statusCode: 404,
274+
statusMessage: 'Not Found'
275+
})
276+
)
277+
})
278+
279+
const { success, errorMessage } = await Jane.ensureExternalUserExists({
280+
281+
external_id: 'test-external-user-id',
282+
pool_id: 'test-pool-id',
283+
user_attributes: {
284+
test_attribute: 'test-value'
285+
}
286+
})
287+
288+
expect(success).toBe(false)
289+
expect(errorMessage).toEqual('Not Found')
290+
})
291+
})
292+
251293
describe('#getAppClient', () => {
252294
const exampleAppClient = {
253295
id: 12,

examples/javascript/src/pre-signup-lambda/index.mjs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,20 @@ export const handler = async (event) => {
2020
console.log(event);
2121

2222
if (event.triggerSource === ADMIN_CREATE_USER) {
23-
console.log(`Trigger source matches "${ADMIN_CREATE_USER}", returning.`);
24-
return event;
23+
const { success, errorMessage } = await Jane.ensureExternalUserExists({
24+
pool_id: event.userPoolId,
25+
external_id: event.userName,
26+
email: userData.email,
27+
user_attributes: userData.user_attributes,
28+
})
29+
30+
if (!success) {
31+
throw new Error(`ensureExternalUserExists was not successful: ${errorMessage}`)
32+
} else {
33+
console.log('ensureExternalUserExists successful')
34+
}
35+
36+
return event
2537
}
2638

2739
const email = event.request.userAttributes.email;

0 commit comments

Comments
 (0)