@transcend-io/cli 4.13.0 → 4.15.0
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/README.md +101 -20
- package/build/cli-pull-cron-identifiers.d.ts +3 -0
- package/build/cli-pull-cron-identifiers.d.ts.map +1 -0
- package/build/cli-pull-cron-identifiers.js +56 -0
- package/build/cli-pull-cron-identifiers.js.map +1 -0
- package/build/cli-request-upload.js +8 -5
- package/build/cli-request-upload.js.map +1 -1
- package/build/cron/index.d.ts +4 -0
- package/build/cron/index.d.ts.map +1 -0
- package/build/cron/index.js +16 -0
- package/build/cron/index.js.map +1 -0
- package/build/cron/pullCronIdentifiersToCsv.d.ts +24 -0
- package/build/cron/pullCronIdentifiersToCsv.d.ts.map +1 -0
- package/build/cron/pullCronIdentifiersToCsv.js +49 -0
- package/build/cron/pullCronIdentifiersToCsv.js.map +1 -0
- package/build/cron/pullCronPageOfIdentifiers.d.ts +46 -0
- package/build/cron/pullCronPageOfIdentifiers.d.ts.map +1 -0
- package/build/cron/pullCronPageOfIdentifiers.js +72 -0
- package/build/cron/pullCronPageOfIdentifiers.js.map +1 -0
- package/build/cron/writeCsv.d.ts +9 -0
- package/build/cron/writeCsv.d.ts.map +1 -0
- package/build/cron/writeCsv.js +47 -0
- package/build/cron/writeCsv.js.map +1 -0
- package/build/graphql/fetchAllAttributeKeys.d.ts +2 -0
- package/build/graphql/fetchAllAttributeKeys.d.ts.map +1 -1
- package/build/graphql/fetchAllAttributeKeys.js.map +1 -1
- package/build/graphql/gqls/attributeKey.d.ts.map +1 -1
- package/build/graphql/gqls/attributeKey.js +1 -0
- package/build/graphql/gqls/attributeKey.js.map +1 -1
- package/build/requests/constants.d.ts +24 -0
- package/build/requests/constants.d.ts.map +1 -1
- package/build/requests/constants.js +12 -0
- package/build/requests/constants.js.map +1 -1
- package/build/requests/extractClientError.d.ts +8 -0
- package/build/requests/extractClientError.d.ts.map +1 -0
- package/build/requests/extractClientError.js +15 -0
- package/build/requests/extractClientError.js.map +1 -0
- package/build/requests/index.d.ts +1 -0
- package/build/requests/index.d.ts.map +1 -1
- package/build/requests/index.js +1 -0
- package/build/requests/index.js.map +1 -1
- package/build/requests/mapColumnsToAttributes.d.ts +3 -1
- package/build/requests/mapColumnsToAttributes.d.ts.map +1 -1
- package/build/requests/mapColumnsToAttributes.js +6 -5
- package/build/requests/mapColumnsToAttributes.js.map +1 -1
- package/build/requests/mapColumnsToIdentifiers.d.ts.map +1 -1
- package/build/requests/mapColumnsToIdentifiers.js +4 -1
- package/build/requests/mapColumnsToIdentifiers.js.map +1 -1
- package/build/requests/mapCsvRowsToRequestInputs.d.ts +8 -2
- package/build/requests/mapCsvRowsToRequestInputs.d.ts.map +1 -1
- package/build/requests/mapCsvRowsToRequestInputs.js +18 -5
- package/build/requests/mapCsvRowsToRequestInputs.js.map +1 -1
- package/build/requests/mapRequestEnumValues.d.ts.map +1 -1
- package/build/requests/mapRequestEnumValues.js +8 -4
- package/build/requests/mapRequestEnumValues.js.map +1 -1
- package/build/requests/parseAttributesFromString.js +1 -1
- package/build/requests/parseAttributesFromString.js.map +1 -1
- package/build/requests/submitPrivacyRequest.d.ts +1 -1
- package/build/requests/submitPrivacyRequest.js +1 -1
- package/build/requests/submitPrivacyRequest.js.map +1 -1
- package/build/requests/uploadPrivacyRequestsFromCsv.d.ts +12 -1
- package/build/requests/uploadPrivacyRequestsFromCsv.d.ts.map +1 -1
- package/build/requests/uploadPrivacyRequestsFromCsv.js +98 -17
- package/build/requests/uploadPrivacyRequestsFromCsv.js.map +1 -1
- package/build/tsbuildinfo +1 -1
- package/package.json +5 -1
|
@@ -3,23 +3,34 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @param options - Options
|
|
5
5
|
*/
|
|
6
|
-
export declare function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraAuth, concurrency,
|
|
6
|
+
export declare function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraAuth, concurrency, defaultPhoneCountryCode, // USA
|
|
7
|
+
transcendApiUrl, attributes, emailIsVerified, clearSuccessfulRequests, clearFailingRequests, clearDuplicateRequests, skipFilterStep, isTest, isSilent, debug, dryRun, }: {
|
|
7
8
|
/** File to cache metadata about mapping of CSV shape to script */
|
|
8
9
|
cacheFilepath: string;
|
|
9
10
|
/** CSV file path */
|
|
10
11
|
file: string;
|
|
11
12
|
/** Transcend API key authentication */
|
|
12
13
|
auth: string;
|
|
14
|
+
/** Default country code for phone numbers */
|
|
15
|
+
defaultPhoneCountryCode?: string;
|
|
13
16
|
/** Concurrency to upload in */
|
|
14
17
|
concurrency?: number;
|
|
15
18
|
/** API URL for Transcend backend */
|
|
16
19
|
transcendApiUrl?: string;
|
|
17
20
|
/** Sombra API key authentication */
|
|
18
21
|
sombraAuth?: string;
|
|
22
|
+
/** Include debug logs */
|
|
23
|
+
debug?: boolean;
|
|
19
24
|
/** Skip the step where requests are filtered */
|
|
20
25
|
skipFilterStep?: boolean;
|
|
21
26
|
/** Whether test requests are being uploaded */
|
|
22
27
|
isTest?: boolean;
|
|
28
|
+
/** When true, clear out the failed requests from cache */
|
|
29
|
+
clearFailingRequests?: boolean;
|
|
30
|
+
/** When true, clear out the successful requests from cache */
|
|
31
|
+
clearSuccessfulRequests?: boolean;
|
|
32
|
+
/** When true, clear out duplicate requests from cache */
|
|
33
|
+
clearDuplicateRequests?: boolean;
|
|
23
34
|
/** Whether requests are uploaded in silent mode */
|
|
24
35
|
isSilent?: boolean;
|
|
25
36
|
/** Whether the email was verified up front */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadPrivacyRequestsFromCsv.d.ts","sourceRoot":"","sources":["../../src/requests/uploadPrivacyRequestsFromCsv.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uploadPrivacyRequestsFromCsv.d.ts","sourceRoot":"","sources":["../../src/requests/uploadPrivacyRequestsFromCsv.ts"],"names":[],"mappings":"AAyBA;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,EACjD,aAAa,EACb,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,WAAgB,EAChB,uBAA6B,EAAE,MAAM;AACrC,eAA4C,EAC5C,UAAe,EACf,eAAsB,EACtB,uBAA+B,EAC/B,oBAA4B,EAC5B,sBAA8B,EAC9B,cAAsB,EACtB,MAAc,EACd,QAAe,EACf,KAAa,EACb,MAAc,GACf,EAAE;IACD,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8DAA8D;IAC9D,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqQhB"}
|
|
@@ -27,6 +27,7 @@ const colors_1 = __importDefault(require("colors"));
|
|
|
27
27
|
const bluebird_1 = require("bluebird");
|
|
28
28
|
const t = __importStar(require("io-ts"));
|
|
29
29
|
const uniq_1 = __importDefault(require("lodash/uniq"));
|
|
30
|
+
const cli_progress_1 = __importDefault(require("cli-progress"));
|
|
30
31
|
const persisted_state_1 = require("@transcend-io/persisted-state");
|
|
31
32
|
const logger_1 = require("../logger");
|
|
32
33
|
const graphql_1 = require("../graphql");
|
|
@@ -40,12 +41,18 @@ const mapColumnsToAttributes_1 = require("./mapColumnsToAttributes");
|
|
|
40
41
|
const mapColumnsToIdentifiers_1 = require("./mapColumnsToIdentifiers");
|
|
41
42
|
const mapCsvRowsToRequestInputs_1 = require("./mapCsvRowsToRequestInputs");
|
|
42
43
|
const filterRows_1 = require("./filterRows");
|
|
44
|
+
const extractClientError_1 = require("./extractClientError");
|
|
43
45
|
/**
|
|
44
46
|
* Upload a set of privacy requests from CSV
|
|
45
47
|
*
|
|
46
48
|
* @param options - Options
|
|
47
49
|
*/
|
|
48
|
-
async function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraAuth, concurrency = 20,
|
|
50
|
+
async function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraAuth, concurrency = 20, defaultPhoneCountryCode = '1', // USA
|
|
51
|
+
transcendApiUrl = 'https://api.transcend.io', attributes = [], emailIsVerified = true, clearSuccessfulRequests = false, clearFailingRequests = false, clearDuplicateRequests = false, skipFilterStep = false, isTest = false, isSilent = true, debug = false, dryRun = false, }) {
|
|
52
|
+
// Time duration
|
|
53
|
+
const t0 = new Date().getTime();
|
|
54
|
+
// create a new progress bar instance and use shades_classic theme
|
|
55
|
+
const progressBar = new cli_progress_1.default.SingleBar({}, cli_progress_1.default.Presets.shades_classic);
|
|
49
56
|
// Parse out the extra attributes to apply to all requests uploaded
|
|
50
57
|
const parsedAttributes = (0, parseAttributesFromString_1.parseAttributesFromString)(attributes);
|
|
51
58
|
// Create a new state to persist the metadata that
|
|
@@ -59,8 +66,20 @@ async function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraA
|
|
|
59
66
|
statusToRequestStatus: {},
|
|
60
67
|
identifierNames: {},
|
|
61
68
|
attributeNames: {},
|
|
69
|
+
successfulRequests: [],
|
|
70
|
+
duplicateRequests: [],
|
|
62
71
|
failingRequests: [],
|
|
63
72
|
};
|
|
73
|
+
if (clearFailingRequests) {
|
|
74
|
+
cached.failingRequests = [];
|
|
75
|
+
}
|
|
76
|
+
if (clearSuccessfulRequests) {
|
|
77
|
+
cached.successfulRequests = [];
|
|
78
|
+
}
|
|
79
|
+
if (clearDuplicateRequests) {
|
|
80
|
+
cached.duplicateRequests = [];
|
|
81
|
+
}
|
|
82
|
+
state.setValue(cached, file);
|
|
64
83
|
// Create sombra instance to communicate with
|
|
65
84
|
const sombra = await (0, graphql_1.createSombraGotInstance)(transcendApiUrl, auth, sombraAuth);
|
|
66
85
|
// Read in the list of integration requests
|
|
@@ -70,8 +89,10 @@ async function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraA
|
|
|
70
89
|
if (requestsList.length === 0) {
|
|
71
90
|
throw new Error('No Requests found in list! Ensure the first row of the CSV is a header and the rest are requests.');
|
|
72
91
|
}
|
|
73
|
-
|
|
74
|
-
|
|
92
|
+
if (debug) {
|
|
93
|
+
const firstRequest = requestsList[0];
|
|
94
|
+
logger_1.logger.info(colors_1.default.magenta(`First request: ${JSON.stringify(firstRequest, null, 2)}`));
|
|
95
|
+
}
|
|
75
96
|
// Determine what rows in the CSV should be imported
|
|
76
97
|
// Choose columns that contain metadata to filter the requests
|
|
77
98
|
const filteredRequestList = skipFilterStep
|
|
@@ -79,12 +100,15 @@ async function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraA
|
|
|
79
100
|
: await (0, filterRows_1.filterRows)(requestsList);
|
|
80
101
|
// Build a GraphQL client
|
|
81
102
|
const client = (0, graphql_1.buildTranscendGraphQLClient)(transcendApiUrl, auth);
|
|
103
|
+
// Grab the request attributes
|
|
104
|
+
const requestAttributeKeys = await (0, graphql_1.fetchAllRequestAttributeKeys)(client);
|
|
82
105
|
// Determine the columns that should be mapped
|
|
83
106
|
const columnNameMap = await (0, mapCsvColumnsToApi_1.mapCsvColumnsToApi)(columnNames, cached);
|
|
84
107
|
state.setValue(cached, file);
|
|
85
108
|
const identifierNameMap = await (0, mapColumnsToIdentifiers_1.mapColumnsToIdentifiers)(client, columnNames, cached);
|
|
86
109
|
state.setValue(cached, file);
|
|
87
|
-
const attributeNameMap = await (0, mapColumnsToAttributes_1.mapColumnsToAttributes)(client, columnNames, cached);
|
|
110
|
+
const attributeNameMap = await (0, mapColumnsToAttributes_1.mapColumnsToAttributes)(client, columnNames, cached, requestAttributeKeys);
|
|
111
|
+
state.setValue(cached, file);
|
|
88
112
|
await (0, mapRequestEnumValues_1.mapRequestEnumValues)(client, filteredRequestList, {
|
|
89
113
|
fileName: file,
|
|
90
114
|
state,
|
|
@@ -93,14 +117,27 @@ async function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraA
|
|
|
93
117
|
cached = state.getValue(file);
|
|
94
118
|
// map the CSV to request input
|
|
95
119
|
const requestInputs = (0, mapCsvRowsToRequestInputs_1.mapCsvRowsToRequestInputs)(filteredRequestList, cached, {
|
|
120
|
+
defaultPhoneCountryCode,
|
|
96
121
|
columnNameMap,
|
|
97
122
|
identifierNameMap,
|
|
98
123
|
attributeNameMap,
|
|
124
|
+
requestAttributeKeys,
|
|
99
125
|
});
|
|
126
|
+
// start the progress bar with a total value of 200 and start value of 0
|
|
127
|
+
if (!debug) {
|
|
128
|
+
progressBar.start(requestInputs.length, 0);
|
|
129
|
+
}
|
|
130
|
+
let total = 0;
|
|
100
131
|
// Submit each request
|
|
101
132
|
await (0, bluebird_1.map)(requestInputs, async ([rawRow, requestInput], ind) => {
|
|
102
133
|
var _a;
|
|
103
|
-
|
|
134
|
+
// The identifier to log, only include personal data if debug mode is on
|
|
135
|
+
const requestLogId = debug
|
|
136
|
+
? `email:${requestInput.email} | coreIdentifier:${requestInput.coreIdentifier}`
|
|
137
|
+
: `row:${ind.toString()}`;
|
|
138
|
+
if (debug) {
|
|
139
|
+
logger_1.logger.info(colors_1.default.magenta(`[${ind}/${requestInputs.length}] Importing: ${JSON.stringify(requestInput, null, 2)}`));
|
|
140
|
+
}
|
|
104
141
|
// Skip on dry run
|
|
105
142
|
if (dryRun) {
|
|
106
143
|
logger_1.logger.info(colors_1.default.magenta('Bailing out on dry run because dryRun is set'));
|
|
@@ -115,25 +152,69 @@ async function uploadPrivacyRequestsFromCsv({ cacheFilepath, file, auth, sombraA
|
|
|
115
152
|
isSilent,
|
|
116
153
|
additionalAttributes: parsedAttributes,
|
|
117
154
|
});
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
155
|
+
// Log success
|
|
156
|
+
if (debug) {
|
|
157
|
+
logger_1.logger.info(colors_1.default.green(`[${ind}/${requestInputs.length}] Successfully submitted the test data subject request: "${requestLogId}"`));
|
|
158
|
+
logger_1.logger.info(colors_1.default.green(`[${ind}/${requestInputs.length}] View it at: "${requestResponse.link}"`));
|
|
159
|
+
}
|
|
160
|
+
// Cache successful upload
|
|
161
|
+
cached.successfulRequests.push({
|
|
162
|
+
id: requestResponse.id,
|
|
163
|
+
link: requestResponse.link,
|
|
164
|
+
coreIdentifier: requestResponse.coreIdentifier,
|
|
128
165
|
attemptedAt: new Date().toISOString(),
|
|
129
166
|
});
|
|
130
167
|
state.setValue(cached, file);
|
|
131
|
-
|
|
132
|
-
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const msg = `${err.message} - ${JSON.stringify((_a = err.response) === null || _a === void 0 ? void 0 : _a.body, null, 2)}`;
|
|
171
|
+
const clientError = (0, extractClientError_1.extractClientError)(msg);
|
|
172
|
+
if (clientError === 'Client error: You have already made this request.') {
|
|
173
|
+
if (debug) {
|
|
174
|
+
logger_1.logger.info(colors_1.default.yellow(`[${ind}/${requestInputs.length}] Skipping request as it is a duplicate`));
|
|
175
|
+
}
|
|
176
|
+
cached.duplicateRequests.push({
|
|
177
|
+
coreIdentifier: requestInput.coreIdentifier,
|
|
178
|
+
attemptedAt: new Date().toISOString(),
|
|
179
|
+
});
|
|
180
|
+
state.setValue(cached, file);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
cached.failingRequests.push({
|
|
184
|
+
...requestInput,
|
|
185
|
+
error: clientError || msg,
|
|
186
|
+
attemptedAt: new Date().toISOString(),
|
|
187
|
+
});
|
|
188
|
+
state.setValue(cached, file);
|
|
189
|
+
if (debug) {
|
|
190
|
+
logger_1.logger.error(colors_1.default.red(clientError || msg));
|
|
191
|
+
logger_1.logger.error(colors_1.default.red(`[${ind}/${requestInputs.length}] Failed to submit request for: "${requestLogId}"`));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
total += 1;
|
|
196
|
+
if (!debug) {
|
|
197
|
+
progressBar.update(total);
|
|
133
198
|
}
|
|
134
199
|
}, {
|
|
135
200
|
concurrency,
|
|
136
201
|
});
|
|
202
|
+
progressBar.stop();
|
|
203
|
+
const t1 = new Date().getTime();
|
|
204
|
+
const totalTime = t1 - t0;
|
|
205
|
+
// Log completion time
|
|
206
|
+
logger_1.logger.info(colors_1.default.green(`Completed upload in "${totalTime / 1000}" seconds.`));
|
|
207
|
+
// Log duplicates
|
|
208
|
+
if (cached.duplicateRequests.length > 0) {
|
|
209
|
+
logger_1.logger.info(colors_1.default.magenta(`Encountered "${cached.duplicateRequests.length}" duplicate requests. ` +
|
|
210
|
+
`See "${cacheFilepath}" to review the core identifiers for these requests.`));
|
|
211
|
+
}
|
|
212
|
+
// Log errors
|
|
213
|
+
if (cached.failingRequests.length > 0) {
|
|
214
|
+
logger_1.logger.error(colors_1.default.red(`Encountered "${cached.failingRequests.length}" errors. ` +
|
|
215
|
+
`See "${cacheFilepath}" to review the error messages and inputs.`));
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
137
218
|
}
|
|
138
219
|
exports.uploadPrivacyRequestsFromCsv = uploadPrivacyRequestsFromCsv;
|
|
139
220
|
//# sourceMappingURL=uploadPrivacyRequestsFromCsv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadPrivacyRequestsFromCsv.js","sourceRoot":"","sources":["../../src/requests/uploadPrivacyRequestsFromCsv.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,uCAA+B;AAC/B,yCAA2B;AAC3B,uDAA+B;
|
|
1
|
+
{"version":3,"file":"uploadPrivacyRequestsFromCsv.js","sourceRoot":"","sources":["../../src/requests/uploadPrivacyRequestsFromCsv.ts"],"names":[],"mappings":"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"}
|