@proca/cli 3.1.1 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/campaign.d.ts +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/proca.d.ts +157 -29
- package/dist/proca.js +42 -17
- package/dist/proca.js.map +1 -1
- package/dist/queueMessage.d.ts +5 -2
- package/dist/queueMessage.js +8 -2
- package/dist/queueMessage.js.map +1 -1
- package/dist/service/distance.d.ts +3 -0
- package/dist/service/distance.js +92 -0
- package/dist/service/distance.js.map +1 -0
- package/dist/service/identity.d.ts +7 -5
- package/dist/service/identity.js +54 -14
- package/dist/service/identity.js.map +1 -1
- package/dist/service/index.js.map +1 -1
- package/package.json +5 -5
package/dist/service/identity.js
CHANGED
|
@@ -16,16 +16,47 @@ exports.toConsent = exports.toDataApi = exports.syncAction = void 0;
|
|
|
16
16
|
const bent_1 = __importDefault(require("bent"));
|
|
17
17
|
const debug_1 = __importDefault(require("debug"));
|
|
18
18
|
const util_1 = require("../util");
|
|
19
|
+
/*
|
|
20
|
+
* How to configure Identity consent.
|
|
21
|
+
*
|
|
22
|
+
* Consents in speakout/identity have levels:
|
|
23
|
+
* - none_given # complex way to say: opt out
|
|
24
|
+
* - implicit # complex way to say: no checkbox, opt in assumed
|
|
25
|
+
* - explicit_not_opt_out # complex way to say: prechecked opt in
|
|
26
|
+
* - explicit_opt_in # complex way to say: checked opt in
|
|
27
|
+
*
|
|
28
|
+
* In Proca we have:
|
|
29
|
+
* - opt_in: false/true
|
|
30
|
+
* - email_status: null/double_opt_in
|
|
31
|
+
*
|
|
32
|
+
* Identity might require a few different consents (each for some different goal)
|
|
33
|
+
* For identity we want to configure mapping
|
|
34
|
+
* {
|
|
35
|
+
* data_processing_2022: { level: 'explicit_opt_in' }
|
|
36
|
+
* newsletter_v2: { level: 'communication' } # will depend on Proca optIn ? 'explicit_opt_in' : 'none_given',
|
|
37
|
+
* newsletter_v3: { level: 'double_opt_in' } # will depend on Proca double_opt_in ? 'explicit_opt_in' : 'none_given'
|
|
38
|
+
* }
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
19
41
|
const log = debug_1.default('proca:service:identity');
|
|
20
42
|
function syncAction(action, argv, config) {
|
|
21
43
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
44
|
const url = argv.service_url || config.identity_url;
|
|
23
45
|
const api_token = config.identity_api_token;
|
|
24
46
|
const comm_consent = config.identity_consent;
|
|
47
|
+
const only_opt_in = 'IDENTITY_ONLY_OPT_IN' in process.env;
|
|
48
|
+
const only_double_opt_in = 'IDENTITY_ONLY_DOUBLE_OPT_IN' in process.env;
|
|
25
49
|
if (!url)
|
|
26
50
|
throw new Error("identity url not set");
|
|
27
51
|
if (!api_token)
|
|
28
52
|
throw new Error("identity api token not set");
|
|
53
|
+
// XXX the only_* mode indents to drop data where
|
|
54
|
+
if (only_double_opt_in && action.privacy.emailStatus !== 'double_opt_in') {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (only_opt_in && action.privacy.optIn === false) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
29
60
|
let consent = null;
|
|
30
61
|
if (comm_consent === null || comm_consent === undefined) {
|
|
31
62
|
log('ProcaCli argv.identity_consent is not set');
|
|
@@ -41,10 +72,6 @@ function syncAction(action, argv, config) {
|
|
|
41
72
|
consent = {};
|
|
42
73
|
consent[comm_consent] = { level: 'communication' };
|
|
43
74
|
}
|
|
44
|
-
if (Object.keys(action.contact.pii).length == 0) {
|
|
45
|
-
log(`Cannot decrypt PII; public key is ${action.contact.publicKey}`);
|
|
46
|
-
throw "Cannot decrypt personal data, please check KEYS";
|
|
47
|
-
}
|
|
48
75
|
const payload = toDataApi(action, consent, config.identity_action_fields, config.identity_contact_fields);
|
|
49
76
|
log(`Identity DATA API payload (without api_token)`, payload);
|
|
50
77
|
payload.api_token = api_token;
|
|
@@ -73,15 +100,15 @@ function toDataApi(action, consent_map, action_fields, contact_fields) {
|
|
|
73
100
|
external_id: action.actionPageId,
|
|
74
101
|
consents: Object.entries(consent_map).map(([pub_id, con_conf]) => toConsent(action, pub_id, con_conf)).filter(x => x),
|
|
75
102
|
cons_hash: {
|
|
76
|
-
firstname: action.contact.
|
|
77
|
-
lastname: action.contact.
|
|
78
|
-
emails: [{ email: action.contact.
|
|
103
|
+
firstname: action.contact.firstName,
|
|
104
|
+
lastname: action.contact.lastName,
|
|
105
|
+
emails: [{ email: action.contact.email }],
|
|
79
106
|
custom_fields: [],
|
|
80
107
|
addresses: [{
|
|
81
|
-
postcode: action.contact.
|
|
82
|
-
country: action.contact.
|
|
83
|
-
town: action.contact.
|
|
84
|
-
state: action.contact.
|
|
108
|
+
postcode: action.contact.postcode,
|
|
109
|
+
country: action.contact.country,
|
|
110
|
+
town: action.contact.locality,
|
|
111
|
+
state: action.contact.region
|
|
85
112
|
}]
|
|
86
113
|
}
|
|
87
114
|
};
|
|
@@ -122,20 +149,33 @@ function toConsent(action, consent_id, consent) {
|
|
|
122
149
|
consent_level: level
|
|
123
150
|
};
|
|
124
151
|
// Handle opt in to communication
|
|
125
|
-
if (level
|
|
152
|
+
if (level === 'communication') {
|
|
126
153
|
if (action.privacy) {
|
|
127
|
-
if (action.privacy.optIn) {
|
|
154
|
+
if (action.privacy.optIn === true) {
|
|
128
155
|
return {
|
|
129
156
|
public_id: consent_id,
|
|
130
157
|
consent_level: 'explicit_opt_in'
|
|
131
158
|
};
|
|
132
159
|
}
|
|
133
|
-
else {
|
|
160
|
+
else if (action.privacy.optIn === false) {
|
|
134
161
|
return {
|
|
135
162
|
public_id: consent_id,
|
|
136
163
|
consent_level: 'none_given'
|
|
137
164
|
};
|
|
138
165
|
}
|
|
166
|
+
// watch out, optIn key can be missing if this is non-consent action
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
public_id: consent_id,
|
|
170
|
+
consent_level: 'no_change'
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (level === 'double_opt_in') {
|
|
174
|
+
if (action.privacy.emailStatus === 'double_opt_in') {
|
|
175
|
+
return {
|
|
176
|
+
public_id: consent_id,
|
|
177
|
+
consent_level: 'explicit_opt_in'
|
|
178
|
+
};
|
|
139
179
|
}
|
|
140
180
|
else {
|
|
141
181
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/service/identity.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,gDAAuB;AACvB,kDAAyB;AAIzB,kCAAmC;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/service/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sDAA6B;AAiB7B,SAAgB,UAAU,CAAC,IAAkB;IAC3C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;QACpC,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sDAA6B;AAiB7B,SAAgB,UAAU,CAAC,IAAkB;IAC3C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;QACpC,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE3C,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SACrD;QACD,OAAO,OAAO,CAAA;KACf;IAED,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;QACpC,OAAO,IAAI,CAAC,OAAO,CAAA;KACpB;IAED,MAAM,oEAAoE,CAAA;AAC5E,CAAC;AAfD,gCAeC;AAGD,SAAgB,UAAU,CAAC,GAAkB;IAC3C,SAAe,MAAM,CAAC,GAAG,IAAY;;YACnC,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;gBAC9B,MAAM,EAAE,GAAG,iBAAO,CAAC,WAAW,CAAC;oBAC7B,mBAAmB,EAAE,CAAC;oBACtB,YAAY,EAAE,GAAG;oBACjB,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;gBACH,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;gBAChB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,UAAS,MAAM,EAAE,KAAK;oBACnC,IAAI;wBACF,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAW,EAAE,EAAE;4BACpE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAA;4BAClC,EAAE,CAAC,OAAO,EAAE,CAAA;wBACd,CAAC,CAAC,CAAA;qBACH;oBAAC,OAAM,KAAW,EAAE;wBACnB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAA;wBACrC,EAAE,CAAC,OAAO,EAAE,CAAA;qBACb;gBACH,CAAC,CAAC,CAAA;gBAEF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAA;gBAElD,EAAE,CAAC,OAAO,EAAE,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AA3BD,gCA2BC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proca/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.1",
|
|
4
4
|
"description": "cli[ent] for Proca",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"browser": "dist/browser.js",
|
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
"README.md"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@proca/api": "^3.
|
|
29
|
-
"@proca/crypto": "^3.
|
|
28
|
+
"@proca/api": "^3.3.1",
|
|
29
|
+
"@proca/crypto": "^3.3.1",
|
|
30
30
|
"@types/node-mailjet": "^3.3.4",
|
|
31
|
-
"amqplib": "^0.
|
|
31
|
+
"amqplib": "^0.8.0",
|
|
32
32
|
"backoff": "^2.5.0",
|
|
33
33
|
"base64url": "^3.0.1",
|
|
34
34
|
"cross-fetch": "^3.0.6",
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"debug": "^4.3.1",
|
|
80
80
|
"node-mailjet": "^3.3.1"
|
|
81
81
|
},
|
|
82
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "881678623fc935adea06c46a8c5431e45b9dac3b"
|
|
83
83
|
}
|