-
Notifications
You must be signed in to change notification settings - Fork 215
/
replaceAllObjects.ts
83 lines (68 loc) · 2.89 KB
/
replaceAllObjects.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { createWaitablePromise, encode, WaitablePromise } from '@algolia/client-common';
import { MethodEnum } from '@algolia/requester-common';
import { RequestOptions } from '@algolia/transporter';
import { IndexOperationResponse, ReplaceAllObjectsOptions, SearchIndex } from '../..';
import { saveObjects, waitTask } from '.';
export const replaceAllObjects = (base: SearchIndex) => {
return (
objects: ReadonlyArray<{ readonly [key: string]: any }>,
requestOptions?: ReplaceAllObjectsOptions & RequestOptions
): Readonly<WaitablePromise<void>> => {
const { safe, ...options } = requestOptions || {};
const operation = (
from: string,
to: string,
type: string,
operatioRequestOptions?: RequestOptions
): Readonly<WaitablePromise<IndexOperationResponse>> => {
return createWaitablePromise<IndexOperationResponse>(
base.transporter.write(
{
method: MethodEnum.Post,
path: encode('1/indexes/%s/operation', from),
data: {
operation: type,
destination: to,
},
},
operatioRequestOptions
),
(response, waitRequestOptions) => waitTask(base)(response.taskID, waitRequestOptions)
);
};
const randomSuffix = Math.random()
.toString(36)
.substring(7);
const temporaryIndexName = `${base.indexName}_tmp_${randomSuffix}`;
const saveObjectsInTemporary = saveObjects({
appId: base.appId,
transporter: base.transporter,
indexName: temporaryIndexName,
});
// eslint-disable-next-line prefer-const, functional/no-let, functional/prefer-readonly-type
let responses: Array<Readonly<WaitablePromise<any>>> = [];
const copyWaitablePromise = operation(base.indexName, temporaryIndexName, 'copy', {
...options,
scope: ['settings', 'synonyms', 'rules'],
});
// eslint-disable-next-line functional/immutable-data
responses.push(copyWaitablePromise);
const result = (safe ? copyWaitablePromise.wait(options) : copyWaitablePromise)
.then(() => {
const saveObjectsWaitablePromise = saveObjectsInTemporary(objects, options);
// eslint-disable-next-line functional/immutable-data
responses.push(saveObjectsWaitablePromise);
return safe ? saveObjectsWaitablePromise.wait(options) : saveObjectsWaitablePromise;
})
.then(() => {
const moveWaitablePromise = operation(temporaryIndexName, base.indexName, 'move', options);
// eslint-disable-next-line functional/immutable-data
responses.push(moveWaitablePromise);
return safe ? moveWaitablePromise.wait(options) : moveWaitablePromise;
})
.then(() => Promise.resolve());
return createWaitablePromise<void>(result, (_, waitRequestOptions) => {
return Promise.all(responses.map(response => response.wait(waitRequestOptions)));
});
};
};