pim-import 5.0.1 → 5.0.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/dist/algolia/clean.js +0 -1
- package/dist/algolia/config.js +0 -1
- package/dist/algolia/downloads.js +0 -1
- package/dist/algolia/families.js +0 -1
- package/dist/algolia/inspirations.js +0 -1
- package/dist/algolia/models.js +0 -1
- package/dist/algolia/news.js +0 -1
- package/dist/algolia/pressRelease.js +0 -1
- package/dist/algolia/pressReview.js +0 -1
- package/dist/algolia/products.js +0 -1
- package/dist/algolia/projects.js +0 -1
- package/dist/algolia/stories.js +0 -1
- package/dist/algolia/subFamilies.js +0 -1
- package/dist/algolia/subModels.js +0 -1
- package/dist/browser.js +0 -1
- package/dist/downloads/classes/manageEntry.js +0 -1
- package/dist/downloads/import.js +0 -1
- package/dist/index.js +0 -1
- package/dist/libs/contentful-cda.js +0 -1
- package/dist/libs/contentful.js +0 -1
- package/dist/libs/imgix.js +0 -1
- package/dist/libs/logs.js +0 -1
- package/dist/libs/netlify.js +0 -1
- package/dist/libs/notifications.js +0 -1
- package/dist/libs/pdf.js +0 -1
- package/dist/libs/s3.js +0 -1
- package/dist/libs/sentry.js +0 -1
- package/dist/pim/config.js +0 -1
- package/dist/pim/endpoints.js +0 -1
- package/dist/pim/methods/bulkPublish.js +0 -1
- package/dist/pim/methods/catalogs.js +0 -1
- package/dist/pim/methods/checkTopicDraftAndPagePublished.js +0 -1
- package/dist/pim/methods/designers.js +0 -1
- package/dist/pim/methods/dictionary.js +0 -1
- package/dist/pim/methods/families.js +0 -1
- package/dist/pim/methods/latestProducts.js +0 -1
- package/dist/pim/methods/migrateEntryFields.js +0 -1
- package/dist/pim/methods/models.js +0 -1
- package/dist/pim/methods/pages/catalogs.js +0 -1
- package/dist/pim/methods/pages/families.js +0 -1
- package/dist/pim/methods/pages/subfamilies.js +0 -1
- package/dist/pim/methods/products.js +0 -1
- package/dist/pim/methods/subfamilies.js +0 -1
- package/dist/pim/methods/submodels.js +0 -1
- package/dist/pim/request.js +0 -1
- package/dist/resources/AllProducts.js +0 -1
- package/dist/resources/Audit.js +0 -1
- package/dist/resources/CatalogDetails.js +0 -1
- package/dist/resources/CollectionModels.js +0 -1
- package/dist/resources/CollectionSubFamilies.js +0 -1
- package/dist/resources/CollectionSubModels.js +0 -1
- package/dist/resources/DProductSubLine.js +0 -1
- package/dist/resources/FamilyDetails.js +0 -1
- package/dist/resources/ProductDetails.js +0 -1
- package/dist/resources/ProductRelation.js +0 -1
- package/dist/resources/cfFields.js +0 -1
- package/dist/types.js +0 -1
- package/dist/utils.js +0 -1
- package/package.json +7 -2
- package/.env.example +0 -45
- package/.nvmrc +0 -1
- package/.vscode/settings.json +0 -21
- package/dist/algolia/clean.js.map +0 -1
- package/dist/algolia/config.js.map +0 -1
- package/dist/algolia/downloads.js.map +0 -1
- package/dist/algolia/families.js.map +0 -1
- package/dist/algolia/inspirations.js.map +0 -1
- package/dist/algolia/models.js.map +0 -1
- package/dist/algolia/news.js.map +0 -1
- package/dist/algolia/pressRelease.js.map +0 -1
- package/dist/algolia/pressReview.js.map +0 -1
- package/dist/algolia/products.js.map +0 -1
- package/dist/algolia/projects.js.map +0 -1
- package/dist/algolia/stories.js.map +0 -1
- package/dist/algolia/subFamilies.js.map +0 -1
- package/dist/algolia/subModels.js.map +0 -1
- package/dist/browser.js.map +0 -1
- package/dist/downloads/classes/manageEntry.js.map +0 -1
- package/dist/downloads/import.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/libs/contentful-cda.js.map +0 -1
- package/dist/libs/contentful.js.map +0 -1
- package/dist/libs/imgix.js.map +0 -1
- package/dist/libs/logs.js.map +0 -1
- package/dist/libs/netlify.js.map +0 -1
- package/dist/libs/notifications.js.map +0 -1
- package/dist/libs/pdf.js.map +0 -1
- package/dist/libs/s3.js.map +0 -1
- package/dist/libs/sentry.js.map +0 -1
- package/dist/pim/config.js.map +0 -1
- package/dist/pim/endpoints.js.map +0 -1
- package/dist/pim/methods/bulkPublish.js.map +0 -1
- package/dist/pim/methods/catalogs.js.map +0 -1
- package/dist/pim/methods/checkTopicDraftAndPagePublished.js.map +0 -1
- package/dist/pim/methods/designers.js.map +0 -1
- package/dist/pim/methods/dictionary.js.map +0 -1
- package/dist/pim/methods/families.js.map +0 -1
- package/dist/pim/methods/latestProducts.js.map +0 -1
- package/dist/pim/methods/migrateEntryFields.js.map +0 -1
- package/dist/pim/methods/models.js.map +0 -1
- package/dist/pim/methods/pages/catalogs.js.map +0 -1
- package/dist/pim/methods/pages/families.js.map +0 -1
- package/dist/pim/methods/pages/subfamilies.js.map +0 -1
- package/dist/pim/methods/products.js.map +0 -1
- package/dist/pim/methods/subfamilies.js.map +0 -1
- package/dist/pim/methods/submodels.js.map +0 -1
- package/dist/pim/request.js.map +0 -1
- package/dist/resources/AllProducts.js.map +0 -1
- package/dist/resources/Audit.js.map +0 -1
- package/dist/resources/CatalogDetails.js.map +0 -1
- package/dist/resources/CollectionModels.js.map +0 -1
- package/dist/resources/CollectionSubFamilies.js.map +0 -1
- package/dist/resources/CollectionSubModels.js.map +0 -1
- package/dist/resources/DProductSubLine.js.map +0 -1
- package/dist/resources/FamilyDetails.js.map +0 -1
- package/dist/resources/ProductDetails.js.map +0 -1
- package/dist/resources/ProductRelation.js.map +0 -1
- package/dist/resources/cfFields.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.js.map +0 -1
- package/docs/import-data-from-the-dictionary.md +0 -83
- package/docs/import-products.md +0 -61
- package/docs/import-taxonomies-from-the-catalog.md +0 -60
- package/docs/settings.md +0 -47
- package/jest.config.js +0 -16
- package/local-fn/reindex.js +0 -182
- package/src/algolia/clean.ts +0 -164
- package/src/algolia/config.ts +0 -390
- package/src/algolia/downloads.ts +0 -346
- package/src/algolia/families.ts +0 -652
- package/src/algolia/inspirations.ts +0 -315
- package/src/algolia/models.ts +0 -589
- package/src/algolia/news.ts +0 -258
- package/src/algolia/pressRelease.ts +0 -255
- package/src/algolia/pressReview.ts +0 -247
- package/src/algolia/products.ts +0 -731
- package/src/algolia/projects.ts +0 -339
- package/src/algolia/stories.ts +0 -347
- package/src/algolia/subFamilies.ts +0 -709
- package/src/algolia/subModels.ts +0 -359
- package/src/browser.ts +0 -122
- package/src/downloads/classes/manageEntry.ts +0 -99
- package/src/downloads/csv/legal.csv +0 -5
- package/src/downloads/csv/products.csv +0 -373
- package/src/downloads/import.ts +0 -381
- package/src/index.ts +0 -140
- package/src/libs/contentful-cda.ts +0 -543
- package/src/libs/contentful.ts +0 -1453
- package/src/libs/imgix.ts +0 -297
- package/src/libs/logs.ts +0 -121
- package/src/libs/netlify.ts +0 -37
- package/src/libs/notifications.ts +0 -104
- package/src/libs/pdf.ts +0 -107
- package/src/libs/s3.ts +0 -305
- package/src/libs/sentry.ts +0 -33
- package/src/pim/config.ts +0 -84
- package/src/pim/data/productFields.json +0 -1178
- package/src/pim/endpoints.ts +0 -364
- package/src/pim/methods/bulkPublish.ts +0 -266
- package/src/pim/methods/catalogs.ts +0 -586
- package/src/pim/methods/checkTopicDraftAndPagePublished.ts +0 -70
- package/src/pim/methods/designers.ts +0 -128
- package/src/pim/methods/dictionary.ts +0 -611
- package/src/pim/methods/families.ts +0 -345
- package/src/pim/methods/latestProducts.ts +0 -70
- package/src/pim/methods/migrateEntryFields.ts +0 -99
- package/src/pim/methods/models.ts +0 -349
- package/src/pim/methods/pages/catalogs.ts +0 -28
- package/src/pim/methods/pages/families.ts +0 -50
- package/src/pim/methods/pages/subfamilies.ts +0 -98
- package/src/pim/methods/products.ts +0 -3297
- package/src/pim/methods/subfamilies.ts +0 -706
- package/src/pim/methods/submodels.ts +0 -262
- package/src/pim/request.ts +0 -61
- package/src/resources/AllProducts.ts +0 -41
- package/src/resources/Audit.ts +0 -24
- package/src/resources/CatalogDetails.ts +0 -51
- package/src/resources/CollectionModels.ts +0 -42
- package/src/resources/CollectionSubFamilies.ts +0 -45
- package/src/resources/CollectionSubModels.ts +0 -36
- package/src/resources/DProductSubLine.ts +0 -34
- package/src/resources/FamilyDetails.ts +0 -31
- package/src/resources/ProductDetails.ts +0 -352
- package/src/resources/ProductRelation.ts +0 -24
- package/src/resources/cfFields.ts +0 -8
- package/src/types.ts +0 -268
- package/src/utils.ts +0 -553
- package/tsconfig.json +0 -93
- package/tslint.json +0 -22
- package/types/libs/puppeteer.d.ts +0 -17
- package/types/pim/methods/checkIp.d.ts +0 -1
- /package/{types → dist}/algolia/clean.d.ts +0 -0
- /package/{types → dist}/algolia/config.d.ts +0 -0
- /package/{types → dist}/algolia/downloads.d.ts +0 -0
- /package/{types → dist}/algolia/families.d.ts +0 -0
- /package/{types → dist}/algolia/inspirations.d.ts +0 -0
- /package/{types → dist}/algolia/models.d.ts +0 -0
- /package/{types → dist}/algolia/news.d.ts +0 -0
- /package/{types → dist}/algolia/pressRelease.d.ts +0 -0
- /package/{types → dist}/algolia/pressReview.d.ts +0 -0
- /package/{types → dist}/algolia/products.d.ts +0 -0
- /package/{types → dist}/algolia/projects.d.ts +0 -0
- /package/{types → dist}/algolia/stories.d.ts +0 -0
- /package/{types → dist}/algolia/subFamilies.d.ts +0 -0
- /package/{types → dist}/algolia/subModels.d.ts +0 -0
- /package/{types → dist}/browser.d.ts +0 -0
- /package/{types → dist}/downloads/classes/manageEntry.d.ts +0 -0
- /package/{types → dist}/downloads/import.d.ts +0 -0
- /package/{types → dist}/index.d.ts +0 -0
- /package/{types → dist}/libs/contentful-cda.d.ts +0 -0
- /package/{types → dist}/libs/contentful.d.ts +0 -0
- /package/{types → dist}/libs/imgix.d.ts +0 -0
- /package/{types → dist}/libs/logs.d.ts +0 -0
- /package/{types → dist}/libs/netlify.d.ts +0 -0
- /package/{types → dist}/libs/notifications.d.ts +0 -0
- /package/{types → dist}/libs/pdf.d.ts +0 -0
- /package/{types → dist}/libs/s3.d.ts +0 -0
- /package/{types → dist}/libs/sentry.d.ts +0 -0
- /package/{types → dist}/pim/config.d.ts +0 -0
- /package/{types → dist}/pim/endpoints.d.ts +0 -0
- /package/{types → dist}/pim/methods/bulkPublish.d.ts +0 -0
- /package/{types → dist}/pim/methods/catalogs.d.ts +0 -0
- /package/{types → dist}/pim/methods/checkTopicDraftAndPagePublished.d.ts +0 -0
- /package/{types → dist}/pim/methods/designers.d.ts +0 -0
- /package/{types → dist}/pim/methods/dictionary.d.ts +0 -0
- /package/{types → dist}/pim/methods/families.d.ts +0 -0
- /package/{types → dist}/pim/methods/latestProducts.d.ts +0 -0
- /package/{types → dist}/pim/methods/migrateEntryFields.d.ts +0 -0
- /package/{types → dist}/pim/methods/models.d.ts +0 -0
- /package/{types → dist}/pim/methods/pages/catalogs.d.ts +0 -0
- /package/{types → dist}/pim/methods/pages/families.d.ts +0 -0
- /package/{types → dist}/pim/methods/pages/subfamilies.d.ts +0 -0
- /package/{types → dist}/pim/methods/products.d.ts +0 -0
- /package/{types → dist}/pim/methods/subfamilies.d.ts +0 -0
- /package/{types → dist}/pim/methods/submodels.d.ts +0 -0
- /package/{types → dist}/pim/request.d.ts +0 -0
- /package/{types → dist}/resources/AllProducts.d.ts +0 -0
- /package/{types → dist}/resources/Audit.d.ts +0 -0
- /package/{types → dist}/resources/CatalogDetails.d.ts +0 -0
- /package/{types → dist}/resources/CollectionModels.d.ts +0 -0
- /package/{types → dist}/resources/CollectionSubFamilies.d.ts +0 -0
- /package/{types → dist}/resources/CollectionSubModels.d.ts +0 -0
- /package/{types → dist}/resources/DProductSubLine.d.ts +0 -0
- /package/{types → dist}/resources/FamilyDetails.d.ts +0 -0
- /package/{types → dist}/resources/ProductDetails.d.ts +0 -0
- /package/{types → dist}/resources/ProductRelation.d.ts +0 -0
- /package/{types → dist}/resources/cfFields.d.ts +0 -0
- /package/{types → dist}/types.d.ts +0 -0
- /package/{types → dist}/utils.d.ts +0 -0
package/src/algolia/models.ts
DELETED
|
@@ -1,589 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Model index
|
|
3
|
-
*/
|
|
4
|
-
import {
|
|
5
|
-
getClient,
|
|
6
|
-
getEnvironmentDefaultLocaleCode,
|
|
7
|
-
getEntryByID,
|
|
8
|
-
getAllEntries,
|
|
9
|
-
getTopicDetails,
|
|
10
|
-
} from "../libs/contentful-cda";
|
|
11
|
-
import {
|
|
12
|
-
CfLocalizedEntryField,
|
|
13
|
-
TopicDetailsResponse,
|
|
14
|
-
AlgoliaPaginateRecords,
|
|
15
|
-
AvailableCatalogs,
|
|
16
|
-
WrapperImageFields,
|
|
17
|
-
} from "../types";
|
|
18
|
-
import { log, serverUtils } from "../libs/logs";
|
|
19
|
-
import { getIndex, AvailableIndicesKey, removeIndexObject } from "./config";
|
|
20
|
-
import type { Entry } from "contentful-management/dist/typings/entities/entry";
|
|
21
|
-
import {
|
|
22
|
-
getLocalISOTime,
|
|
23
|
-
secondBetweenTwoDate,
|
|
24
|
-
capitalizeFirstLetter,
|
|
25
|
-
keysToLowerCase,
|
|
26
|
-
getAllTranslations,
|
|
27
|
-
addProductFieldValueCodesByPimDetails,
|
|
28
|
-
getCertificationFilters,
|
|
29
|
-
} from "../utils";
|
|
30
|
-
import { getWrapperImgixFields } from "../libs/imgix";
|
|
31
|
-
|
|
32
|
-
const indexKey: AvailableIndicesKey = "models";
|
|
33
|
-
const topicModelSelect =
|
|
34
|
-
"fields.name,fields.code,fields.description,fields.thumbnailImgix,fields.productFieldFilter,fields.productLine,fields.catalog,fields.subFamily,fields.priority,fields.designer";
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
*
|
|
38
|
-
* Singolo record
|
|
39
|
-
* - names
|
|
40
|
-
* - code
|
|
41
|
-
* - description - se conincide con l'autodescription, capire come generarla
|
|
42
|
-
* - thumbnailImgix
|
|
43
|
-
* - productFieldFilter
|
|
44
|
-
* - productLine
|
|
45
|
-
* - catalog
|
|
46
|
-
* - subFamily
|
|
47
|
-
* - priority
|
|
48
|
-
* - colors - colori disponibili tra i prodotti associati a questo model
|
|
49
|
-
*/
|
|
50
|
-
type AlgoliaModelRecord = {
|
|
51
|
-
objectID: string;
|
|
52
|
-
names?: CfLocalizedEntryField;
|
|
53
|
-
code?: string;
|
|
54
|
-
slugs?: {};
|
|
55
|
-
isProtected?: boolean;
|
|
56
|
-
description?: string;
|
|
57
|
-
autodescription?: string;
|
|
58
|
-
thumbnailImgix?: WrapperImageFields | {};
|
|
59
|
-
productFieldFilter?: string;
|
|
60
|
-
productFields?: string[];
|
|
61
|
-
productLine?: TopicDetailsResponse;
|
|
62
|
-
catalogs?: TopicDetailsResponse[];
|
|
63
|
-
catalog?: TopicDetailsResponse;
|
|
64
|
-
subFamily?: TopicDetailsResponse;
|
|
65
|
-
isNew?: boolean;
|
|
66
|
-
priority?: number;
|
|
67
|
-
colors?: string[];
|
|
68
|
-
designer?: TopicDetailsResponse;
|
|
69
|
-
lastSyncDate?: string;
|
|
70
|
-
destinations?: string[];
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* TODO: Definire la logica con cui ottenere da più prodotti un unica description, non avendo più a disposizione la description dei gruppi un tempo fornita dall'apposito endpoint
|
|
75
|
-
* @param productLineCode
|
|
76
|
-
* @returns
|
|
77
|
-
*/
|
|
78
|
-
const getModelAutodescription = async (productLineCode: string) => {
|
|
79
|
-
// switch (productLineCode) {
|
|
80
|
-
// case "PLINE6": // Soft Plate
|
|
81
|
-
// case "PLINE5": // Light Bulb
|
|
82
|
-
// case "PLINE3": // Driver
|
|
83
|
-
// case "PLINE2": // Accessory
|
|
84
|
-
// // post_content
|
|
85
|
-
// break;
|
|
86
|
-
// case "PLINE1": // Light Module
|
|
87
|
-
// /*
|
|
88
|
-
// let description;
|
|
89
|
-
// if(electrical.lampCategories){
|
|
90
|
-
// description += electrical.lampCategories
|
|
91
|
-
// }
|
|
92
|
-
|
|
93
|
-
// if(electrical.wPower && catalog === "ARCHITECTURAL"){
|
|
94
|
-
// description += electrical.wPower
|
|
95
|
-
// }
|
|
96
|
-
|
|
97
|
-
// if(optical.numberOfHeads && optical.numberOfHeads > 1 && photometric.realNetFlow && catalog === "ARCHITECTURAL"){
|
|
98
|
-
// description += optical.numberOfHeads . " x " . photometric.realNetFlow;
|
|
99
|
-
// }else if(photometric.realNetFlow && catalog === "ARCHITECTURAL"){
|
|
100
|
-
// description += photometric.realNetFlow;
|
|
101
|
-
// }
|
|
102
|
-
|
|
103
|
-
// if(photometric.temperatureColor){
|
|
104
|
-
// description += photometric.temperatureColor;
|
|
105
|
-
// }
|
|
106
|
-
|
|
107
|
-
// if(photometric.cri){
|
|
108
|
-
// description += "CRI " + photometric.cri;
|
|
109
|
-
// }
|
|
110
|
-
|
|
111
|
-
// if (photometric.beam0_180 && catalog == "OUTDOOR"){
|
|
112
|
-
// description += "BEAM " + photometric.beam0_180;
|
|
113
|
-
// }
|
|
114
|
-
// */
|
|
115
|
-
// break;
|
|
116
|
-
// default:
|
|
117
|
-
// let description;
|
|
118
|
-
// if (physical.length) {
|
|
119
|
-
// description += physical.length;
|
|
120
|
-
// }
|
|
121
|
-
// if (mountings) {
|
|
122
|
-
// description += mountings;
|
|
123
|
-
// }
|
|
124
|
-
|
|
125
|
-
// // Profile and others
|
|
126
|
-
// break;
|
|
127
|
-
// }
|
|
128
|
-
|
|
129
|
-
return (
|
|
130
|
-
"TODO: definire autodescription model. ProductLine: " + productLineCode
|
|
131
|
-
);
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
const isObjectToDelete = (
|
|
135
|
-
object: any,
|
|
136
|
-
defaultEnvironmentLocaleCode: string
|
|
137
|
-
) => {
|
|
138
|
-
return (
|
|
139
|
-
!object?.slugs?.[defaultEnvironmentLocaleCode] || !object?.subFamily?.code
|
|
140
|
-
);
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
const getObject = async (
|
|
144
|
-
topicModel: string | Entry
|
|
145
|
-
): Promise<AlgoliaModelRecord> => {
|
|
146
|
-
const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
|
|
147
|
-
const topicModelId =
|
|
148
|
-
typeof topicModel === "string" ? topicModel : topicModel?.sys.id;
|
|
149
|
-
|
|
150
|
-
if (!topicModelId) {
|
|
151
|
-
log(`The topicModelId not found`, "ERROR");
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
log(`Get details of the ${topicModelId} topicModel`);
|
|
155
|
-
const topicModelWithFields = await getEntryByID(topicModelId, "topicModel");
|
|
156
|
-
if (!topicModelWithFields) {
|
|
157
|
-
log(`The topicModel with id ${topicModelId} not found`, "WARN");
|
|
158
|
-
return { objectID: topicModelId };
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
log(`Get model page details...`);
|
|
162
|
-
const modelPageId = `${topicModelId}_PAGE`;
|
|
163
|
-
const modelPage = await getEntryByID(
|
|
164
|
-
modelPageId,
|
|
165
|
-
"page",
|
|
166
|
-
"fields.slug,fields.type,fields.protected"
|
|
167
|
-
);
|
|
168
|
-
const slugs = await getAllTranslations(modelPage?.fields?.slug || {});
|
|
169
|
-
const isProtected =
|
|
170
|
-
!!modelPage?.fields?.protected?.[defaultEnvironmentLocaleCode];
|
|
171
|
-
|
|
172
|
-
log(`Get catalogs details...`);
|
|
173
|
-
const catalogs = await getTopicDetails(
|
|
174
|
-
topicModelWithFields,
|
|
175
|
-
"catalog",
|
|
176
|
-
"topicCatalog"
|
|
177
|
-
);
|
|
178
|
-
log(`${catalogs?.length} catalogs founded`);
|
|
179
|
-
const catalog = catalogs?.[0];
|
|
180
|
-
const catalogId = catalog?.code;
|
|
181
|
-
if (!catalogId) {
|
|
182
|
-
log(
|
|
183
|
-
`catalog not found for the topicModel ${topicModelWithFields.sys.id}`,
|
|
184
|
-
"WARN"
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
log(`Get productLine details...`);
|
|
189
|
-
const productLines = await getTopicDetails(
|
|
190
|
-
topicModelWithFields,
|
|
191
|
-
"productLine",
|
|
192
|
-
"topicProductLine"
|
|
193
|
-
);
|
|
194
|
-
const productLine = productLines?.[0];
|
|
195
|
-
|
|
196
|
-
log(`Get subFamily details...`);
|
|
197
|
-
const subFamilies = await getTopicDetails(
|
|
198
|
-
topicModelWithFields,
|
|
199
|
-
"subFamily",
|
|
200
|
-
"topicSubFamily",
|
|
201
|
-
true,
|
|
202
|
-
true,
|
|
203
|
-
false,
|
|
204
|
-
"thumbnailImgix"
|
|
205
|
-
);
|
|
206
|
-
const subFamily = subFamilies?.[0];
|
|
207
|
-
|
|
208
|
-
log(`Get designer details...`);
|
|
209
|
-
let designer;
|
|
210
|
-
if (topicModelWithFields.fields.designer) {
|
|
211
|
-
const designers = await getTopicDetails(
|
|
212
|
-
topicModelWithFields,
|
|
213
|
-
"designer",
|
|
214
|
-
"topicDesigner",
|
|
215
|
-
false,
|
|
216
|
-
true,
|
|
217
|
-
true
|
|
218
|
-
);
|
|
219
|
-
designer = designers?.[0];
|
|
220
|
-
} else if (subFamily?.code) {
|
|
221
|
-
const topicSubFamily = await getEntryByID(
|
|
222
|
-
subFamily.code,
|
|
223
|
-
"topicSubFamily",
|
|
224
|
-
"fields.designer"
|
|
225
|
-
);
|
|
226
|
-
if (
|
|
227
|
-
topicSubFamily?.fields?.designer?.[defaultEnvironmentLocaleCode]?.sys?.id
|
|
228
|
-
) {
|
|
229
|
-
const designers = await getTopicDetails(
|
|
230
|
-
topicSubFamily,
|
|
231
|
-
"designer",
|
|
232
|
-
"topicDesigner",
|
|
233
|
-
false,
|
|
234
|
-
true,
|
|
235
|
-
true
|
|
236
|
-
);
|
|
237
|
-
designer = designers?.[0];
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
log(`Get thumbnail imgix details...`);
|
|
242
|
-
let thumbnailImgix = {};
|
|
243
|
-
const thumbnailImgixWrapperImgixID =
|
|
244
|
-
topicModelWithFields?.fields?.thumbnailImgix?.[defaultEnvironmentLocaleCode]
|
|
245
|
-
?.sys.id;
|
|
246
|
-
if (thumbnailImgixWrapperImgixID) {
|
|
247
|
-
thumbnailImgix = await getWrapperImgixFields(thumbnailImgixWrapperImgixID);
|
|
248
|
-
} else {
|
|
249
|
-
log(`No thumbnail imgix found`, "WARN");
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
log(`Get colors details...`);
|
|
253
|
-
const colors: string[] = [];
|
|
254
|
-
let productFields: any = {};
|
|
255
|
-
productFields.availableTo = [];
|
|
256
|
-
if (catalogId) {
|
|
257
|
-
const topicProducts = await getAllEntries(
|
|
258
|
-
"topicProduct",
|
|
259
|
-
"sys,fields.productFields",
|
|
260
|
-
`fields.models${capitalizeFirstLetter(catalogId)}.sys.id[in]`,
|
|
261
|
-
topicModelWithFields.sys.id
|
|
262
|
-
);
|
|
263
|
-
topicProducts.forEach((topicProduct) => {
|
|
264
|
-
const pimDetails =
|
|
265
|
-
topicProduct?.fields?.productFields?.[defaultEnvironmentLocaleCode];
|
|
266
|
-
const productColor = pimDetails?.mainColour?.code;
|
|
267
|
-
if (productColor && colors.indexOf(productColor) === -1) {
|
|
268
|
-
colors.push(productColor);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
log(`Get productField details...`);
|
|
272
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
273
|
-
pimDetails,
|
|
274
|
-
productFields,
|
|
275
|
-
"destinations"
|
|
276
|
-
);
|
|
277
|
-
|
|
278
|
-
// AVAILABLE TO
|
|
279
|
-
if (
|
|
280
|
-
pimDetails.visibleToShop &&
|
|
281
|
-
!productFields.availableTo.includes("visibleToShop")
|
|
282
|
-
) {
|
|
283
|
-
productFields.availableTo.push("visibleToShop");
|
|
284
|
-
}
|
|
285
|
-
if (
|
|
286
|
-
pimDetails.quickDelivery &&
|
|
287
|
-
!productFields.availableTo.includes("quickDelivery")
|
|
288
|
-
) {
|
|
289
|
-
productFields.availableTo.push("quickDelivery");
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// LOCATIONS [Has many]
|
|
293
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
294
|
-
pimDetails,
|
|
295
|
-
productFields,
|
|
296
|
-
"locations"
|
|
297
|
-
);
|
|
298
|
-
|
|
299
|
-
// SHAPE
|
|
300
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
301
|
-
pimDetails,
|
|
302
|
-
productFields,
|
|
303
|
-
"shapes",
|
|
304
|
-
"physical"
|
|
305
|
-
);
|
|
306
|
-
|
|
307
|
-
// | PIM bucketColours [Has many]
|
|
308
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
309
|
-
pimDetails,
|
|
310
|
-
productFields,
|
|
311
|
-
"bucketColours"
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
// LENGTH (MM)
|
|
315
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
316
|
-
pimDetails,
|
|
317
|
-
productFields,
|
|
318
|
-
"length",
|
|
319
|
-
"physical"
|
|
320
|
-
);
|
|
321
|
-
|
|
322
|
-
// LENGTH (IN)
|
|
323
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
324
|
-
pimDetails,
|
|
325
|
-
productFields,
|
|
326
|
-
"length_us",
|
|
327
|
-
"physical"
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
// MOUNTINGS [Has many]
|
|
331
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
332
|
-
pimDetails,
|
|
333
|
-
productFields,
|
|
334
|
-
"mountings"
|
|
335
|
-
);
|
|
336
|
-
|
|
337
|
-
// ORINTATIONS [Has many]
|
|
338
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
339
|
-
pimDetails,
|
|
340
|
-
productFields,
|
|
341
|
-
"orientations",
|
|
342
|
-
"physical"
|
|
343
|
-
);
|
|
344
|
-
|
|
345
|
-
// OPTICAL TYPE [Only one]
|
|
346
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
347
|
-
pimDetails,
|
|
348
|
-
productFields,
|
|
349
|
-
"opticalType",
|
|
350
|
-
"optical"
|
|
351
|
-
);
|
|
352
|
-
|
|
353
|
-
// POWER (W) | PIM wPower
|
|
354
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
355
|
-
pimDetails,
|
|
356
|
-
productFields,
|
|
357
|
-
"wPower",
|
|
358
|
-
"electrical"
|
|
359
|
-
);
|
|
360
|
-
|
|
361
|
-
// System flux (lm) | PIM realNetFlow
|
|
362
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
363
|
-
pimDetails,
|
|
364
|
-
productFields,
|
|
365
|
-
"realNetFlow",
|
|
366
|
-
"photometric"
|
|
367
|
-
);
|
|
368
|
-
|
|
369
|
-
// CCT (K) [Only one] | PIM temperatureColor
|
|
370
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
371
|
-
pimDetails,
|
|
372
|
-
productFields,
|
|
373
|
-
"temperatureColor",
|
|
374
|
-
"photometric"
|
|
375
|
-
);
|
|
376
|
-
|
|
377
|
-
// CRI> [Only one]
|
|
378
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
379
|
-
pimDetails,
|
|
380
|
-
productFields,
|
|
381
|
-
"cri",
|
|
382
|
-
"photometric"
|
|
383
|
-
);
|
|
384
|
-
|
|
385
|
-
// DRIVER TYPE | PIM powerSupplyType [Has many]
|
|
386
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
387
|
-
pimDetails,
|
|
388
|
-
productFields,
|
|
389
|
-
"powerSupplyType",
|
|
390
|
-
"electrical"
|
|
391
|
-
);
|
|
392
|
-
|
|
393
|
-
// IP
|
|
394
|
-
productFields = addProductFieldValueCodesByPimDetails(
|
|
395
|
-
pimDetails,
|
|
396
|
-
productFields,
|
|
397
|
-
"ipRating",
|
|
398
|
-
"marking"
|
|
399
|
-
);
|
|
400
|
-
|
|
401
|
-
// log(`Get certificationFilters details...`);
|
|
402
|
-
productFields.certificationFilters = getCertificationFilters(pimDetails);
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
const allDestinations =
|
|
406
|
-
topicModelWithFields?.fields?.destinations?.[
|
|
407
|
-
defaultEnvironmentLocaleCode
|
|
408
|
-
] || [];
|
|
409
|
-
productFields.totalProducts = {};
|
|
410
|
-
for (const destination of allDestinations) {
|
|
411
|
-
productFields.totalProducts[destination] = topicProducts.filter(
|
|
412
|
-
(topicProductEntry) =>
|
|
413
|
-
topicProductEntry?.fields?.productFields?.[
|
|
414
|
-
defaultEnvironmentLocaleCode
|
|
415
|
-
]?.destinations?.find(
|
|
416
|
-
(productDestination: any) => productDestination.code === destination
|
|
417
|
-
)
|
|
418
|
-
).length;
|
|
419
|
-
}
|
|
420
|
-
} else {
|
|
421
|
-
log(`I cannot get the colors because there is no catalog`, "WARN");
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
log(`Get autodescription details...`);
|
|
425
|
-
const autodescription = await getModelAutodescription(productLine.code);
|
|
426
|
-
|
|
427
|
-
/*
|
|
428
|
-
|
|
429
|
-
* - names
|
|
430
|
-
* - code
|
|
431
|
-
* - description
|
|
432
|
-
* - autodescription
|
|
433
|
-
* - thumbnailImgix
|
|
434
|
-
* - productFieldFilter
|
|
435
|
-
* - productLine
|
|
436
|
-
* - catalog
|
|
437
|
-
* - subFamily
|
|
438
|
-
* - priority
|
|
439
|
-
* - colors - colori disponibili tra i prodotti associati a questo model
|
|
440
|
-
*/
|
|
441
|
-
const record: AlgoliaModelRecord = {
|
|
442
|
-
objectID: topicModelWithFields.sys.id,
|
|
443
|
-
names: topicModelWithFields?.fields?.name
|
|
444
|
-
? keysToLowerCase(topicModelWithFields.fields.name)
|
|
445
|
-
: {},
|
|
446
|
-
code:
|
|
447
|
-
topicModelWithFields?.fields?.code?.[defaultEnvironmentLocaleCode] || "",
|
|
448
|
-
description: topicModelWithFields?.fields?.description || {},
|
|
449
|
-
slugs,
|
|
450
|
-
isProtected,
|
|
451
|
-
autodescription,
|
|
452
|
-
thumbnailImgix,
|
|
453
|
-
productFieldFilter:
|
|
454
|
-
topicModelWithFields?.fields?.productFieldFilter?.[
|
|
455
|
-
defaultEnvironmentLocaleCode
|
|
456
|
-
] || "",
|
|
457
|
-
productFields,
|
|
458
|
-
productLine,
|
|
459
|
-
catalogs,
|
|
460
|
-
catalog,
|
|
461
|
-
subFamily,
|
|
462
|
-
colors,
|
|
463
|
-
designer,
|
|
464
|
-
isNew: topicModelWithFields?.fields?.isNew || false,
|
|
465
|
-
priority:
|
|
466
|
-
topicModelWithFields?.fields?.priority?.[defaultEnvironmentLocaleCode] ||
|
|
467
|
-
0,
|
|
468
|
-
destinations:
|
|
469
|
-
topicModelWithFields?.fields?.destinations?.[
|
|
470
|
-
defaultEnvironmentLocaleCode
|
|
471
|
-
] || [],
|
|
472
|
-
lastSyncDate: getLocalISOTime(),
|
|
473
|
-
};
|
|
474
|
-
|
|
475
|
-
return record;
|
|
476
|
-
};
|
|
477
|
-
|
|
478
|
-
export const reindexModel = async (topicModelId: string) => {
|
|
479
|
-
const timeStart = new Date();
|
|
480
|
-
|
|
481
|
-
log(`reindexModel - entryId: ${topicModelId} `);
|
|
482
|
-
|
|
483
|
-
const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
|
|
484
|
-
const object = await getObject(topicModelId);
|
|
485
|
-
|
|
486
|
-
// Save record to Algolia
|
|
487
|
-
const index = getIndex(indexKey);
|
|
488
|
-
let record = null;
|
|
489
|
-
if (!isObjectToDelete(object, defaultEnvironmentLocaleCode)) {
|
|
490
|
-
log(`Save object`);
|
|
491
|
-
record = await index.saveObject(object);
|
|
492
|
-
} else {
|
|
493
|
-
log(`Delete object`);
|
|
494
|
-
record = await index.deleteObject(object.objectID);
|
|
495
|
-
}
|
|
496
|
-
const timeEnd = new Date();
|
|
497
|
-
const seconds = secondBetweenTwoDate(timeStart, timeEnd);
|
|
498
|
-
log(`Execution time: ${seconds} seconds`);
|
|
499
|
-
|
|
500
|
-
return { ...record, ...object };
|
|
501
|
-
};
|
|
502
|
-
|
|
503
|
-
const getObjects = async (
|
|
504
|
-
offset: number,
|
|
505
|
-
limit: number,
|
|
506
|
-
catalogCode?: AvailableCatalogs
|
|
507
|
-
): Promise<AlgoliaPaginateRecords> => {
|
|
508
|
-
const client = await getClient();
|
|
509
|
-
|
|
510
|
-
const opts: any = {
|
|
511
|
-
content_type: "topicModel",
|
|
512
|
-
limit,
|
|
513
|
-
skip: offset,
|
|
514
|
-
select: topicModelSelect,
|
|
515
|
-
};
|
|
516
|
-
if (catalogCode) {
|
|
517
|
-
opts["fields.catalog.sys.id"] = catalogCode;
|
|
518
|
-
}
|
|
519
|
-
const { items, total } = await client.withAllLocales.getEntries(opts);
|
|
520
|
-
|
|
521
|
-
const objects: AlgoliaModelRecord[] = [];
|
|
522
|
-
let count: number = Number(offset);
|
|
523
|
-
let current: number = 0;
|
|
524
|
-
for (const topicModel of items) {
|
|
525
|
-
log(`${++count} of ${total}`, "INFO");
|
|
526
|
-
const timeStart = new Date();
|
|
527
|
-
const record = await getObject(topicModel);
|
|
528
|
-
const timeEnd = new Date();
|
|
529
|
-
const seconds = secondBetweenTwoDate(timeStart, timeEnd);
|
|
530
|
-
log(`Execution time: ${seconds} seconds`);
|
|
531
|
-
objects.push(record);
|
|
532
|
-
if (serverUtils) {
|
|
533
|
-
serverUtils.log(topicModel.sys.id);
|
|
534
|
-
const progress = Math.floor((++current / items.length) * 100);
|
|
535
|
-
serverUtils.updateProgress(progress);
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
return {
|
|
540
|
-
objects,
|
|
541
|
-
offset: Number(offset) + Number(limit),
|
|
542
|
-
limit: Number(limit),
|
|
543
|
-
completed: count >= total, // if is true the import is completed
|
|
544
|
-
total,
|
|
545
|
-
};
|
|
546
|
-
};
|
|
547
|
-
|
|
548
|
-
export const reindexModels = async (
|
|
549
|
-
offset: number = 0,
|
|
550
|
-
limit: number = 50,
|
|
551
|
-
catalogCode?: AvailableCatalogs
|
|
552
|
-
) => {
|
|
553
|
-
const timeStart = new Date();
|
|
554
|
-
log(
|
|
555
|
-
`reindexModels - offset: ${offset} limit: ${limit} catalogCode: ${catalogCode}`
|
|
556
|
-
);
|
|
557
|
-
const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
|
|
558
|
-
|
|
559
|
-
const records = await getObjects(offset, limit, catalogCode);
|
|
560
|
-
const objectsToSave = records.objects.filter(
|
|
561
|
-
(object) => !isObjectToDelete(object, defaultEnvironmentLocaleCode)
|
|
562
|
-
);
|
|
563
|
-
const objectIdsToDelete = records.objects
|
|
564
|
-
.filter((object) => isObjectToDelete(object, defaultEnvironmentLocaleCode))
|
|
565
|
-
.map((object) => object.objectID);
|
|
566
|
-
|
|
567
|
-
// Save records to Algolia
|
|
568
|
-
const index = getIndex(indexKey);
|
|
569
|
-
log(`Save ${objectsToSave.length} objects to ${index.indexName} index`);
|
|
570
|
-
const savedObjectIDs = await index.saveObjects(objectsToSave);
|
|
571
|
-
log(
|
|
572
|
-
`Delete ${objectIdsToDelete.length} objects from ${index.indexName} index`
|
|
573
|
-
);
|
|
574
|
-
const deletedObjectIDs = await index.deleteObjects(objectIdsToDelete);
|
|
575
|
-
|
|
576
|
-
const timeEnd = new Date();
|
|
577
|
-
const seconds = secondBetweenTwoDate(timeStart, timeEnd);
|
|
578
|
-
log(`Execution time: ${seconds} seconds`);
|
|
579
|
-
|
|
580
|
-
return {
|
|
581
|
-
...records,
|
|
582
|
-
savedObjectIDs: savedObjectIDs.objectIDs,
|
|
583
|
-
deletedObjectIDs: deletedObjectIDs.objectIDs,
|
|
584
|
-
};
|
|
585
|
-
};
|
|
586
|
-
|
|
587
|
-
export const removeModelObject = async (topicModelId: string) => {
|
|
588
|
-
return removeIndexObject(topicModelId, indexKey);
|
|
589
|
-
};
|