@or-sdk/contacts 3.5.7-beta.2189.0 → 3.5.7-beta.2196.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.
Files changed (38) hide show
  1. package/dist/cjs/Contacts.js +7 -5
  2. package/dist/cjs/Contacts.js.map +1 -1
  3. package/dist/cjs/api/batchProcessApi.js +1 -20
  4. package/dist/cjs/api/batchProcessApi.js.map +1 -1
  5. package/dist/cjs/api/bulkContactsCreateApi.js +141 -46
  6. package/dist/cjs/api/bulkContactsCreateApi.js.map +1 -1
  7. package/dist/cjs/api/contactApi.js +15 -19
  8. package/dist/cjs/api/contactApi.js.map +1 -1
  9. package/dist/cjs/constants.js +1 -1
  10. package/dist/cjs/constants.js.map +1 -1
  11. package/dist/esm/Contacts.js +7 -5
  12. package/dist/esm/Contacts.js.map +1 -1
  13. package/dist/esm/api/batchProcessApi.js +1 -16
  14. package/dist/esm/api/batchProcessApi.js.map +1 -1
  15. package/dist/esm/api/bulkContactsCreateApi.js +85 -20
  16. package/dist/esm/api/bulkContactsCreateApi.js.map +1 -1
  17. package/dist/esm/api/contactApi.js +4 -6
  18. package/dist/esm/api/contactApi.js.map +1 -1
  19. package/dist/esm/constants.js +1 -1
  20. package/dist/esm/constants.js.map +1 -1
  21. package/dist/types/Contacts.d.ts.map +1 -1
  22. package/dist/types/api/batchProcessApi.d.ts +0 -2
  23. package/dist/types/api/batchProcessApi.d.ts.map +1 -1
  24. package/dist/types/api/bulkContactsCreateApi.d.ts +10 -5
  25. package/dist/types/api/bulkContactsCreateApi.d.ts.map +1 -1
  26. package/dist/types/api/contactApi.d.ts +2 -6
  27. package/dist/types/api/contactApi.d.ts.map +1 -1
  28. package/dist/types/constants.d.ts +1 -1
  29. package/dist/types/constants.d.ts.map +1 -1
  30. package/dist/types/types.d.ts +0 -4
  31. package/dist/types/types.d.ts.map +1 -1
  32. package/package.json +2 -2
  33. package/src/Contacts.ts +6 -5
  34. package/src/api/batchProcessApi.ts +2 -15
  35. package/src/api/bulkContactsCreateApi.ts +113 -39
  36. package/src/api/contactApi.ts +4 -12
  37. package/src/constants.ts +1 -1
  38. package/src/types.ts +0 -3
@@ -4,8 +4,13 @@ import BatchProcessApi from './batchProcessApi';
4
4
  import { REQUEST_PAYLOAD_MAX_BYTES } from '../constants';
5
5
  import { chunkArrByMaxSize, debouncePromise, getObjectSizeInBytes } from '../utils';
6
6
  import { v4 } from 'uuid';
7
- import { BulkContactDto } from '@onereach/types-contacts-api';
8
- import { BatchBulkCreateData, BulkCreateData, CreateBulkResults } from '../types';
7
+ import {
8
+ BulkContactDto,
9
+ BulkCreateResultsDto,
10
+ BulkProgressDto,
11
+ CreateBulkResponseDto,
12
+ } from '@onereach/types-contacts-api';
13
+ import { BatchBulkCreateData, BulkCreateData } from '../types';
9
14
 
10
15
  export default class BulkContactsCreateApi extends BaseWithPoling {
11
16
  constructor(
@@ -43,37 +48,69 @@ export default class BulkContactsCreateApi extends BaseWithPoling {
43
48
  * In the case if contactKey is not defined, it it will be automatically set to the index (as string)
44
49
  * of contact.
45
50
  */
46
- async bulkCreateContacts(
47
- data: BulkCreateData,
48
- options: {bulkSize?: number;} = {},
49
- ): Promise<CreateBulkResults> {
51
+ public async bulkCreateContacts(
52
+ bulkName: string,
53
+ data: BulkCreateData
54
+ ): Promise<BulkCreateResultsDto> {
50
55
  const dataWithContactKeys = this.updateContactsWithContactKeys(data);
51
- const { bulkSize = REQUEST_PAYLOAD_MAX_BYTES } = options;
52
- await this.batchProcessApi.indicesOff();
53
- let results: CreateBulkResults = {
56
+
57
+ await this.indicesOff();
58
+ let results: BulkCreateResultsDto = {
54
59
  created: {},
55
60
  failed: {},
56
61
  };
62
+ // eslint-disable-next-line no-console
63
+ console.log('SET BULK PROGRESS');
64
+ await this.setBulkProgress(bulkName);
65
+ // eslint-disable-next-line no-console
66
+ console.log('OK');
57
67
  try {
58
68
  const { contacts, ...rest } = dataWithContactKeys;
59
- const contactsMaxSize = bulkSize - getObjectSizeInBytes({ ...rest });
69
+ const contactsMaxSize = REQUEST_PAYLOAD_MAX_BYTES - getObjectSizeInBytes({ ...rest });
60
70
  const contactsChunks = chunkArrByMaxSize(contacts, contactsMaxSize);
61
- const batchGroupId = v4();
62
71
 
63
72
  if (contactsChunks.length === 1) {
64
- await this.createContactsInSingleBatch(dataWithContactKeys as BatchBulkCreateData, batchGroupId);
73
+ await this.createContactsInSingleBatch(dataWithContactKeys as BatchBulkCreateData, bulkName);
65
74
  } else {
66
- await this.createContactsInMultiBatches(contactsChunks as BulkContactDto[][], rest, batchGroupId);
75
+ await this.createContactsInMultiBatches(contactsChunks as BulkContactDto[][], rest, bulkName);
67
76
  }
68
77
 
69
- results = await this.getBulkCreateResults(batchGroupId);
78
+ // eslint-disable-next-line no-console
79
+ console.log('GET BULK RESULTS');
80
+ results = await this.getBulkCreateResults(bulkName);
81
+ // eslint-disable-next-line no-console
82
+ console.log('OK');
70
83
  } finally {
71
- await this.batchProcessApi.indicesOn();
84
+ const indicesOnBatchId = v4();
85
+ this.indicesOn(indicesOnBatchId);
86
+ await debouncePromise(() => this.polling(indicesOnBatchId), 3000);
72
87
  }
73
88
 
74
89
  return results;
75
90
  }
76
91
 
92
+ async getBulkProgress(bulkName: string): Promise<BulkProgressDto> {
93
+ return this.apiCall({
94
+ method: 'GET',
95
+ route: `${this.apiBasePath}/bulk-progress/${bulkName}`,
96
+ });
97
+ }
98
+
99
+ private async setBulkProgress(bulkName: string): Promise<void> {
100
+ return this.apiCall({
101
+ method: 'POST',
102
+ route: `${this.apiBasePath}/bulk-progress/${bulkName}`,
103
+ });
104
+ }
105
+
106
+ private async updateBulkProgress(bulkName: string, progress: BulkProgressDto): Promise<void> {
107
+ return this.apiCall({
108
+ method: 'PATCH',
109
+ route: `${this.apiBasePath}/bulk-progress/${bulkName}`,
110
+ data: progress,
111
+ });
112
+ }
113
+
77
114
  private updateContactsWithContactKeys(data: BulkCreateData): BatchBulkCreateData {
78
115
  const dataWithContactKeys = {
79
116
  ...data,
@@ -93,6 +130,20 @@ export default class BulkContactsCreateApi extends BaseWithPoling {
93
130
  return dataWithContactKeys;
94
131
  }
95
132
 
133
+ private async indicesOn(batchId: string): Promise<void> {
134
+ return this.apiCall({
135
+ method: 'POST',
136
+ route: `${this.apiBasePath}/indices-on/${batchId}`,
137
+ });
138
+ }
139
+
140
+ private async indicesOff(): Promise<void> {
141
+ return this.apiCall({
142
+ method: 'POST',
143
+ route: `${this.apiBasePath}/indices-off`,
144
+ });
145
+ }
146
+
96
147
  private checkContactKeysDuplications(contacts: BulkContactDto[]): void {
97
148
  contacts.map(({ contactKey }) => contactKey).forEach((key, index, array) => {
98
149
  if (index !== array.lastIndexOf(key)) {
@@ -101,30 +152,32 @@ export default class BulkContactsCreateApi extends BaseWithPoling {
101
152
  });
102
153
  }
103
154
 
104
- private async getBulkCreateResults(batchGroupId: string): Promise<CreateBulkResults> {
105
- const batchProcessesGroup = await this.batchProcessApi.getBatchProcessesGroup(batchGroupId);
106
- return batchProcessesGroup.reduce<CreateBulkResults>((acc, batch) => {
107
- const createdContacts = batch.results.reduce<Record<string, string>>((acc, result) => ({
108
- ...acc,
109
- ...JSON.parse(result),
110
- }), {});
111
- const failedContacts = batch.messages.reduce<Record<string, string>>((acc, message) => ({
112
- ...acc,
113
- ...JSON.parse(message),
114
- }), {});
115
- return {
116
- created: {
117
- ...acc.created,
118
- ...createdContacts,
119
- },
120
- failed: {
121
- ...acc.failed,
122
- ...failedContacts,
123
- },
124
- };
125
- }, {
126
- created: {},
127
- failed: {},
155
+ public async getBulkCreateResults(batchGroupId: string): Promise<BulkCreateResultsDto> {
156
+ const { total, results: firstResults, size } = await this.callGetBulkResults(batchGroupId, 0);
157
+ let results = { ...firstResults };
158
+
159
+ if (total > size) {
160
+ for (let i = 1;i <= Math.ceil((total - size) / size);i ++) {
161
+ const { results: nextResults } = await this.callGetBulkResults(batchGroupId, i * 500);
162
+ results = {
163
+ created: {
164
+ ...results.created,
165
+ ...nextResults.created,
166
+ },
167
+ failed: {
168
+ ...results.failed,
169
+ ...nextResults.created,
170
+ },
171
+ };
172
+ }
173
+ }
174
+ return results;
175
+ }
176
+
177
+ private async callGetBulkResults(batchGroupId: string, skip: number): Promise<CreateBulkResponseDto> {
178
+ return await this.apiCall<CreateBulkResponseDto>({
179
+ method: 'GET',
180
+ route: `${this.apiBasePath}/bulk-results/${batchGroupId}/${skip}`,
128
181
  });
129
182
  }
130
183
 
@@ -144,6 +197,27 @@ export default class BulkContactsCreateApi extends BaseWithPoling {
144
197
  });
145
198
  // giving time to 2 lambdas to wake up (1 - create Batch and 2 - ping batch status)
146
199
  await debouncePromise(() => this.polling(batchId), 3000);
200
+
201
+ // eslint-disable-next-line no-console
202
+ console.log('GET TEMP BULK PROGRESS');
203
+ const {
204
+ totalBatches,
205
+ totalContacts,
206
+ completedBatches,
207
+ completedContacts,
208
+ } = await this.getBulkProgress(batchGroupId);
209
+ // eslint-disable-next-line no-console
210
+ console.log('OK');
211
+ // eslint-disable-next-line no-console
212
+ console.log('UPDATE TEMP BULK PROGRESS');
213
+ await this.updateBulkProgress(batchGroupId, {
214
+ totalBatches,
215
+ totalContacts,
216
+ completedBatches: completedBatches + 1,
217
+ completedContacts: completedContacts + data.contacts.length,
218
+ });
219
+ // eslint-disable-next-line no-console
220
+ console.log('OK');
147
221
  }
148
222
 
149
223
  private async createContactsInMultiBatches(
@@ -173,13 +173,9 @@ export default class ContactApi extends BaseWithPoling {
173
173
  *
174
174
  * @see constructor of packages/contacts/src/Contacts
175
175
  */
176
- async bulkCreateContacts(
177
- data: CreateMultipleContactsDto,
178
- options: {bulkSize?: number;} = {}
179
- ): Promise<void> {
180
- const { bulkSize = REQUEST_PAYLOAD_MAX_BYTES } = options;
176
+ async bulkCreateContacts(data: CreateMultipleContactsDto): Promise<void> {
181
177
  const { contacts, ...rest } = data;
182
- const contactsMaxSize = bulkSize - getObjectSizeInBytes({ ...rest });
178
+ const contactsMaxSize = REQUEST_PAYLOAD_MAX_BYTES - getObjectSizeInBytes({ ...rest });
183
179
  const contactsChunks = chunkArrByMaxSize(contacts, contactsMaxSize);
184
180
 
185
181
  contactsChunks.length === 1
@@ -194,13 +190,9 @@ export default class ContactApi extends BaseWithPoling {
194
190
  *
195
191
  * @see batchProcessApi.trackBatchProcess
196
192
  */
197
- async initCreateBatch(
198
- data: CreateMultipleContactsDto,
199
- options: {bulkSize?: number;} = {}
200
- ): Promise<InitCreateBatchResponse> {
201
- const { bulkSize = REQUEST_PAYLOAD_MAX_BYTES } = options;
193
+ async initCreateBatch(data: CreateMultipleContactsDto): Promise<InitCreateBatchResponse> {
202
194
  const { contacts, ...rest } = data;
203
- const contactsMaxSize = bulkSize - getObjectSizeInBytes({ ...rest });
195
+ const contactsMaxSize = REQUEST_PAYLOAD_MAX_BYTES - getObjectSizeInBytes({ ...rest });
204
196
  const contactsChunks = chunkArrByMaxSize(contacts, contactsMaxSize);
205
197
 
206
198
  const batchProcess = await this.apiCall<BatchProcessResponseDto>({
package/src/constants.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export const CONTACTS_SERVICE_KEY = 'contacts-api';
2
2
 
3
- export const REQUEST_PAYLOAD_MAX_BYTES = 4000000;
3
+ export const REQUEST_PAYLOAD_MAX_BYTES = 150000;
4
4
 
5
5
  export const FAILED_REQUEST_REPEATS = 3;
6
6
 
package/src/types.ts CHANGED
@@ -81,6 +81,3 @@ export type BulkCreateData = Omit<BulkCreateRequestDto, 'batchId' | 'batchGroupI
81
81
  & { contacts: OptionalBy<BulkContactDto, 'contactKey'>[]; };
82
82
 
83
83
  export type BatchBulkCreateData = Omit<BulkCreateRequestDto, 'batchId' | 'batchGroupId'>;
84
-
85
- export type CreateBulkResults = {created: Record<string, string>; failed: Record<string, string>;};
86
-