@mercurjs/algolia 1.5.0 → 1.5.2
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/.medusa/server/src/modules/algolia/service.d.ts +3 -2
- package/.medusa/server/src/modules/algolia/service.js +39 -32
- package/.medusa/server/src/subscribers/algolia-products-changed.d.ts +2 -2
- package/.medusa/server/src/subscribers/algolia-products-changed.js +22 -12
- package/.medusa/server/src/subscribers/algolia-products-deleted.d.ts +2 -2
- package/.medusa/server/src/subscribers/algolia-products-deleted.js +17 -7
- package/.medusa/server/src/subscribers/utils/algolia-product.d.ts +1 -1
- package/.medusa/server/src/subscribers/utils/algolia-product.js +44 -39
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IndexSettings } from
|
|
2
|
-
import {
|
|
1
|
+
import { IndexSettings, SearchParams, SearchResponse } from 'algoliasearch';
|
|
2
|
+
import { AlgoliaEntity, IndexType } from '@mercurjs/framework';
|
|
3
3
|
type ModuleOptions = {
|
|
4
4
|
appId: string;
|
|
5
5
|
apiKey: string;
|
|
@@ -21,5 +21,6 @@ declare class AlgoliaModuleService {
|
|
|
21
21
|
partialUpdate(type: IndexType, entity: Partial<AlgoliaEntity> & {
|
|
22
22
|
id: string;
|
|
23
23
|
}): Promise<import("algoliasearch").UpdatedAtWithObjectIdResponse>;
|
|
24
|
+
search<T = Record<string, unknown>>(indexName: IndexType, params: SearchParams): Promise<SearchResponse<T>>;
|
|
24
25
|
}
|
|
25
26
|
export default AlgoliaModuleService;
|
|
@@ -4,17 +4,17 @@ exports.defaultReviewSettings = exports.defaultProductSettings = void 0;
|
|
|
4
4
|
const algoliasearch_1 = require("algoliasearch");
|
|
5
5
|
exports.defaultProductSettings = {
|
|
6
6
|
searchableAttributes: [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
]
|
|
7
|
+
'title',
|
|
8
|
+
'subtitle',
|
|
9
|
+
'tags.value',
|
|
10
|
+
'type.value',
|
|
11
|
+
'categories.name',
|
|
12
|
+
'collection.title',
|
|
13
|
+
'variants.title'
|
|
14
|
+
]
|
|
15
15
|
};
|
|
16
16
|
exports.defaultReviewSettings = {
|
|
17
|
-
attributesForFaceting: [
|
|
17
|
+
attributesForFaceting: ['filterOnly(reference_id)', 'filterOnly(reference)']
|
|
18
18
|
};
|
|
19
19
|
class AlgoliaModuleService {
|
|
20
20
|
constructor(_, options) {
|
|
@@ -26,35 +26,36 @@ class AlgoliaModuleService {
|
|
|
26
26
|
}
|
|
27
27
|
checkIndex(index) {
|
|
28
28
|
return this.algolia_.indexExists({
|
|
29
|
-
indexName: index
|
|
29
|
+
indexName: index
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
updateSettings(index, settings) {
|
|
33
33
|
return this.algolia_.setSettings({
|
|
34
34
|
indexName: index,
|
|
35
|
-
indexSettings: settings
|
|
35
|
+
indexSettings: settings
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
batch(type, toAdd, toDelete) {
|
|
39
|
-
const
|
|
39
|
+
const addRequests = toAdd.map((entity) => {
|
|
40
40
|
return {
|
|
41
|
-
action:
|
|
41
|
+
action: 'addObject',
|
|
42
42
|
objectID: entity.id,
|
|
43
|
-
body: entity
|
|
43
|
+
body: entity
|
|
44
44
|
};
|
|
45
45
|
});
|
|
46
|
-
|
|
46
|
+
const deleteRequests = toDelete.map((id) => {
|
|
47
47
|
return {
|
|
48
|
-
action:
|
|
48
|
+
action: 'deleteObject',
|
|
49
49
|
objectID: id,
|
|
50
|
-
body: {}
|
|
50
|
+
body: {}
|
|
51
51
|
};
|
|
52
|
-
})
|
|
52
|
+
});
|
|
53
|
+
const requests = [...addRequests, ...deleteRequests];
|
|
53
54
|
return this.algolia_.batch({
|
|
54
55
|
indexName: type,
|
|
55
56
|
batchWriteParams: {
|
|
56
|
-
requests
|
|
57
|
-
}
|
|
57
|
+
requests
|
|
58
|
+
}
|
|
58
59
|
});
|
|
59
60
|
}
|
|
60
61
|
batchUpsert(type, entities) {
|
|
@@ -63,12 +64,12 @@ class AlgoliaModuleService {
|
|
|
63
64
|
batchWriteParams: {
|
|
64
65
|
requests: entities.map((entity) => {
|
|
65
66
|
return {
|
|
66
|
-
action:
|
|
67
|
+
action: 'addObject',
|
|
67
68
|
objectID: entity.id,
|
|
68
|
-
body: entity
|
|
69
|
+
body: entity
|
|
69
70
|
};
|
|
70
|
-
})
|
|
71
|
-
}
|
|
71
|
+
})
|
|
72
|
+
}
|
|
72
73
|
});
|
|
73
74
|
}
|
|
74
75
|
batchDelete(type, ids) {
|
|
@@ -77,34 +78,40 @@ class AlgoliaModuleService {
|
|
|
77
78
|
batchWriteParams: {
|
|
78
79
|
requests: ids.map((id) => {
|
|
79
80
|
return {
|
|
80
|
-
action:
|
|
81
|
+
action: 'deleteObject',
|
|
81
82
|
objectID: id,
|
|
82
|
-
body: {}
|
|
83
|
+
body: {}
|
|
83
84
|
};
|
|
84
|
-
})
|
|
85
|
-
}
|
|
85
|
+
})
|
|
86
|
+
}
|
|
86
87
|
});
|
|
87
88
|
}
|
|
88
89
|
upsert(type, entity) {
|
|
89
90
|
return this.algolia_.addOrUpdateObject({
|
|
90
91
|
indexName: type,
|
|
91
92
|
objectID: entity.id,
|
|
92
|
-
body: entity
|
|
93
|
+
body: entity
|
|
93
94
|
});
|
|
94
95
|
}
|
|
95
96
|
delete(type, id) {
|
|
96
97
|
return this.algolia_.deleteObject({
|
|
97
98
|
indexName: type,
|
|
98
|
-
objectID: id
|
|
99
|
+
objectID: id
|
|
99
100
|
});
|
|
100
101
|
}
|
|
101
102
|
partialUpdate(type, entity) {
|
|
102
103
|
return this.algolia_.partialUpdateObject({
|
|
103
104
|
indexName: type,
|
|
104
105
|
objectID: entity.id,
|
|
105
|
-
attributesToUpdate: { ...entity }
|
|
106
|
+
attributesToUpdate: { ...entity }
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
search(indexName, params) {
|
|
110
|
+
return this.algolia_.searchSingleIndex({
|
|
111
|
+
indexName,
|
|
112
|
+
searchParams: params
|
|
106
113
|
});
|
|
107
114
|
}
|
|
108
115
|
}
|
|
109
116
|
exports.default = AlgoliaModuleService;
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FsZ29saWEvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFRc0I7QUFTVCxRQUFBLHNCQUFzQixHQUFrQjtJQUNuRCxvQkFBb0IsRUFBRTtRQUNwQixPQUFPO1FBQ1AsVUFBVTtRQUNWLFlBQVk7UUFDWixZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLGtCQUFrQjtRQUNsQixnQkFBZ0I7S0FDakI7Q0FDRixDQUFBO0FBRVksUUFBQSxxQkFBcUIsR0FBa0I7SUFDbEQscUJBQXFCLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSx1QkFBdUIsQ0FBQztDQUM3RSxDQUFBO0FBRUQsTUFBTSxvQkFBb0I7SUFJeEIsWUFBWSxDQUFDLEVBQUUsT0FBc0I7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFBLDZCQUFhLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUE7SUFDNUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQy9CLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBZ0IsRUFBRSxRQUF1QjtRQUN0RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQy9CLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLGFBQWEsRUFBRSxRQUFRO1NBQ3hCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBZSxFQUFFLEtB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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SubscriberArgs, SubscriberConfig } from
|
|
2
|
-
export default function algoliaProductsChangedHandler({ event, container
|
|
1
|
+
import { SubscriberArgs, SubscriberConfig } from '@medusajs/framework';
|
|
2
|
+
export default function algoliaProductsChangedHandler({ event, container }: SubscriberArgs<{
|
|
3
3
|
ids: string[];
|
|
4
4
|
}>): Promise<void>;
|
|
5
5
|
export declare const config: SubscriberConfig;
|
|
@@ -2,21 +2,31 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.config = void 0;
|
|
4
4
|
exports.default = algoliaProductsChangedHandler;
|
|
5
|
-
const
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const framework_1 = require("@mercurjs/framework");
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
const algolia_1 = require("../modules/algolia");
|
|
8
|
+
const utils_2 = require("../subscribers/utils");
|
|
9
|
+
async function algoliaProductsChangedHandler({ event, container }) {
|
|
10
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
11
|
+
try {
|
|
12
|
+
const algolia = container.resolve(algolia_1.ALGOLIA_MODULE);
|
|
13
|
+
const { published, other } = await (0, utils_2.filterProductsByStatus)(container, event.data.ids);
|
|
14
|
+
logger.debug(`Algolia sync: Processing ${event.data.ids.length} products - ${published.length} to upsert, ${other.length} to delete`);
|
|
15
|
+
const productsToInsert = published.length
|
|
16
|
+
? await (0, utils_2.findAndTransformAlgoliaProducts)(container, published)
|
|
17
|
+
: [];
|
|
18
|
+
await algolia.batch(framework_1.IndexType.PRODUCT, productsToInsert, other);
|
|
19
|
+
logger.debug(`Algolia sync: Successfully synced ${productsToInsert.length} products`);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
logger.error(`Algolia sync failed for products ${event.data.ids.join(', ')}:`, error);
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
15
25
|
}
|
|
16
26
|
exports.config = {
|
|
17
27
|
event: framework_1.AlgoliaEvents.PRODUCTS_CHANGED,
|
|
18
28
|
context: {
|
|
19
|
-
subscriberId:
|
|
20
|
-
}
|
|
29
|
+
subscriberId: 'algolia-products-changed-handler'
|
|
30
|
+
}
|
|
21
31
|
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb2xpYS1wcm9kdWN0cy1jaGFuZ2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2FsZ29saWEtcHJvZHVjdHMtY2hhbmdlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFXQSxnREFrQ0M7QUE1Q0QscURBQXFFO0FBRXJFLG1EQUE4RDtBQUU5RCxnREFBeUU7QUFDekUsZ0RBRzZCO0FBRWQsS0FBSyxVQUFVLDZCQUE2QixDQUFDLEVBQzFELEtBQUssRUFDTCxTQUFTLEVBQ3lCO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFbEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBdUIsd0JBQWMsQ0FBQyxDQUFBO1FBRXZFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFBLDhCQUFzQixFQUN2RCxTQUFTLEVBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2YsQ0FBQTtRQUVELE1BQU0sQ0FBQyxLQUFLLENBQ1YsNEJBQTRCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sZUFBZSxTQUFTLENBQUMsTUFBTSxlQUFlLEtBQUssQ0FBQyxNQUFNLFlBQVksQ0FDeEgsQ0FBQTtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE1BQU07WUFDdkMsQ0FBQyxDQUFDLE1BQU0sSUFBQSx1Q0FBK0IsRUFBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO1lBQzdELENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFTixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQVMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFL0QsTUFBTSxDQUFDLEtBQUssQ0FDVixxQ0FBcUMsZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQ3hFLENBQUE7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQ1Ysb0NBQW9DLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUNoRSxLQUFLLENBQ04sQ0FBQTtRQUNELE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLHlCQUFhLENBQUMsZ0JBQWdCO0lBQ3JDLE9BQU8sRUFBRTtRQUNQLFlBQVksRUFBRSxrQ0FBa0M7S0FDakQ7Q0FDRixDQUFBIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SubscriberArgs, SubscriberConfig } from
|
|
2
|
-
export default function algoliaProductsDeletedHandler({ event, container
|
|
1
|
+
import { SubscriberArgs, SubscriberConfig } from '@medusajs/framework';
|
|
2
|
+
export default function algoliaProductsDeletedHandler({ event, container }: SubscriberArgs<{
|
|
3
3
|
ids: string[];
|
|
4
4
|
}>): Promise<void>;
|
|
5
5
|
export declare const config: SubscriberConfig;
|
|
@@ -2,16 +2,26 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.config = void 0;
|
|
4
4
|
exports.default = algoliaProductsDeletedHandler;
|
|
5
|
-
const
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const framework_1 = require("@mercurjs/framework");
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const algolia_1 = require("../modules/algolia");
|
|
8
|
+
async function algoliaProductsDeletedHandler({ event, container }) {
|
|
9
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
10
|
+
try {
|
|
11
|
+
const algolia = container.resolve(algolia_1.ALGOLIA_MODULE);
|
|
12
|
+
logger.debug(`Algolia sync: Deleting ${event.data.ids.length} products from index`);
|
|
13
|
+
await algolia.batchDelete(framework_1.IndexType.PRODUCT, event.data.ids);
|
|
14
|
+
logger.debug(`Algolia sync: Successfully deleted products ${event.data.ids.join(', ')}`);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
logger.error(`Algolia delete failed for products ${event.data.ids.join(', ')}:`, error);
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
10
20
|
}
|
|
11
21
|
exports.config = {
|
|
12
22
|
event: framework_1.AlgoliaEvents.PRODUCTS_DELETED,
|
|
13
23
|
context: {
|
|
14
|
-
subscriberId:
|
|
15
|
-
}
|
|
24
|
+
subscriberId: 'algolia-products-deleted-handler'
|
|
25
|
+
}
|
|
16
26
|
};
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb2xpYS1wcm9kdWN0cy1kZWxldGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2FsZ29saWEtcHJvZHVjdHMtZGVsZXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxnREF5QkM7QUEvQkQscURBQXFFO0FBRXJFLG1EQUE4RDtBQUU5RCxnREFBeUU7QUFFMUQsS0FBSyxVQUFVLDZCQUE2QixDQUFDLEVBQzFELEtBQUssRUFDTCxTQUFTLEVBQ3lCO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFbEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBdUIsd0JBQWMsQ0FBQyxDQUFBO1FBRXZFLE1BQU0sQ0FBQyxLQUFLLENBQ1YsMEJBQTBCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sc0JBQXNCLENBQ3RFLENBQUE7UUFFRCxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMscUJBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUU1RCxNQUFNLENBQUMsS0FBSyxDQUNWLCtDQUErQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDM0UsQ0FBQTtJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FDVixzQ0FBc0MsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQ2xFLEtBQUssQ0FDTixDQUFBO1FBQ0QsTUFBTSxLQUFLLENBQUE7SUFDYixDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUseUJBQWEsQ0FBQyxnQkFBZ0I7SUFDckMsT0FBTyxFQUFFO1FBQ1AsWUFBWSxFQUFFLGtDQUFrQztLQUNqRDtDQUNGLENBQUEifQ==
|
|
@@ -5,15 +5,14 @@ exports.findAndTransformAlgoliaProducts = findAndTransformAlgoliaProducts;
|
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const utils_1 = require("@medusajs/framework/utils");
|
|
7
7
|
const framework_1 = require("@mercurjs/framework");
|
|
8
|
-
const utils_2 = require("@medusajs/framework/utils");
|
|
9
8
|
async function selectProductVariantsSupportedCountries(container, product_id) {
|
|
10
9
|
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
10
|
const { data: variants } = await query.graph({
|
|
12
|
-
entity:
|
|
13
|
-
fields: [
|
|
11
|
+
entity: 'product_variant',
|
|
12
|
+
fields: ['inventory_items.inventory.location_levels.location_id'],
|
|
14
13
|
filters: {
|
|
15
|
-
product_id
|
|
16
|
-
}
|
|
14
|
+
product_id
|
|
15
|
+
}
|
|
17
16
|
});
|
|
18
17
|
let location_ids = [];
|
|
19
18
|
for (const variant of variants) {
|
|
@@ -24,16 +23,15 @@ async function selectProductVariantsSupportedCountries(container, product_id) {
|
|
|
24
23
|
location_ids = location_ids.concat(locations);
|
|
25
24
|
}
|
|
26
25
|
const { data: stock_locations } = await query.graph({
|
|
27
|
-
entity:
|
|
28
|
-
fields: [
|
|
26
|
+
entity: 'stock_location',
|
|
27
|
+
fields: ['fulfillment_sets.service_zones.geo_zones.country_code'],
|
|
29
28
|
filters: {
|
|
30
|
-
id: location_ids
|
|
31
|
-
}
|
|
29
|
+
id: location_ids
|
|
30
|
+
}
|
|
32
31
|
});
|
|
33
32
|
let country_codes = [];
|
|
34
33
|
for (const location of stock_locations) {
|
|
35
|
-
const fulfillmentSets = location.fulfillment_sets?.flatMap((set) => set.service_zones || []) ||
|
|
36
|
-
[];
|
|
34
|
+
const fulfillmentSets = location.fulfillment_sets?.flatMap((set) => set.service_zones || []) || [];
|
|
37
35
|
const codes = fulfillmentSets
|
|
38
36
|
.flatMap((sz) => sz.geo_zones || [])
|
|
39
37
|
.map((gz) => gz.country_code);
|
|
@@ -43,41 +41,41 @@ async function selectProductVariantsSupportedCountries(container, product_id) {
|
|
|
43
41
|
}
|
|
44
42
|
async function selectProductSeller(container, product_id) {
|
|
45
43
|
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
46
|
-
const { data: [product]
|
|
47
|
-
entity:
|
|
48
|
-
fields: [
|
|
44
|
+
const { data: [product] } = await query.graph({
|
|
45
|
+
entity: 'product',
|
|
46
|
+
fields: ['seller.id', 'seller.handle', 'seller.store_status'],
|
|
49
47
|
filters: {
|
|
50
|
-
id: product_id
|
|
51
|
-
}
|
|
48
|
+
id: product_id
|
|
49
|
+
}
|
|
52
50
|
});
|
|
53
51
|
return product && product.seller
|
|
54
52
|
? {
|
|
55
53
|
id: product.seller.id,
|
|
56
54
|
handle: product.seller.handle,
|
|
57
|
-
store_status: product.seller.store_status
|
|
55
|
+
store_status: product.seller.store_status
|
|
58
56
|
}
|
|
59
57
|
: null;
|
|
60
58
|
}
|
|
61
59
|
async function filterProductsByStatus(container, ids = []) {
|
|
62
60
|
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
63
61
|
const { data: products } = await query.graph({
|
|
64
|
-
entity:
|
|
65
|
-
fields: [
|
|
62
|
+
entity: 'product',
|
|
63
|
+
fields: ['id', 'status'],
|
|
66
64
|
filters: {
|
|
67
|
-
id: ids
|
|
68
|
-
}
|
|
65
|
+
id: ids
|
|
66
|
+
}
|
|
69
67
|
});
|
|
70
|
-
const published = products.filter((p) => p.status ===
|
|
71
|
-
const
|
|
68
|
+
const published = products.filter((p) => p.status === 'published');
|
|
69
|
+
const notPublished = (0, utils_1.arrayDifference)(products, published);
|
|
70
|
+
const existingIds = new Set(products.map((p) => p.id));
|
|
71
|
+
const deletedIds = ids.filter((id) => !existingIds.has(id));
|
|
72
72
|
return {
|
|
73
73
|
published: published.map((p) => p.id),
|
|
74
|
-
other:
|
|
74
|
+
other: [...notPublished.map((p) => p.id), ...deletedIds]
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
77
|
async function findAndTransformAlgoliaProducts(container, ids = []) {
|
|
78
78
|
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
79
|
-
const regionService = container.resolve(utils_2.Modules.REGION);
|
|
80
|
-
const [region] = await regionService.listRegions();
|
|
81
79
|
const { data: products } = await query.graph({
|
|
82
80
|
entity: 'product',
|
|
83
81
|
fields: [
|
|
@@ -110,8 +108,9 @@ async function findAndTransformAlgoliaProducts(container, ids = []) {
|
|
|
110
108
|
product.average_rating = 0;
|
|
111
109
|
product.supported_countries = await selectProductVariantsSupportedCountries(container, product.id);
|
|
112
110
|
product.seller = await selectProductSeller(container, product.id);
|
|
113
|
-
product.options = product.options
|
|
114
|
-
|
|
111
|
+
product.options = (product.options ?? [])
|
|
112
|
+
.filter((option) => option?.title && option?.values)
|
|
113
|
+
.map((option) => {
|
|
115
114
|
return option.values.map((value) => {
|
|
116
115
|
const entry = {};
|
|
117
116
|
entry[option.title.toLowerCase()] = value.value;
|
|
@@ -119,24 +118,30 @@ async function findAndTransformAlgoliaProducts(container, ids = []) {
|
|
|
119
118
|
});
|
|
120
119
|
})
|
|
121
120
|
.flat();
|
|
122
|
-
product.variants = zod_1.z
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
121
|
+
product.variants = zod_1.z
|
|
122
|
+
.array(framework_1.AlgoliaVariantValidator)
|
|
123
|
+
.parse(product.variants ?? []);
|
|
124
|
+
product.variants = (product.variants ?? [])
|
|
125
|
+
.map((variant) => {
|
|
126
|
+
return (variant.options ?? []).reduce((entry, item) => {
|
|
127
|
+
if (item?.option?.title) {
|
|
128
|
+
entry[item.option.title.toLowerCase()] = item.value;
|
|
129
|
+
}
|
|
127
130
|
return entry;
|
|
128
131
|
}, variant);
|
|
129
132
|
})
|
|
130
133
|
.flat();
|
|
131
|
-
product.attribute_values = product.attribute_values
|
|
134
|
+
product.attribute_values = (product.attribute_values ?? [])
|
|
135
|
+
.filter((attrValue) => attrValue && attrValue.attribute && attrValue.attribute.name)
|
|
136
|
+
.map((attrValue) => {
|
|
132
137
|
return {
|
|
133
|
-
name:
|
|
134
|
-
value:
|
|
135
|
-
is_filterable:
|
|
136
|
-
ui_component:
|
|
138
|
+
name: attrValue.attribute.name,
|
|
139
|
+
value: attrValue.value,
|
|
140
|
+
is_filterable: attrValue.attribute.is_filterable,
|
|
141
|
+
ui_component: attrValue.attribute.ui_component
|
|
137
142
|
};
|
|
138
143
|
});
|
|
139
144
|
}
|
|
140
145
|
return zod_1.z.array(framework_1.AlgoliaProductValidator).parse(products);
|
|
141
146
|
}
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb2xpYS1wcm9kdWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL3V0aWxzL2FsZ29saWEtcHJvZHVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVGQSx3REF5QkM7QUFFRCwwRUFvRkM7QUF0TUQsNkJBQXVCO0FBR3ZCLHFEQUdrQztBQUdsQyxtREFHNEI7QUFFNUIsS0FBSyxVQUFVLHVDQUF1QyxDQUNwRCxTQUEwQixFQUMxQixVQUFrQjtJQUVsQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxpQkFBaUI7UUFDekIsTUFBTSxFQUFFLENBQUMsdURBQXVELENBQUM7UUFDakUsT0FBTyxFQUFFO1lBQ1AsVUFBVTtTQUNYO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO0lBRXJCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsTUFBTSxlQUFlLEdBQ25CLE9BQU8sQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzlELE1BQU0sU0FBUyxHQUFHLGVBQWU7YUFDOUIsT0FBTyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQzthQUNqRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUVwQyxZQUFZLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUMv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
|