@awell-health/awell-extensions 2.0.43 → 2.0.44

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,6 +4,7 @@ exports.getSetPasswordLink = void 0;
4
4
  const extensions_core_1 = require("@awell-health/extensions-core");
5
5
  const config_1 = require("./config");
6
6
  const validatePayloadAndCreateSdk_1 = require("../../lib/sdk/validatePayloadAndCreateSdk");
7
+ const lodash_1 = require("lodash");
7
8
  exports.getSetPasswordLink = {
8
9
  key: 'getSetPasswordLink',
9
10
  category: extensions_core_1.Category.EHR_INTEGRATIONS,
@@ -14,24 +15,40 @@ exports.getSetPasswordLink = {
14
15
  dataPoints: config_1.dataPoints,
15
16
  onActivityCreated: async (payload, onComplete, onError) => {
16
17
  var _a, _b;
18
+ const MAX_RETRIES = 3;
19
+ const BASE_DELAY_MS = process.env.NODE_ENV === 'test' ? 10 : 1000;
17
20
  const { fields, healthieSdk } = await (0, validatePayloadAndCreateSdk_1.validatePayloadAndCreateSdk)({
18
21
  fieldsSchema: config_1.FieldsValidationSchema,
19
22
  payload,
20
23
  });
21
- const res = await healthieSdk.client.query({
22
- user: {
23
- __args: {
24
- id: fields.healthiePatientId,
24
+ let setPasswordLink;
25
+ /**
26
+ * We need to retry the API call because:
27
+ * - The setPasswordLink field is not immediately available after creating a new user.
28
+ * - The API response is inconsistent
29
+ */
30
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
31
+ const res = await healthieSdk.client.query({
32
+ user: {
33
+ __args: {
34
+ id: fields.healthiePatientId,
35
+ },
36
+ set_password_link: true,
25
37
  },
26
- set_password_link: true,
27
- },
28
- });
38
+ });
39
+ if (!(0, lodash_1.isNil)((_a = res.user) === null || _a === void 0 ? void 0 : _a.set_password_link)) {
40
+ setPasswordLink = String((_b = res.user) === null || _b === void 0 ? void 0 : _b.set_password_link);
41
+ break;
42
+ }
43
+ // Exponential backoff delay calculation
44
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt);
45
+ await new Promise((resolve) => setTimeout(resolve, delay));
46
+ }
29
47
  await onComplete({
30
48
  data_points: {
31
- setPasswordLink: ((_a = res.user) === null || _a === void 0 ? void 0 : _a.set_password_link) === undefined ||
32
- ((_b = res.user) === null || _b === void 0 ? void 0 : _b.set_password_link) === null
49
+ setPasswordLink: setPasswordLink === undefined || setPasswordLink === null
33
50
  ? undefined
34
- : String(res.user.set_password_link),
51
+ : String(setPasswordLink),
35
52
  },
36
53
  });
37
54
  },
@@ -1 +1 @@
1
- {"version":3,"file":"getSetPasswordLink.js","sourceRoot":"","sources":["../../../../../extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.ts"],"names":[],"mappings":";;;AACA,mEAAwD;AAExD,qCAAqE;AACrE,2FAAuF;AAE1E,QAAA,kBAAkB,GAA2C;IACxE,GAAG,EAAE,oBAAoB;IACzB,QAAQ,EAAE,0BAAQ,CAAC,gBAAgB;IACnC,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EAAE,yCAAyC;IACtD,MAAM,EAAN,eAAM;IACN,WAAW,EAAE,KAAK;IAClB,UAAU,EAAV,mBAAU;IACV,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAiB,EAAE;;QACvE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,yDAA2B,EAAC;YAChE,YAAY,EAAE,+BAAsB;YACpC,OAAO;SACR,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;YACzC,IAAI,EAAE;gBACJ,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM,CAAC,iBAAiB;iBAC7B;gBACD,iBAAiB,EAAE,IAAI;aACxB;SACF,CAAC,CAAA;QAEF,MAAM,UAAU,CAAC;YACf,WAAW,EAAE;gBACX,eAAe,EACb,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,iBAAiB,MAAK,SAAS;oBACzC,CAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,iBAAiB,MAAK,IAAI;oBAClC,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;aACzC;SACF,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"getSetPasswordLink.js","sourceRoot":"","sources":["../../../../../extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.ts"],"names":[],"mappings":";;;AACA,mEAAwD;AAExD,qCAAqE;AACrE,2FAAuF;AACvF,mCAA8B;AAEjB,QAAA,kBAAkB,GAA2C;IACxE,GAAG,EAAE,oBAAoB;IACzB,QAAQ,EAAE,0BAAQ,CAAC,gBAAgB;IACnC,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EAAE,yCAAyC;IACtD,MAAM,EAAN,eAAM;IACN,WAAW,EAAE,KAAK;IAClB,UAAU,EAAV,mBAAU;IACV,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAiB,EAAE;;QACvE,MAAM,WAAW,GAAG,CAAC,CAAA;QACrB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAEjE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,yDAA2B,EAAC;YAChE,YAAY,EAAE,+BAAsB;YACpC,OAAO;SACR,CAAC,CAAA;QAEF,IAAI,eAAmC,CAAA;QAEvC;;;;WAIG;QACH,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE;YACtD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzC,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,EAAE,EAAE,MAAM,CAAC,iBAAiB;qBAC7B;oBACD,iBAAiB,EAAE,IAAI;iBACxB;aACF,CAAC,CAAA;YAEF,IAAI,CAAC,IAAA,cAAK,EAAC,MAAA,GAAG,CAAC,IAAI,0CAAE,iBAAiB,CAAC,EAAE;gBACvC,eAAe,GAAG,MAAM,CAAC,MAAA,GAAG,CAAC,IAAI,0CAAE,iBAAiB,CAAC,CAAA;gBACrD,MAAK;aACN;YAED,wCAAwC;YACxC,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAClD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;SAC3D;QAED,MAAM,UAAU,CAAC;YACf,WAAW,EAAE;gBACX,eAAe,EACb,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI;oBACvD,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;aAC9B;SACF,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
@@ -7,6 +7,7 @@ const _1 = require(".");
7
7
  jest.mock('@extensions/healthie/lib/sdk/genql', () => ({
8
8
  HealthieSdk: jest.fn().mockImplementation(() => ({
9
9
  client: {
10
+ mutation: jest.fn(),
10
11
  query: jest.fn().mockResolvedValue({
11
12
  user: {
12
13
  set_password_link: 'https://securestaging.gethealthie.com/set_initial_password?signup_token=some-token',
@@ -17,9 +18,14 @@ jest.mock('@extensions/healthie/lib/sdk/genql', () => ({
17
18
  }));
18
19
  const mockedHealthieSdk = jest.mocked(genql_1.HealthieSdk);
19
20
  describe('Healthie - Get password link', () => {
21
+ let mockedClient;
20
22
  const { extensionAction: action, onComplete, onError, helpers, clearMocks, } = extensions_core_1.TestHelpers.fromAction(_1.getSetPasswordLink);
21
23
  beforeEach(() => {
22
24
  clearMocks();
25
+ mockedClient = {
26
+ query: jest.fn(),
27
+ mutation: jest.fn(),
28
+ };
23
29
  });
24
30
  test('Should call onComplete', async () => {
25
31
  await action.onEvent({
@@ -44,5 +50,42 @@ describe('Healthie - Get password link', () => {
44
50
  },
45
51
  });
46
52
  });
53
+ test('Should retry if set_password_link is null and succeed after retries', async () => {
54
+ // Mock the SDK to return null for the first two attempts, and succeed on the third attempt
55
+ mockedClient.query
56
+ .mockResolvedValueOnce({ user: { set_password_link: null } }) // First attempt
57
+ .mockResolvedValueOnce({ user: { set_password_link: null } }) // Second attempt
58
+ .mockResolvedValueOnce({
59
+ user: {
60
+ set_password_link: 'https://securestaging.gethealthie.com/set_initial_password?signup_token=some-token',
61
+ },
62
+ }) // Third attempt
63
+ ;
64
+ genql_1.HealthieSdk.mockImplementationOnce(() => ({
65
+ client: mockedClient,
66
+ }));
67
+ await action.onEvent({
68
+ payload: {
69
+ ...tests_1.testPayload,
70
+ fields: {
71
+ healthiePatientId: '453019',
72
+ },
73
+ settings: {
74
+ apiUrl: 'https://staging-api.gethealthie.com/graphql',
75
+ apiKey: 'apiKey',
76
+ },
77
+ },
78
+ onComplete,
79
+ onError,
80
+ helpers,
81
+ });
82
+ // Ensure the query was called 3 times and succeeded on the third attempt
83
+ expect(mockedClient.query).toHaveBeenCalledTimes(3);
84
+ expect(onComplete).toHaveBeenCalledWith({
85
+ data_points: {
86
+ setPasswordLink: 'https://securestaging.gethealthie.com/set_initial_password?signup_token=some-token',
87
+ },
88
+ });
89
+ });
47
90
  });
48
91
  //# sourceMappingURL=getSetPasswordLink.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getSetPasswordLink.test.js","sourceRoot":"","sources":["../../../../../extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.test.ts"],"names":[],"mappings":";;AAAA,mCAAqC;AACrC,mEAA2D;AAC3D,8DAAgE;AAChE,wBAAyD;AAEzD,IAAI,CAAC,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE;YACN,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjC,IAAI,EAAE;oBACJ,iBAAiB,EACf,oFAAoF;iBACvF;aACF,CAAC;SACH;KACF,CAAC,CAAC;CACJ,CAAC,CAAC,CAAA;AAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAW,CAAC,CAAA;AAElD,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,MAAM,EACJ,eAAe,EAAE,MAAM,EACvB,UAAU,EACV,OAAO,EACP,OAAO,EACP,UAAU,GACX,GAAG,6BAAW,CAAC,UAAU,CAAC,qBAAe,CAAC,CAAA;IAE3C,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,OAAO,EAAE;gBACP,GAAG,mBAAW;gBACd,MAAM,EAAE;oBACN,iBAAiB,EAAE,QAAQ;iBAC5B;gBACD,QAAQ,EAAE;oBACR,MAAM,EAAE,6CAA6C;oBACrD,MAAM,EAAE,QAAQ;iBACjB;aACF;YACD,UAAU;YACV,OAAO;YACP,OAAO;SACR,CAAC,CAAA;QAEF,MAAM,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAA;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;YACtC,WAAW,EAAE;gBACX,eAAe,EACb,oFAAoF;aACvF;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"getSetPasswordLink.test.js","sourceRoot":"","sources":["../../../../../extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awell-health/awell-extensions",
3
- "version": "2.0.43",
3
+ "version": "2.0.44",
4
4
  "packageManager": "yarn@3.4.1",
5
5
  "main": "dist/src/index.js",
6
6
  "repository": {