@awell-health/awell-extensions 2.0.42 → 2.0.44
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/extensions/gridspace/actions/callWithGrace/callWithGrace.d.ts +8 -1
- package/dist/extensions/gridspace/actions/callWithGrace/callWithGrace.js +4 -3
- package/dist/extensions/gridspace/actions/callWithGrace/callWithGrace.js.map +1 -1
- package/dist/extensions/gridspace/actions/callWithGrace/callWithGrace.test.js +4 -1
- package/dist/extensions/gridspace/actions/callWithGrace/callWithGrace.test.js.map +1 -1
- package/dist/extensions/gridspace/actions/index.d.ts +89 -1
- package/dist/extensions/gridspace/actions/index.js +2 -0
- package/dist/extensions/gridspace/actions/index.js.map +1 -1
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/config.d.ts +45 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/config.js +73 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/config.js.map +1 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/index.d.ts +1 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/index.js +18 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/index.js.map +1 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.d.ts +82 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.js +44 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.js.map +1 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.test.d.ts +1 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.test.js +59 -0
- package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.test.js.map +1 -0
- package/dist/extensions/gridspace/lib/client.d.ts +7 -3
- package/dist/extensions/gridspace/lib/client.js +10 -3
- package/dist/extensions/gridspace/lib/client.js.map +1 -1
- package/dist/extensions/gridspace/settings.d.ts +15 -5
- package/dist/extensions/gridspace/settings.js +15 -10
- package/dist/extensions/gridspace/settings.js.map +1 -1
- package/dist/extensions/healthie/actions/createPatient/config/fields.d.ts +2 -2
- package/dist/extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.js +27 -10
- package/dist/extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.js.map +1 -1
- package/dist/extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.test.js +43 -0
- package/dist/extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.test.js.map +1 -1
- package/package.json +1 -1
@@ -55,7 +55,14 @@ export declare const callWithGrace: {
|
|
55
55
|
description: string;
|
56
56
|
};
|
57
57
|
}, {
|
58
|
-
|
58
|
+
accountId: {
|
59
|
+
label: string;
|
60
|
+
key: string;
|
61
|
+
obfuscated: false;
|
62
|
+
required: true;
|
63
|
+
description: string;
|
64
|
+
};
|
65
|
+
clientSecret: {
|
59
66
|
label: string;
|
60
67
|
key: string;
|
61
68
|
obfuscated: true;
|
@@ -6,6 +6,7 @@ const config_1 = require("./config");
|
|
6
6
|
const settings_1 = require("../../settings");
|
7
7
|
const lib_1 = require("../../lib");
|
8
8
|
const zod_1 = require("zod");
|
9
|
+
const lodash_1 = require("lodash");
|
9
10
|
exports.callWithGrace = {
|
10
11
|
key: 'callWithGrace',
|
11
12
|
title: 'Call with Grace',
|
@@ -16,16 +17,16 @@ exports.callWithGrace = {
|
|
16
17
|
previewable: false,
|
17
18
|
onEvent: async ({ payload, onComplete, onError }) => {
|
18
19
|
const { pathway, patient } = payload;
|
19
|
-
const { fields: { flowId, data, phoneNumber }, settings: {
|
20
|
+
const { fields: { flowId, data, phoneNumber }, settings: { accountId, clientSecret }, } = (0, extensions_core_1.validate)({
|
20
21
|
schema: zod_1.z.object({ fields: config_1.FieldsSchema, settings: settings_1.SettingsSchema }),
|
21
22
|
payload,
|
22
23
|
});
|
23
|
-
const client = new lib_1.GridspaceClient(
|
24
|
+
const client = new lib_1.GridspaceClient({ accountId, clientSecret });
|
24
25
|
const allData = {
|
25
26
|
...data,
|
26
27
|
phone_number: phoneNumber,
|
27
28
|
patient_id: patient.id,
|
28
|
-
...(patient.profile && { ...patient.profile }),
|
29
|
+
...(!(0, lodash_1.isNil)(patient.profile) && { ...patient.profile }),
|
29
30
|
pathway_id: pathway.id,
|
30
31
|
pathway_definition_id: pathway.definition_id,
|
31
32
|
activity_id: payload.activity.id,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"callWithGrace.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/callWithGrace/callWithGrace.ts"],"names":[],"mappings":";;;AAAA,mEAA+E;AAC/E,qCAA2D;AAC3D,
|
1
|
+
{"version":3,"file":"callWithGrace.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/callWithGrace/callWithGrace.ts"],"names":[],"mappings":";;;AAAA,mEAA+E;AAC/E,qCAA2D;AAC3D,6CAA8D;AAC9D,mCAA2C;AAC3C,6BAAuB;AACvB,mCAA8B;AACjB,QAAA,aAAa,GAAG;IAC3B,GAAG,EAAE,eAAe;IACpB,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,+DAA+D;IAC5E,QAAQ,EAAE,0BAAQ,CAAC,aAAa;IAChC,MAAM,EAAN,eAAM;IACN,UAAU,EAAV,mBAAU;IACV,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAClD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;QACpC,MAAM,EACJ,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EACrC,QAAQ,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,GACtC,GAAG,IAAA,0BAAQ,EAAC;YACX,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,qBAAY,EAAE,QAAQ,EAAE,yBAAc,EAAE,CAAC;YACpE,OAAO;SACR,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,IAAI,qBAAe,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;QAC/D,MAAM,OAAO,GAAG;YACd,GAAG,IAAI;YACP,YAAY,EAAE,WAAW;YACzB,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,GAAG,CAAC,CAAC,IAAA,cAAK,EAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YACtD,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,qBAAqB,EAAE,OAAO,CAAC,aAAa;YAC5C,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;SACjC,CAAA;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACxD,MAAM,UAAU,CAAC;YACf,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBAC9B,IAAI,EAAE,EAAE,EAAE,EAAE,8BAA8B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE;iBACnE;aACF;YACD,WAAW,EAAE,EAAE;SAChB,CAAC,CAAA;IACJ,CAAC;CAC+C,CAAA"}
|
@@ -21,7 +21,10 @@ describe('callWithGrace', () => {
|
|
21
21
|
data: { foo: 'bar', name: 'John Doe' },
|
22
22
|
phoneNumber: '1234567890',
|
23
23
|
},
|
24
|
-
settings: {
|
24
|
+
settings: {
|
25
|
+
accountId: 'someAccountId',
|
26
|
+
clientSecret: 'someClientSecret',
|
27
|
+
},
|
25
28
|
}),
|
26
29
|
onComplete,
|
27
30
|
onError,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"callWithGrace.test.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/callWithGrace/callWithGrace.test.ts"],"names":[],"mappings":";;AAAA,mEAA2D;AAC3D,mDAA+C;AAC/C,mDAA2D;AAC3D,mCAA6C;AAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;AAC7B,MAAM,iBAAiB,GAAG,IAAI;KAC3B,KAAK,CAAC,qBAAe,CAAC,SAAS,EAAE,eAAe,CAAC;KACjD,kBAAkB,CAAC,GAAG,EAAE;IACvB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAC,CAAA;AAEJ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GACjE,6BAAW,CAAC,UAAU,CAAC,6BAAa,CAAC,CAAA;IACvC,UAAU,CAAC,UAAU,CAAC,CAAA;IACtB,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,eAAe,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,IAAA,2BAAmB,EAAC;gBAC3B,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAS;oBAC7C,WAAW,EAAE,YAAY;iBAC1B;gBACD,QAAQ,EAAE,EAAE,
|
1
|
+
{"version":3,"file":"callWithGrace.test.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/callWithGrace/callWithGrace.test.ts"],"names":[],"mappings":";;AAAA,mEAA2D;AAC3D,mDAA+C;AAC/C,mDAA2D;AAC3D,mCAA6C;AAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;AAC7B,MAAM,iBAAiB,GAAG,IAAI;KAC3B,KAAK,CAAC,qBAAe,CAAC,SAAS,EAAE,eAAe,CAAC;KACjD,kBAAkB,CAAC,GAAG,EAAE;IACvB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAC,CAAA;AAEJ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GACjE,6BAAW,CAAC,UAAU,CAAC,6BAAa,CAAC,CAAA;IACvC,UAAU,CAAC,UAAU,CAAC,CAAA;IACtB,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,eAAe,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,IAAA,2BAAmB,EAAC;gBAC3B,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAS;oBAC7C,WAAW,EAAE,YAAY;iBAC1B;gBACD,QAAQ,EAAE;oBACR,SAAS,EAAE,eAAe;oBAC1B,YAAY,EAAE,kBAAkB;iBACjC;aACF,CAAC;YACF,UAAU;YACV,OAAO;YACP,OAAO;SACR,CAAC,CAAA;QACF,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE;YACvD,GAAG,EAAE,KAAK;YACV,YAAY,EAAE,YAAY;YAC1B,UAAU,EAAE,cAAc;YAC1B,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,YAAY;YACxB,WAAW,EAAE,aAAa;YAC1B,qBAAqB,EAAE,uBAAuB;SAC/C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
@@ -55,7 +55,95 @@ export declare const actions: {
|
|
55
55
|
description: string;
|
56
56
|
};
|
57
57
|
}, {
|
58
|
-
|
58
|
+
accountId: {
|
59
|
+
label: string;
|
60
|
+
key: string;
|
61
|
+
obfuscated: false;
|
62
|
+
required: true;
|
63
|
+
description: string;
|
64
|
+
};
|
65
|
+
clientSecret: {
|
66
|
+
label: string;
|
67
|
+
key: string;
|
68
|
+
obfuscated: true;
|
69
|
+
required: true;
|
70
|
+
description: string;
|
71
|
+
};
|
72
|
+
}>;
|
73
|
+
onComplete: import("@awell-health/extensions-core").OnCompleteCallback<string>;
|
74
|
+
onError: import("@awell-health/extensions-core").OnErrorCallback;
|
75
|
+
helpers: import("@awell-health/extensions-core").Helpers;
|
76
|
+
}) => Promise<void>;
|
77
|
+
};
|
78
|
+
uploadContactToCampaign: {
|
79
|
+
key: string;
|
80
|
+
title: string;
|
81
|
+
description: string;
|
82
|
+
category: import("@awell-health/extensions-core").Category.COMMUNICATION;
|
83
|
+
fields: {
|
84
|
+
campaignId: {
|
85
|
+
id: string;
|
86
|
+
label: string;
|
87
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
88
|
+
required: true;
|
89
|
+
description: string;
|
90
|
+
};
|
91
|
+
phoneNumber: {
|
92
|
+
id: string;
|
93
|
+
label: string;
|
94
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
95
|
+
stringType: import("@awell-health/extensions-core").StringType.PHONE;
|
96
|
+
required: true;
|
97
|
+
description: string;
|
98
|
+
};
|
99
|
+
data: {
|
100
|
+
id: string;
|
101
|
+
label: string;
|
102
|
+
type: import("@awell-health/extensions-core").FieldType.JSON;
|
103
|
+
required: true;
|
104
|
+
description: string;
|
105
|
+
};
|
106
|
+
};
|
107
|
+
dataPoints: {
|
108
|
+
data: {
|
109
|
+
key: string;
|
110
|
+
valueType: "json";
|
111
|
+
};
|
112
|
+
};
|
113
|
+
previewable: false;
|
114
|
+
onEvent: ({ payload }: {
|
115
|
+
payload: import("@awell-health/extensions-core").NewActivityPayload<{
|
116
|
+
campaignId: {
|
117
|
+
id: string;
|
118
|
+
label: string;
|
119
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
120
|
+
required: true;
|
121
|
+
description: string;
|
122
|
+
};
|
123
|
+
phoneNumber: {
|
124
|
+
id: string;
|
125
|
+
label: string;
|
126
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
127
|
+
stringType: import("@awell-health/extensions-core").StringType.PHONE;
|
128
|
+
required: true;
|
129
|
+
description: string;
|
130
|
+
};
|
131
|
+
data: {
|
132
|
+
id: string;
|
133
|
+
label: string;
|
134
|
+
type: import("@awell-health/extensions-core").FieldType.JSON;
|
135
|
+
required: true;
|
136
|
+
description: string;
|
137
|
+
};
|
138
|
+
}, {
|
139
|
+
accountId: {
|
140
|
+
label: string;
|
141
|
+
key: string;
|
142
|
+
obfuscated: false;
|
143
|
+
required: true;
|
144
|
+
description: string;
|
145
|
+
};
|
146
|
+
clientSecret: {
|
59
147
|
label: string;
|
60
148
|
key: string;
|
61
149
|
obfuscated: true;
|
@@ -2,7 +2,9 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.actions = void 0;
|
4
4
|
const callWithGrace_1 = require("./callWithGrace");
|
5
|
+
const uploadContactToCampaign_1 = require("./uploadContactToCampaign");
|
5
6
|
exports.actions = {
|
6
7
|
callWithGrace: callWithGrace_1.callWithGrace,
|
8
|
+
uploadContactToCampaign: uploadContactToCampaign_1.uploadContactToCampaign,
|
7
9
|
};
|
8
10
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../extensions/gridspace/actions/index.ts"],"names":[],"mappings":";;;AAAA,mDAA+C;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../extensions/gridspace/actions/index.ts"],"names":[],"mappings":";;;AAAA,mDAA+C;AAC/C,uEAAmE;AAEtD,QAAA,OAAO,GAAG;IACrB,aAAa,EAAb,6BAAa;IACb,uBAAuB,EAAvB,iDAAuB;CACxB,CAAA"}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import { FieldType, StringType } from '@awell-health/extensions-core';
|
2
|
+
import { z } from 'zod';
|
3
|
+
export declare const fields: {
|
4
|
+
campaignId: {
|
5
|
+
id: string;
|
6
|
+
label: string;
|
7
|
+
type: FieldType.STRING;
|
8
|
+
required: true;
|
9
|
+
description: string;
|
10
|
+
};
|
11
|
+
phoneNumber: {
|
12
|
+
id: string;
|
13
|
+
label: string;
|
14
|
+
type: FieldType.STRING;
|
15
|
+
stringType: StringType.PHONE;
|
16
|
+
required: true;
|
17
|
+
description: string;
|
18
|
+
};
|
19
|
+
data: {
|
20
|
+
id: string;
|
21
|
+
label: string;
|
22
|
+
type: FieldType.JSON;
|
23
|
+
required: true;
|
24
|
+
description: string;
|
25
|
+
};
|
26
|
+
};
|
27
|
+
export declare const dataPoints: {
|
28
|
+
data: {
|
29
|
+
key: string;
|
30
|
+
valueType: "json";
|
31
|
+
};
|
32
|
+
};
|
33
|
+
export declare const FieldsSchema: z.ZodObject<{
|
34
|
+
campaignId: z.ZodString;
|
35
|
+
phoneNumber: z.ZodString;
|
36
|
+
data: z.ZodEffects<z.ZodString, Record<string, string>, string>;
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
38
|
+
data: Record<string, string>;
|
39
|
+
phoneNumber: string;
|
40
|
+
campaignId: string;
|
41
|
+
}, {
|
42
|
+
data: string;
|
43
|
+
phoneNumber: string;
|
44
|
+
campaignId: string;
|
45
|
+
}>;
|
@@ -0,0 +1,73 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.FieldsSchema = exports.dataPoints = exports.fields = void 0;
|
4
|
+
const extensions_core_1 = require("@awell-health/extensions-core");
|
5
|
+
const lodash_1 = require("lodash");
|
6
|
+
const zod_1 = require("zod");
|
7
|
+
exports.fields = {
|
8
|
+
campaignId: {
|
9
|
+
id: 'campaignId',
|
10
|
+
label: 'Campaign ID',
|
11
|
+
type: extensions_core_1.FieldType.STRING,
|
12
|
+
required: true,
|
13
|
+
description: 'The ID of the Gridspace autodialer campaign.',
|
14
|
+
},
|
15
|
+
phoneNumber: {
|
16
|
+
id: 'phoneNumber',
|
17
|
+
label: 'Phone Number',
|
18
|
+
type: extensions_core_1.FieldType.STRING,
|
19
|
+
stringType: extensions_core_1.StringType.PHONE,
|
20
|
+
required: true,
|
21
|
+
description: 'The phone number to call.',
|
22
|
+
},
|
23
|
+
data: {
|
24
|
+
id: 'data',
|
25
|
+
label: 'Data',
|
26
|
+
type: extensions_core_1.FieldType.JSON,
|
27
|
+
required: true,
|
28
|
+
description: 'Any additional data to be passed to the campaign. Should be a JSON object.',
|
29
|
+
},
|
30
|
+
};
|
31
|
+
exports.dataPoints = {
|
32
|
+
data: {
|
33
|
+
key: 'data',
|
34
|
+
valueType: 'json',
|
35
|
+
},
|
36
|
+
};
|
37
|
+
exports.FieldsSchema = zod_1.z.object({
|
38
|
+
campaignId: zod_1.z.string(),
|
39
|
+
phoneNumber: zod_1.z.string(),
|
40
|
+
data: zod_1.z.string().transform((str, ctx) => {
|
41
|
+
if ((0, lodash_1.isNil)(str) || (0, lodash_1.isEmpty)(str)) {
|
42
|
+
return {};
|
43
|
+
}
|
44
|
+
try {
|
45
|
+
const parsedJson = JSON.parse(str);
|
46
|
+
if ((0, lodash_1.isEmpty)(parsedJson)) {
|
47
|
+
return {};
|
48
|
+
}
|
49
|
+
if (typeof parsedJson !== 'object' || Array.isArray(parsedJson)) {
|
50
|
+
ctx.addIssue({
|
51
|
+
code: 'custom',
|
52
|
+
message: 'Data should be an object',
|
53
|
+
});
|
54
|
+
return zod_1.z.NEVER;
|
55
|
+
}
|
56
|
+
for (const key in parsedJson) {
|
57
|
+
if (typeof parsedJson[key] !== 'string') {
|
58
|
+
ctx.addIssue({
|
59
|
+
code: 'custom',
|
60
|
+
message: `Value for key "${key}" must be a string`,
|
61
|
+
});
|
62
|
+
return zod_1.z.NEVER;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
return parsedJson;
|
66
|
+
}
|
67
|
+
catch (e) {
|
68
|
+
ctx.addIssue({ code: 'custom', message: 'Invalid JSON' });
|
69
|
+
return zod_1.z.NEVER;
|
70
|
+
}
|
71
|
+
}),
|
72
|
+
});
|
73
|
+
//# sourceMappingURL=config.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/uploadContactToCampaign/config.ts"],"names":[],"mappings":";;;AAAA,mEAKsC;AACtC,mCAAuC;AACvC,6BAAuB;AAEV,QAAA,MAAM,GAAG;IACpB,UAAU,EAAE;QACV,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,2BAAS,CAAC,MAAM;QACtB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,8CAA8C;KAC5D;IACD,WAAW,EAAE;QACX,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,2BAAS,CAAC,MAAM;QACtB,UAAU,EAAE,4BAAU,CAAC,KAAK;QAC5B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,2BAA2B;KACzC;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,2BAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,4EAA4E;KAC/E;CACe,CAAA;AAEL,QAAA,UAAU,GAAG;IACxB,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM;QACX,SAAS,EAAE,MAAM;KAClB;CAC4C,CAAA;AAElC,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,EAA0B,EAAE;QAC9D,IAAI,IAAA,cAAK,EAAC,GAAG,CAAC,IAAI,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE;YAC9B,OAAO,EAAE,CAAA;SACV;QAED,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAElC,IAAI,IAAA,gBAAO,EAAC,UAAU,CAAC,EAAE;gBACvB,OAAO,EAAE,CAAA;aACV;YAED,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;gBAC/D,GAAG,CAAC,QAAQ,CAAC;oBACX,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,0BAA0B;iBACpC,CAAC,CAAA;gBACF,OAAO,OAAC,CAAC,KAAK,CAAA;aACf;YAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;gBAC5B,IAAI,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;oBACvC,GAAG,CAAC,QAAQ,CAAC;wBACX,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,kBAAkB,GAAG,oBAAoB;qBACnD,CAAC,CAAA;oBACF,OAAO,OAAC,CAAC,KAAK,CAAA;iBACf;aACF;YAED,OAAO,UAAU,CAAA;SAClB;QAAC,OAAO,CAAC,EAAE;YACV,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;YACzD,OAAO,OAAC,CAAC,KAAK,CAAA;SACf;IACH,CAAC,CAAC;CACH,CAAC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from './uploadContactToCampaign';
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
+
};
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
+
__exportStar(require("./uploadContactToCampaign"), exports);
|
18
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/uploadContactToCampaign/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAAyC"}
|
package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.d.ts
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
import { Category } from '@awell-health/extensions-core';
|
2
|
+
export declare const uploadContactToCampaign: {
|
3
|
+
key: string;
|
4
|
+
title: string;
|
5
|
+
description: string;
|
6
|
+
category: Category.COMMUNICATION;
|
7
|
+
fields: {
|
8
|
+
campaignId: {
|
9
|
+
id: string;
|
10
|
+
label: string;
|
11
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
12
|
+
required: true;
|
13
|
+
description: string;
|
14
|
+
};
|
15
|
+
phoneNumber: {
|
16
|
+
id: string;
|
17
|
+
label: string;
|
18
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
19
|
+
stringType: import("@awell-health/extensions-core").StringType.PHONE;
|
20
|
+
required: true;
|
21
|
+
description: string;
|
22
|
+
};
|
23
|
+
data: {
|
24
|
+
id: string;
|
25
|
+
label: string;
|
26
|
+
type: import("@awell-health/extensions-core").FieldType.JSON;
|
27
|
+
required: true;
|
28
|
+
description: string;
|
29
|
+
};
|
30
|
+
};
|
31
|
+
dataPoints: {
|
32
|
+
data: {
|
33
|
+
key: string;
|
34
|
+
valueType: "json";
|
35
|
+
};
|
36
|
+
};
|
37
|
+
previewable: false;
|
38
|
+
onEvent: ({ payload }: {
|
39
|
+
payload: import("@awell-health/extensions-core").NewActivityPayload<{
|
40
|
+
campaignId: {
|
41
|
+
id: string;
|
42
|
+
label: string;
|
43
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
44
|
+
required: true;
|
45
|
+
description: string;
|
46
|
+
};
|
47
|
+
phoneNumber: {
|
48
|
+
id: string;
|
49
|
+
label: string;
|
50
|
+
type: import("@awell-health/extensions-core").FieldType.STRING;
|
51
|
+
stringType: import("@awell-health/extensions-core").StringType.PHONE;
|
52
|
+
required: true;
|
53
|
+
description: string;
|
54
|
+
};
|
55
|
+
data: {
|
56
|
+
id: string;
|
57
|
+
label: string;
|
58
|
+
type: import("@awell-health/extensions-core").FieldType.JSON;
|
59
|
+
required: true;
|
60
|
+
description: string;
|
61
|
+
};
|
62
|
+
}, {
|
63
|
+
accountId: {
|
64
|
+
label: string;
|
65
|
+
key: string;
|
66
|
+
obfuscated: false;
|
67
|
+
required: true;
|
68
|
+
description: string;
|
69
|
+
};
|
70
|
+
clientSecret: {
|
71
|
+
label: string;
|
72
|
+
key: string;
|
73
|
+
obfuscated: true;
|
74
|
+
required: true;
|
75
|
+
description: string;
|
76
|
+
};
|
77
|
+
}>;
|
78
|
+
onComplete: import("@awell-health/extensions-core").OnCompleteCallback<string>;
|
79
|
+
onError: import("@awell-health/extensions-core").OnErrorCallback;
|
80
|
+
helpers: import("@awell-health/extensions-core").Helpers;
|
81
|
+
}) => Promise<void>;
|
82
|
+
};
|
@@ -0,0 +1,44 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.uploadContactToCampaign = void 0;
|
4
|
+
const extensions_core_1 = require("@awell-health/extensions-core");
|
5
|
+
const config_1 = require("./config");
|
6
|
+
const settings_1 = require("../../settings");
|
7
|
+
const lib_1 = require("../../lib");
|
8
|
+
const zod_1 = require("zod");
|
9
|
+
const lodash_1 = require("lodash");
|
10
|
+
exports.uploadContactToCampaign = {
|
11
|
+
key: 'uploadContactToCampaign',
|
12
|
+
title: 'Upload Contact to Campaign',
|
13
|
+
description: 'Add a contact to a Gridspace autodialer campaign.',
|
14
|
+
category: extensions_core_1.Category.COMMUNICATION,
|
15
|
+
fields: config_1.fields,
|
16
|
+
dataPoints: config_1.dataPoints,
|
17
|
+
previewable: false,
|
18
|
+
onEvent: async ({ payload }) => {
|
19
|
+
const { pathway, patient, activity } = payload;
|
20
|
+
const { fields: { campaignId, data, phoneNumber }, settings: { accountId, clientSecret }, } = (0, extensions_core_1.validate)({
|
21
|
+
schema: zod_1.z.object({ fields: config_1.FieldsSchema, settings: settings_1.SettingsSchema }),
|
22
|
+
payload,
|
23
|
+
});
|
24
|
+
const client = new lib_1.GridspaceClient({ accountId, clientSecret });
|
25
|
+
const contactData = {
|
26
|
+
phone_number: phoneNumber,
|
27
|
+
...data,
|
28
|
+
activity_id: activity.id,
|
29
|
+
pathway_id: pathway.id,
|
30
|
+
pathway_definition_id: pathway.definition_id,
|
31
|
+
patient_id: patient.id,
|
32
|
+
};
|
33
|
+
const columnNames = (0, lodash_1.keys)(contactData);
|
34
|
+
const contactRow = (0, lodash_1.values)(contactData);
|
35
|
+
const requestBody = {
|
36
|
+
column_names: columnNames,
|
37
|
+
phone_number_column_name: 'phone_number',
|
38
|
+
contact_rows: [contactRow],
|
39
|
+
};
|
40
|
+
await client.uploadContactsToCampaign(campaignId, requestBody);
|
41
|
+
// No need to call onComplete since Gridspace will complete the activity later
|
42
|
+
},
|
43
|
+
};
|
44
|
+
//# sourceMappingURL=uploadContactToCampaign.js.map
|
package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"uploadContactToCampaign.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.ts"],"names":[],"mappings":";;;AAAA,mEAA+E;AAC/E,qCAA2D;AAC3D,6CAA8D;AAC9D,mCAA2C;AAC3C,6BAAuB;AACvB,mCAAqC;AAExB,QAAA,uBAAuB,GAAG;IACrC,GAAG,EAAE,yBAAyB;IAC9B,KAAK,EAAE,4BAA4B;IACnC,WAAW,EAAE,mDAAmD;IAChE,QAAQ,EAAE,0BAAQ,CAAC,aAAa;IAChC,MAAM,EAAN,eAAM;IACN,UAAU,EAAV,mBAAU;IACV,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;QAC9C,MAAM,EACJ,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,EACzC,QAAQ,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,GACtC,GAAG,IAAA,0BAAQ,EAAC;YACX,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,qBAAY,EAAE,QAAQ,EAAE,yBAAc,EAAE,CAAC;YACpE,OAAO;SACR,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,IAAI,qBAAe,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;QAE/D,MAAM,WAAW,GAAG;YAClB,YAAY,EAAE,WAAW;YACzB,GAAG,IAAI;YACP,WAAW,EAAE,QAAQ,CAAC,EAAE;YACxB,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,qBAAqB,EAAE,OAAO,CAAC,aAAa;YAC5C,UAAU,EAAE,OAAO,CAAC,EAAE;SACvB,CAAA;QAED,MAAM,WAAW,GAAG,IAAA,aAAI,EAAC,WAAW,CAAC,CAAA;QACrC,MAAM,UAAU,GAAG,IAAA,eAAM,EAAC,WAAW,CAAC,CAAA;QAEtC,MAAM,WAAW,GAAG;YAClB,YAAY,EAAE,WAAW;YACzB,wBAAwB,EAAE,cAAc;YACxC,YAAY,EAAE,CAAC,UAAU,CAAC;SAC3B,CAAA;QAED,MAAM,MAAM,CAAC,wBAAwB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;QAE9D,8EAA8E;IAChF,CAAC;CAC+C,CAAA"}
|
package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.test.d.ts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
package/dist/extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.test.js
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const extensions_core_1 = require("@awell-health/extensions-core");
|
4
|
+
const uploadContactToCampaign_1 = require("./uploadContactToCampaign");
|
5
|
+
const lib_1 = require("../../lib");
|
6
|
+
const tests_1 = require("@/tests");
|
7
|
+
jest.mock('../../lib/client');
|
8
|
+
const mockUploadContactsToCampaign = jest
|
9
|
+
.spyOn(lib_1.GridspaceClient.prototype, 'uploadContactsToCampaign')
|
10
|
+
.mockImplementation(() => {
|
11
|
+
return Promise.resolve({ num_uploaded_contacts: 1 });
|
12
|
+
});
|
13
|
+
describe('uploadContactToCampaign', () => {
|
14
|
+
const { extensionAction, onComplete, onError, helpers, clearMocks } = extensions_core_1.TestHelpers.fromAction(uploadContactToCampaign_1.uploadContactToCampaign);
|
15
|
+
beforeEach(clearMocks);
|
16
|
+
it('should upload contact to the Gridspace autodialer campaign', async () => {
|
17
|
+
await extensionAction.onEvent({
|
18
|
+
payload: (0, tests_1.generateTestPayload)({
|
19
|
+
fields: {
|
20
|
+
campaignId: 'campaign123',
|
21
|
+
data: JSON.stringify({ first_name: 'John', last_name: 'Doe' }),
|
22
|
+
phoneNumber: '15552223333',
|
23
|
+
},
|
24
|
+
settings: {
|
25
|
+
accountId: 'someAccountId',
|
26
|
+
clientSecret: 'someClientSecret',
|
27
|
+
},
|
28
|
+
}),
|
29
|
+
onComplete,
|
30
|
+
onError,
|
31
|
+
helpers,
|
32
|
+
});
|
33
|
+
expect(mockUploadContactsToCampaign).toHaveBeenCalledWith('campaign123', {
|
34
|
+
column_names: [
|
35
|
+
'phone_number',
|
36
|
+
'first_name',
|
37
|
+
'last_name',
|
38
|
+
'activity_id',
|
39
|
+
'pathway_id',
|
40
|
+
'pathway_definition_id',
|
41
|
+
'patient_id',
|
42
|
+
],
|
43
|
+
phone_number_column_name: 'phone_number',
|
44
|
+
contact_rows: [
|
45
|
+
[
|
46
|
+
'15552223333',
|
47
|
+
'John',
|
48
|
+
'Doe',
|
49
|
+
'activity-id',
|
50
|
+
'pathway-id',
|
51
|
+
'pathway-definition-id',
|
52
|
+
'test-patient',
|
53
|
+
],
|
54
|
+
],
|
55
|
+
});
|
56
|
+
expect(onComplete).not.toHaveBeenCalled();
|
57
|
+
});
|
58
|
+
});
|
59
|
+
//# sourceMappingURL=uploadContactToCampaign.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"uploadContactToCampaign.test.js","sourceRoot":"","sources":["../../../../../extensions/gridspace/actions/uploadContactToCampaign/uploadContactToCampaign.test.ts"],"names":[],"mappings":";;AAAA,mEAA2D;AAC3D,uEAAmE;AACnE,mCAA2C;AAC3C,mCAA6C;AAE7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;AAC7B,MAAM,4BAA4B,GAAG,IAAI;KACtC,KAAK,CAAC,qBAAe,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC5D,kBAAkB,CAAC,GAAG,EAAE;IACvB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAA;AACtD,CAAC,CAAC,CAAA;AAEJ,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GACjE,6BAAW,CAAC,UAAU,CAAC,iDAAuB,CAAC,CAAA;IAEjD,UAAU,CAAC,UAAU,CAAC,CAAA;IAEtB,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,eAAe,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,IAAA,2BAAmB,EAAC;gBAC3B,MAAM,EAAE;oBACN,UAAU,EAAE,aAAa;oBACzB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBAC9D,WAAW,EAAE,aAAa;iBAC3B;gBACD,QAAQ,EAAE;oBACR,SAAS,EAAE,eAAe;oBAC1B,YAAY,EAAE,kBAAkB;iBACjC;aACF,CAAC;YACF,UAAU;YACV,OAAO;YACP,OAAO;SACR,CAAC,CAAA;QAEF,MAAM,CAAC,4BAA4B,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;YACvE,YAAY,EAAE;gBACZ,cAAc;gBACd,YAAY;gBACZ,WAAW;gBACX,aAAa;gBACb,YAAY;gBACZ,uBAAuB;gBACvB,YAAY;aACb;YACD,wBAAwB,EAAE,cAAc;YACxC,YAAY,EAAE;gBACZ;oBACE,aAAa;oBACb,MAAM;oBACN,KAAK;oBACL,aAAa;oBACb,YAAY;oBACZ,uBAAuB;oBACvB,cAAc;iBACf;aACF;SACF,CAAC,CAAA;QAEF,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
@@ -1,5 +1,9 @@
|
|
1
1
|
export declare class GridspaceClient {
|
2
|
-
private client;
|
3
|
-
constructor(
|
4
|
-
|
2
|
+
private readonly client;
|
3
|
+
constructor({ accountId, clientSecret, }: {
|
4
|
+
accountId: string;
|
5
|
+
clientSecret: string;
|
6
|
+
});
|
7
|
+
callWithGrace(workflowId: string, data: Record<string, any>): Promise<unknown>;
|
8
|
+
uploadContactsToCampaign(campaignId: string, data: any): Promise<any>;
|
5
9
|
}
|
@@ -6,12 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.GridspaceClient = void 0;
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
8
8
|
class GridspaceClient {
|
9
|
-
constructor(
|
9
|
+
constructor({ accountId, clientSecret, }) {
|
10
|
+
// base 64 encode the accountId and clientSecret in Basic Authentication format
|
11
|
+
const token = Buffer.from(`${accountId}:${clientSecret}`).toString('base64');
|
10
12
|
this.client = axios_1.default.create({
|
11
|
-
baseURL: 'https://
|
13
|
+
baseURL: 'https://api.gridspace.com/v1',
|
12
14
|
headers: {
|
13
|
-
Authorization: `Basic ${
|
15
|
+
Authorization: `Basic ${token}`,
|
14
16
|
'Content-Type': 'application/json',
|
17
|
+
Accept: 'application/json',
|
15
18
|
},
|
16
19
|
});
|
17
20
|
}
|
@@ -19,6 +22,10 @@ class GridspaceClient {
|
|
19
22
|
const resp = await this.client.post(`/v0/workflows/${workflowId}/run`, data);
|
20
23
|
return resp.data;
|
21
24
|
}
|
25
|
+
async uploadContactsToCampaign(campaignId, data) {
|
26
|
+
const response = await this.client.post(`/autodialer/${campaignId}/dialees`, data);
|
27
|
+
return response.data;
|
28
|
+
}
|
22
29
|
}
|
23
30
|
exports.GridspaceClient = GridspaceClient;
|
24
31
|
//# sourceMappingURL=client.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../extensions/gridspace/lib/client.ts"],"names":[],"mappings":";;;;;;AAAA,
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../extensions/gridspace/lib/client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAiD;AACjD,MAAa,eAAe;IAG1B,YAAY,EACV,SAAS,EACT,YAAY,GAIb;QACC,+EAA+E;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC5E,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,KAAK,EAAE;gBAC/B,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,IAAyB;QAEzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,UAAU,MAAM,EAAE,IAAI,CAAC,CAAA;QAC5E,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,UAAkB,EAAE,IAAS;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,eAAe,UAAU,UAAU,EACnC,IAAI,CACL,CAAA;QACD,OAAO,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;CACF;AArCD,0CAqCC"}
|
@@ -1,6 +1,13 @@
|
|
1
|
-
import z from 'zod';
|
1
|
+
import { z } from 'zod';
|
2
2
|
export declare const settings: {
|
3
|
-
|
3
|
+
accountId: {
|
4
|
+
label: string;
|
5
|
+
key: string;
|
6
|
+
obfuscated: false;
|
7
|
+
required: true;
|
8
|
+
description: string;
|
9
|
+
};
|
10
|
+
clientSecret: {
|
4
11
|
label: string;
|
5
12
|
key: string;
|
6
13
|
obfuscated: true;
|
@@ -9,10 +16,13 @@ export declare const settings: {
|
|
9
16
|
};
|
10
17
|
};
|
11
18
|
export declare const SettingsSchema: z.ZodObject<{
|
12
|
-
|
19
|
+
accountId: z.ZodString;
|
20
|
+
clientSecret: z.ZodString;
|
13
21
|
}, "strip", z.ZodTypeAny, {
|
14
|
-
|
22
|
+
clientSecret: string;
|
23
|
+
accountId: string;
|
15
24
|
}, {
|
16
|
-
|
25
|
+
clientSecret: string;
|
26
|
+
accountId: string;
|
17
27
|
}>;
|
18
28
|
export type ExtensionSettings = z.infer<typeof SettingsSchema>;
|
@@ -1,20 +1,25 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
3
|
exports.SettingsSchema = exports.settings = void 0;
|
7
|
-
const zod_1 =
|
4
|
+
const zod_1 = require("zod");
|
8
5
|
exports.settings = {
|
9
|
-
|
10
|
-
label: '
|
11
|
-
key: '
|
6
|
+
accountId: {
|
7
|
+
label: 'Account ID',
|
8
|
+
key: 'accountId',
|
9
|
+
obfuscated: false,
|
10
|
+
required: true,
|
11
|
+
description: 'Your Gridspace account ID.',
|
12
|
+
},
|
13
|
+
clientSecret: {
|
14
|
+
label: 'Client Secret',
|
15
|
+
key: 'clientSecret',
|
12
16
|
obfuscated: true,
|
13
17
|
required: true,
|
14
|
-
description: '
|
18
|
+
description: 'Your Gridspace client secret.',
|
15
19
|
},
|
16
20
|
};
|
17
|
-
exports.SettingsSchema = zod_1.
|
18
|
-
|
21
|
+
exports.SettingsSchema = zod_1.z.object({
|
22
|
+
accountId: zod_1.z.string(),
|
23
|
+
clientSecret: zod_1.z.string(),
|
19
24
|
});
|
20
25
|
//# sourceMappingURL=settings.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../extensions/gridspace/settings.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../extensions/gridspace/settings.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAGV,QAAA,QAAQ,GAAG;IACtB,SAAS,EAAE;QACT,KAAK,EAAE,YAAY;QACnB,GAAG,EAAE,WAAW;QAChB,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,4BAA4B;KAC1C;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,eAAe;QACtB,GAAG,EAAE,cAAc;QACnB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,+BAA+B;KAC7C;CACiB,CAAA;AAEP,QAAA,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;IACrB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAA"}
|
@@ -67,18 +67,18 @@ export declare const FieldsValidationSchema: z.ZodObject<{
|
|
67
67
|
email: string;
|
68
68
|
first_name: string;
|
69
69
|
last_name: string;
|
70
|
+
phone_number?: string | undefined;
|
70
71
|
provider_id?: string | undefined;
|
71
72
|
legal_name?: string | undefined;
|
72
73
|
skipped_email?: boolean | undefined;
|
73
|
-
phone_number?: string | undefined;
|
74
74
|
send_invite?: boolean | undefined;
|
75
75
|
}, {
|
76
76
|
email: string;
|
77
77
|
first_name: string;
|
78
78
|
last_name: string;
|
79
|
+
phone_number?: string | undefined;
|
79
80
|
provider_id?: string | undefined;
|
80
81
|
legal_name?: string | undefined;
|
81
82
|
skipped_email?: boolean | undefined;
|
82
|
-
phone_number?: string | undefined;
|
83
83
|
send_invite?: boolean | undefined;
|
84
84
|
}>;
|
@@ -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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
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:
|
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(
|
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;
|
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;
|
1
|
+
{"version":3,"file":"getSetPasswordLink.test.js","sourceRoot":"","sources":["../../../../../extensions/healthie/actions/getSetPasswordLink/getSetPasswordLink.test.ts"],"names":[],"mappings":"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"}
|