pim-import 5.0.0 → 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 -46
- 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
|
@@ -1,586 +0,0 @@
|
|
|
1
|
-
import { saveCatalogToS3, getFileFromS3 } from "../../libs/s3";
|
|
2
|
-
import {
|
|
3
|
-
AvailableCatalogs,
|
|
4
|
-
CfSys,
|
|
5
|
-
CfLocalizedEntryField,
|
|
6
|
-
PaginationResults,
|
|
7
|
-
} from "../../types";
|
|
8
|
-
import {
|
|
9
|
-
CatalogDetails,
|
|
10
|
-
CategoriesEntity,
|
|
11
|
-
} from "../../resources/CatalogDetails";
|
|
12
|
-
import type {
|
|
13
|
-
Entry,
|
|
14
|
-
CreateEntryProps,
|
|
15
|
-
} from "contentful-management/dist/typings/entities/entry";
|
|
16
|
-
import {
|
|
17
|
-
getEnvironmentDefaultLocaleCode,
|
|
18
|
-
createEntryWithId,
|
|
19
|
-
updateEntry,
|
|
20
|
-
getEntryByCode,
|
|
21
|
-
getEntryByID,
|
|
22
|
-
cfLocales,
|
|
23
|
-
deleteAllPages,
|
|
24
|
-
deleteAllEntries,
|
|
25
|
-
addToRelationFields,
|
|
26
|
-
addFieldValue,
|
|
27
|
-
} from "../../libs/contentful";
|
|
28
|
-
import { getCatalogTaxonomiesHierarchy } from "../endpoints";
|
|
29
|
-
import { log, serverUtils } from "../../libs/logs";
|
|
30
|
-
import {
|
|
31
|
-
sleep,
|
|
32
|
-
getPimTranslations,
|
|
33
|
-
getLocalISOTime,
|
|
34
|
-
stringToSlug,
|
|
35
|
-
} from "../../utils";
|
|
36
|
-
|
|
37
|
-
const getUnwantedCodeChars = (code: string): string[] => {
|
|
38
|
-
const toExclude = ["'", "/", " ", "&"];
|
|
39
|
-
const invalidChars = [];
|
|
40
|
-
for (const exclude of toExclude) {
|
|
41
|
-
if (code.indexOf(exclude) !== -1) {
|
|
42
|
-
invalidChars.push(exclude);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return invalidChars;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
// Methods
|
|
50
|
-
export const updateSubFamiliesRelToEntry = async (
|
|
51
|
-
entry: Entry,
|
|
52
|
-
subFamilyIds: string[],
|
|
53
|
-
field: string = "subFamilies"
|
|
54
|
-
): Promise<Entry> => {
|
|
55
|
-
log(
|
|
56
|
-
`updateSubFamiliesRelToEntry - entry: ${entry.sys.id} subfamilies count: ${subFamilyIds.length} to field ${field}`,
|
|
57
|
-
"INFO"
|
|
58
|
-
);
|
|
59
|
-
const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
|
|
60
|
-
|
|
61
|
-
const oldRels = entry.fields?.[field]?.[defaultEnvironmentLocaleCode]
|
|
62
|
-
? entry.fields[field][defaultEnvironmentLocaleCode]
|
|
63
|
-
: [];
|
|
64
|
-
|
|
65
|
-
entry.fields[field] = {};
|
|
66
|
-
entry.fields[field][defaultEnvironmentLocaleCode] = [];
|
|
67
|
-
|
|
68
|
-
// Keep Contentful sort
|
|
69
|
-
|
|
70
|
-
const newRels: CfSys[] = [];
|
|
71
|
-
for (const subFamilyId of subFamilyIds) {
|
|
72
|
-
if (!oldRels.find((rel: CfSys) => rel.sys.id === subFamilyId)) {
|
|
73
|
-
newRels.push({
|
|
74
|
-
sys: { type: "Link", linkType: "Entry", id: subFamilyId },
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
entry.fields[field][defaultEnvironmentLocaleCode] = [...oldRels, ...newRels];
|
|
80
|
-
|
|
81
|
-
entry = await entry.update();
|
|
82
|
-
if (entry.isPublished()) {
|
|
83
|
-
entry = await entry.publish();
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return entry;
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const getCategoryData = async (
|
|
90
|
-
names: CfLocalizedEntryField,
|
|
91
|
-
code: string,
|
|
92
|
-
catalogEntry: Entry,
|
|
93
|
-
categoryEntry: Entry
|
|
94
|
-
) => {
|
|
95
|
-
const data: CreateEntryProps = {
|
|
96
|
-
fields: categoryEntry?.fields || {},
|
|
97
|
-
};
|
|
98
|
-
data.fields.name = names;
|
|
99
|
-
data.fields = await addFieldValue(data, "code", code);
|
|
100
|
-
|
|
101
|
-
// Catalogs
|
|
102
|
-
data.fields = await addToRelationFields(
|
|
103
|
-
data,
|
|
104
|
-
"catalogs",
|
|
105
|
-
catalogEntry.sys.id,
|
|
106
|
-
true
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
// lastPimSyncDate
|
|
110
|
-
data.fields = await addFieldValue(data, "lastPimSyncDate", getLocalISOTime());
|
|
111
|
-
|
|
112
|
-
return data;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const getCategorySlugs = async (
|
|
116
|
-
categoryEntry: Entry
|
|
117
|
-
): Promise<CfLocalizedEntryField> => {
|
|
118
|
-
const slugs: CfLocalizedEntryField = {};
|
|
119
|
-
const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
|
|
120
|
-
|
|
121
|
-
for (const locale of cfLocales) {
|
|
122
|
-
slugs[locale] = stringToSlug(
|
|
123
|
-
`${
|
|
124
|
-
categoryEntry.fields.name[locale] ||
|
|
125
|
-
categoryEntry.fields.name[defaultEnvironmentLocaleCode]
|
|
126
|
-
}`.toLowerCase()
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return slugs;
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const getCategoryPageData = async (
|
|
134
|
-
names: CfLocalizedEntryField,
|
|
135
|
-
slugs: CfLocalizedEntryField,
|
|
136
|
-
pageId: string,
|
|
137
|
-
categoryEntry: Entry,
|
|
138
|
-
categoryPageEntry: Entry
|
|
139
|
-
): Promise<CreateEntryProps> => {
|
|
140
|
-
const pageData: CreateEntryProps = {
|
|
141
|
-
fields: categoryPageEntry?.fields || {},
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
pageData.fields.title = names;
|
|
145
|
-
pageData.fields.slug = slugs;
|
|
146
|
-
|
|
147
|
-
pageData.fields = await addFieldValue(pageData, "internalName", pageId);
|
|
148
|
-
pageData.fields = await addFieldValue(pageData, "type", "CatalogCategory");
|
|
149
|
-
|
|
150
|
-
// Topic
|
|
151
|
-
pageData.fields = await addToRelationFields(
|
|
152
|
-
pageData,
|
|
153
|
-
"topic",
|
|
154
|
-
categoryEntry.sys.id
|
|
155
|
-
);
|
|
156
|
-
|
|
157
|
-
return pageData;
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
const importCategoryPage = async (categoryEntry: Entry) => {
|
|
161
|
-
log(`importCategoryPage - ${categoryEntry.sys.id}`, "INFO");
|
|
162
|
-
const names = categoryEntry.fields.name;
|
|
163
|
-
const pageId = `${categoryEntry.sys.id}_PAGE`;
|
|
164
|
-
const slugs = await getCategorySlugs(categoryEntry);
|
|
165
|
-
|
|
166
|
-
// PAGE
|
|
167
|
-
log(`Importing category page ${pageId}...`);
|
|
168
|
-
let categoryPageEntry = await getEntryByID(pageId, "page");
|
|
169
|
-
const pageData: CreateEntryProps = await getCategoryPageData(
|
|
170
|
-
names,
|
|
171
|
-
slugs,
|
|
172
|
-
pageId,
|
|
173
|
-
categoryEntry,
|
|
174
|
-
categoryPageEntry
|
|
175
|
-
);
|
|
176
|
-
if (categoryPageEntry) {
|
|
177
|
-
log(`category page ${pageId} already exists. Updating...`);
|
|
178
|
-
categoryPageEntry = await updateEntry(
|
|
179
|
-
categoryPageEntry,
|
|
180
|
-
pageData,
|
|
181
|
-
categoryPageEntry.isPublished()
|
|
182
|
-
);
|
|
183
|
-
} else {
|
|
184
|
-
log(`category page ${pageId} not exists. Create new entry with data`);
|
|
185
|
-
categoryPageEntry = await createEntryWithId("page", pageId, pageData);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return categoryPageEntry;
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
export const getCategoryTopicCode = (
|
|
192
|
-
categoryPimCode: string,
|
|
193
|
-
catalogCode: AvailableCatalogs
|
|
194
|
-
) => {
|
|
195
|
-
return categoryPimCode.replace(catalogCode + "_", "");
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
export const getCategoryTopicId = (
|
|
199
|
-
categoryPimCode: string,
|
|
200
|
-
catalogCode: AvailableCatalogs
|
|
201
|
-
) => {
|
|
202
|
-
const code = getCategoryTopicCode(categoryPimCode, catalogCode);
|
|
203
|
-
return `CATEGORY_${code}`;
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Import Category
|
|
208
|
-
*
|
|
209
|
-
* @param categoryDetails
|
|
210
|
-
* @param catalogCode
|
|
211
|
-
* @param catalogEntry
|
|
212
|
-
* @returns
|
|
213
|
-
*/
|
|
214
|
-
const importCategory = async (
|
|
215
|
-
categoryDetails: CategoriesEntity,
|
|
216
|
-
catalogCode: AvailableCatalogs,
|
|
217
|
-
catalogEntry: Entry
|
|
218
|
-
): Promise<Entry | boolean> => {
|
|
219
|
-
log(`importCategory - ${catalogCode} ${categoryDetails.data.code}`, "INFO");
|
|
220
|
-
const pimCode = categoryDetails.data.code;
|
|
221
|
-
const invalidCodeChars = getUnwantedCodeChars(pimCode);
|
|
222
|
-
if (invalidCodeChars?.length) {
|
|
223
|
-
log(
|
|
224
|
-
`The ${pimCode} category cannot be imported as it includes unwanted characters: ${invalidCodeChars.join(
|
|
225
|
-
","
|
|
226
|
-
)}`,
|
|
227
|
-
"WARN"
|
|
228
|
-
);
|
|
229
|
-
return false;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const names: CfLocalizedEntryField = getPimTranslations(categoryDetails.data);
|
|
233
|
-
const code = getCategoryTopicCode(pimCode, catalogCode);
|
|
234
|
-
const id = getCategoryTopicId(pimCode, catalogCode);
|
|
235
|
-
let categoryEntry = await getEntryByCode(code, "topicCategory");
|
|
236
|
-
|
|
237
|
-
const data: CreateEntryProps = await getCategoryData(
|
|
238
|
-
names,
|
|
239
|
-
code,
|
|
240
|
-
catalogEntry,
|
|
241
|
-
categoryEntry
|
|
242
|
-
);
|
|
243
|
-
|
|
244
|
-
if (categoryEntry) {
|
|
245
|
-
log(`Category ${code} already exists. Updating...`);
|
|
246
|
-
categoryEntry = await updateEntry(
|
|
247
|
-
categoryEntry,
|
|
248
|
-
data,
|
|
249
|
-
categoryEntry.isPublished()
|
|
250
|
-
);
|
|
251
|
-
} else {
|
|
252
|
-
log(`Category ${code} not exists. Create new entry with data`);
|
|
253
|
-
categoryEntry = await createEntryWithId("topicCategory", id, data, true);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
await importCategoryPage(categoryEntry);
|
|
257
|
-
|
|
258
|
-
return categoryEntry;
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
const getCatalogData = async (
|
|
262
|
-
names: CfLocalizedEntryField,
|
|
263
|
-
code: AvailableCatalogs,
|
|
264
|
-
catalogEntry: Entry | null
|
|
265
|
-
): Promise<CreateEntryProps> => {
|
|
266
|
-
const data: CreateEntryProps = {
|
|
267
|
-
fields: catalogEntry?.fields || {},
|
|
268
|
-
};
|
|
269
|
-
data.fields.name = names;
|
|
270
|
-
data.fields = await addFieldValue(data, "code", code);
|
|
271
|
-
|
|
272
|
-
// lastPimSyncDate
|
|
273
|
-
data.fields = await addFieldValue(data, "lastPimSyncDate", getLocalISOTime());
|
|
274
|
-
|
|
275
|
-
return data;
|
|
276
|
-
};
|
|
277
|
-
|
|
278
|
-
// const getComponentTopicCategoriesData = async (
|
|
279
|
-
// componentID: string,
|
|
280
|
-
// catalogEntry: Entry,
|
|
281
|
-
// componentCatalogModule: Entry | null
|
|
282
|
-
// ) => {
|
|
283
|
-
// const componentData: CreateEntryProps = {
|
|
284
|
-
// fields: componentCatalogModule?.fields || {},
|
|
285
|
-
// };
|
|
286
|
-
|
|
287
|
-
// componentData.fields = await addFieldValue(
|
|
288
|
-
// componentData,
|
|
289
|
-
// "internalName",
|
|
290
|
-
// componentID
|
|
291
|
-
// );
|
|
292
|
-
|
|
293
|
-
// // categoryPages relations
|
|
294
|
-
// const catalogCategories = await getAllEntries(
|
|
295
|
-
// "topicCategory",
|
|
296
|
-
// "sys",
|
|
297
|
-
// "fields.catalogs.sys.id[in]",
|
|
298
|
-
// catalogEntry.sys.id
|
|
299
|
-
// );
|
|
300
|
-
// for (const categoryEntry of catalogCategories) {
|
|
301
|
-
// log(
|
|
302
|
-
// `Add ${categoryEntry.sys.id} category to ${catalogEntry.sys.id} catalog`
|
|
303
|
-
// );
|
|
304
|
-
// componentData.fields = await addToRelationFields(
|
|
305
|
-
// componentData,
|
|
306
|
-
// "categories",
|
|
307
|
-
// `${categoryEntry.sys.id}`,
|
|
308
|
-
// true
|
|
309
|
-
// );
|
|
310
|
-
// }
|
|
311
|
-
|
|
312
|
-
// return componentData;
|
|
313
|
-
// };
|
|
314
|
-
|
|
315
|
-
// const addComponentTopicCategories = async (
|
|
316
|
-
// catalogEntry: Entry
|
|
317
|
-
// ): Promise<Entry> => {
|
|
318
|
-
// const componentID = `CC_${catalogEntry.sys.id}`;
|
|
319
|
-
// const componentContentType = "componentTopicCategories";
|
|
320
|
-
// let componentModule = await getEntryByID(componentID, componentContentType);
|
|
321
|
-
|
|
322
|
-
// const componentData = await getComponentTopicCategoriesData(
|
|
323
|
-
// componentID,
|
|
324
|
-
// catalogEntry,
|
|
325
|
-
// componentModule
|
|
326
|
-
// );
|
|
327
|
-
|
|
328
|
-
// if (componentModule) {
|
|
329
|
-
// log(
|
|
330
|
-
// `Update ${componentContentType} for the ${catalogEntry.sys.id} catalog page`
|
|
331
|
-
// );
|
|
332
|
-
// componentModule = await updateEntry(
|
|
333
|
-
// componentModule,
|
|
334
|
-
// componentData,
|
|
335
|
-
// componentModule.isPublished()
|
|
336
|
-
// );
|
|
337
|
-
// } else {
|
|
338
|
-
// log(
|
|
339
|
-
// `Add ${componentContentType} for the ${catalogEntry.sys.id} catalog page`
|
|
340
|
-
// );
|
|
341
|
-
// componentModule = await createEntryWithId(
|
|
342
|
-
// componentContentType,
|
|
343
|
-
// componentID,
|
|
344
|
-
// componentData
|
|
345
|
-
// );
|
|
346
|
-
// componentModule = await componentModule.publish();
|
|
347
|
-
// }
|
|
348
|
-
|
|
349
|
-
// return componentModule;
|
|
350
|
-
// };
|
|
351
|
-
|
|
352
|
-
const getCatalogPageData = async (
|
|
353
|
-
names: CfLocalizedEntryField,
|
|
354
|
-
slugs: CfLocalizedEntryField,
|
|
355
|
-
pageId: string,
|
|
356
|
-
catalogEntry: Entry,
|
|
357
|
-
catalogPageEntry: Entry
|
|
358
|
-
): Promise<CreateEntryProps> => {
|
|
359
|
-
const pageData: CreateEntryProps = {
|
|
360
|
-
fields: catalogPageEntry?.fields || {},
|
|
361
|
-
};
|
|
362
|
-
|
|
363
|
-
pageData.fields.title = names;
|
|
364
|
-
pageData.fields.slug = slugs;
|
|
365
|
-
|
|
366
|
-
pageData.fields = await addFieldValue(pageData, "internalName", pageId);
|
|
367
|
-
pageData.fields = await addFieldValue(pageData, "type", "CatalogCollection");
|
|
368
|
-
|
|
369
|
-
// Topic
|
|
370
|
-
pageData.fields = await addToRelationFields(
|
|
371
|
-
pageData,
|
|
372
|
-
"topic",
|
|
373
|
-
catalogEntry.sys.id
|
|
374
|
-
);
|
|
375
|
-
|
|
376
|
-
// Contents - componentCatalogModule
|
|
377
|
-
// const componentModule = await addComponentTopicCategories(catalogEntry);
|
|
378
|
-
// pageData.fields = await addToRelationFields(
|
|
379
|
-
// pageData,
|
|
380
|
-
// "contents",
|
|
381
|
-
// componentModule.sys.id,
|
|
382
|
-
// true
|
|
383
|
-
// );
|
|
384
|
-
|
|
385
|
-
return pageData;
|
|
386
|
-
};
|
|
387
|
-
|
|
388
|
-
export const importCatalogPage = async (catalogEntry: Entry) => {
|
|
389
|
-
log(`importCatalogPage - ${catalogEntry.sys.id}`, "INFO");
|
|
390
|
-
const names = catalogEntry.fields.name;
|
|
391
|
-
const pageId = `${catalogEntry.sys.id}_PAGE`;
|
|
392
|
-
const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
|
|
393
|
-
|
|
394
|
-
const slugs: any = {};
|
|
395
|
-
for (const locale of cfLocales) {
|
|
396
|
-
slugs[locale] = stringToSlug(
|
|
397
|
-
`${
|
|
398
|
-
catalogEntry.fields.name[locale] ||
|
|
399
|
-
catalogEntry.fields.name[defaultEnvironmentLocaleCode]
|
|
400
|
-
}`.toLowerCase()
|
|
401
|
-
);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// PAGE
|
|
405
|
-
log(`create/update catalog page ${pageId}...`);
|
|
406
|
-
let catalogPageEntry = await getEntryByID(pageId, "page");
|
|
407
|
-
const pageData: CreateEntryProps = await getCatalogPageData(
|
|
408
|
-
names,
|
|
409
|
-
slugs,
|
|
410
|
-
pageId,
|
|
411
|
-
catalogEntry,
|
|
412
|
-
catalogPageEntry
|
|
413
|
-
);
|
|
414
|
-
if (catalogPageEntry) {
|
|
415
|
-
log(`catalog page ${pageId} already exists. Updating...`);
|
|
416
|
-
catalogPageEntry = await updateEntry(
|
|
417
|
-
catalogPageEntry,
|
|
418
|
-
pageData,
|
|
419
|
-
catalogPageEntry.isPublished()
|
|
420
|
-
);
|
|
421
|
-
} else {
|
|
422
|
-
log(`catalog page ${pageId} not exists. Create new entry with data`);
|
|
423
|
-
catalogPageEntry = await createEntryWithId("page", pageId, pageData);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
return catalogPageEntry;
|
|
427
|
-
};
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* Import Catalog
|
|
431
|
-
*
|
|
432
|
-
* @param catalogCode
|
|
433
|
-
* @param catalogDetails
|
|
434
|
-
* @returns
|
|
435
|
-
*/
|
|
436
|
-
const importCatalog = async (
|
|
437
|
-
catalogCode: AvailableCatalogs,
|
|
438
|
-
catalogDetails: any,
|
|
439
|
-
excludeImportPage: boolean = false
|
|
440
|
-
) => {
|
|
441
|
-
log(`create/update catalog ${catalogCode}...`);
|
|
442
|
-
let catalogEntry = await getEntryByCode(catalogCode, "topicCatalog");
|
|
443
|
-
|
|
444
|
-
const catalogNames: CfLocalizedEntryField = getPimTranslations(
|
|
445
|
-
catalogDetails.data
|
|
446
|
-
);
|
|
447
|
-
const catalogData: CreateEntryProps = await getCatalogData(
|
|
448
|
-
catalogNames,
|
|
449
|
-
catalogCode,
|
|
450
|
-
catalogEntry
|
|
451
|
-
);
|
|
452
|
-
|
|
453
|
-
if (catalogEntry) {
|
|
454
|
-
log(`topicCatalog ${catalogCode} already exists. Updating...`);
|
|
455
|
-
catalogEntry = await updateEntry(
|
|
456
|
-
catalogEntry,
|
|
457
|
-
catalogData,
|
|
458
|
-
catalogEntry.isPublished()
|
|
459
|
-
);
|
|
460
|
-
} else {
|
|
461
|
-
log(`topicCatalog ${catalogCode} not exists. Create new entry with data`);
|
|
462
|
-
catalogEntry = await createEntryWithId(
|
|
463
|
-
"topicCatalog",
|
|
464
|
-
catalogCode,
|
|
465
|
-
catalogData,
|
|
466
|
-
true
|
|
467
|
-
);
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
if (!excludeImportPage) {
|
|
471
|
-
await importCatalogPage(catalogEntry);
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
return catalogEntry;
|
|
475
|
-
};
|
|
476
|
-
|
|
477
|
-
export const importCategories = async (
|
|
478
|
-
catalogCode: AvailableCatalogs,
|
|
479
|
-
offset: number = 0,
|
|
480
|
-
limit: number = -1,
|
|
481
|
-
s3FilePath: string = ""
|
|
482
|
-
): Promise<PaginationResults | null> => {
|
|
483
|
-
log(
|
|
484
|
-
`importCategories - catalogCode: ${catalogCode} offset: ${offset} limit: ${limit} s3FilePath:${s3FilePath}`,
|
|
485
|
-
"INFO"
|
|
486
|
-
);
|
|
487
|
-
|
|
488
|
-
if (!s3FilePath) {
|
|
489
|
-
const s3Path: string = await saveCatalogToS3(catalogCode);
|
|
490
|
-
return {
|
|
491
|
-
offset,
|
|
492
|
-
limit: Number(limit),
|
|
493
|
-
completed: false,
|
|
494
|
-
s3FilePath: s3Path,
|
|
495
|
-
};
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
const JSONData = await getFileFromS3(s3FilePath);
|
|
499
|
-
const catalogDetails: CatalogDetails = await getCatalogTaxonomiesHierarchy(
|
|
500
|
-
catalogCode,
|
|
501
|
-
JSONData
|
|
502
|
-
);
|
|
503
|
-
|
|
504
|
-
let catalogEntry;
|
|
505
|
-
if (offset === 0) {
|
|
506
|
-
catalogEntry = await importCatalog(catalogCode, catalogDetails, true);
|
|
507
|
-
} else {
|
|
508
|
-
catalogEntry = await getEntryByCode(catalogCode, "topicCatalog");
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
const categoryEntries: string[] = [];
|
|
512
|
-
if (catalogDetails.categories?.length) {
|
|
513
|
-
let count: number = 0;
|
|
514
|
-
let current: number = 0;
|
|
515
|
-
for (const categoryDetails of catalogDetails.categories) {
|
|
516
|
-
if (offset <= count || limit === -1) {
|
|
517
|
-
log(`${count + 1} of ${catalogDetails.categories.length}`);
|
|
518
|
-
categoryDetails.data.code = categoryDetails.data.code;
|
|
519
|
-
const categoryEntry = await importCategory(
|
|
520
|
-
categoryDetails,
|
|
521
|
-
catalogCode,
|
|
522
|
-
catalogEntry
|
|
523
|
-
);
|
|
524
|
-
if (
|
|
525
|
-
categoryEntry &&
|
|
526
|
-
typeof categoryEntry === "object" &&
|
|
527
|
-
categoryEntry?.sys?.id
|
|
528
|
-
) {
|
|
529
|
-
categoryEntries.push(categoryEntry.sys.id);
|
|
530
|
-
}
|
|
531
|
-
await sleep(100);
|
|
532
|
-
|
|
533
|
-
if (serverUtils) {
|
|
534
|
-
serverUtils.log(categoryDetails.data.code);
|
|
535
|
-
const currentTotal =
|
|
536
|
-
catalogDetails.categories.length > limit && limit !== -1
|
|
537
|
-
? limit
|
|
538
|
-
: catalogDetails.categories.length;
|
|
539
|
-
const progress = Math.floor((++current / currentTotal) * 100);
|
|
540
|
-
serverUtils.updateProgress(progress);
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
if (limit !== -1 && count + 1 - offset >= limit) {
|
|
544
|
-
break;
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
count++;
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
const completed = count + 1 >= catalogDetails.categories.length;
|
|
551
|
-
|
|
552
|
-
if (completed) {
|
|
553
|
-
log(`Update componentTopicCategories to catalog page...`);
|
|
554
|
-
await importCatalog(catalogCode, catalogDetails);
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
if (serverUtils) {
|
|
558
|
-
serverUtils.updateProgress(100);
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
return {
|
|
562
|
-
offset: Number(offset) + Number(limit),
|
|
563
|
-
limit: Number(limit),
|
|
564
|
-
completed, // if is true the import is completed
|
|
565
|
-
s3FilePath: s3FilePath,
|
|
566
|
-
total: catalogDetails.categories.length,
|
|
567
|
-
};
|
|
568
|
-
} else {
|
|
569
|
-
log(`no data found in the catalog: ${catalogCode}`, "ERROR");
|
|
570
|
-
return null;
|
|
571
|
-
}
|
|
572
|
-
};
|
|
573
|
-
|
|
574
|
-
export const deleteAllCategoriesAndFamiliesData = async (
|
|
575
|
-
catalogCode: AvailableCatalogs
|
|
576
|
-
) => {
|
|
577
|
-
const resCat = await deleteAllEntries("topicCategory", catalogCode);
|
|
578
|
-
const resFam = await deleteAllEntries("topicSubFamily", catalogCode);
|
|
579
|
-
const resPage = await deleteAllPages(["CatalogProduct", "CatalogSubFamily"]);
|
|
580
|
-
|
|
581
|
-
return {
|
|
582
|
-
topicCategory: resCat,
|
|
583
|
-
topicSubFamily: resFam,
|
|
584
|
-
page: resPage,
|
|
585
|
-
};
|
|
586
|
-
};
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getEnvironment,
|
|
3
|
-
getEnvironmentDefaultLocaleCode,
|
|
4
|
-
} from "../../libs/contentful";
|
|
5
|
-
import { log } from "../../libs/logs";
|
|
6
|
-
import * as fs from "fs";
|
|
7
|
-
import * as path from "path";
|
|
8
|
-
import * as csvWriter from "csv-writer";
|
|
9
|
-
export const checkTopicDraftAndPagePublished = async (
|
|
10
|
-
offset: number,
|
|
11
|
-
limit: number
|
|
12
|
-
) => {
|
|
13
|
-
const env = await getEnvironment();
|
|
14
|
-
const defEnvLocaleCode = await getEnvironmentDefaultLocaleCode();
|
|
15
|
-
|
|
16
|
-
const opts = {
|
|
17
|
-
content_type: "page",
|
|
18
|
-
skip: offset,
|
|
19
|
-
limit,
|
|
20
|
-
locale: defEnvLocaleCode,
|
|
21
|
-
"sys.archivedAt[exists]": false,
|
|
22
|
-
"sys.publishedAt[exists]": true,
|
|
23
|
-
"fields.topic[exists]": true,
|
|
24
|
-
select: "sys,fields.type,fields.topic",
|
|
25
|
-
include: 3,
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const { items, total } = await env.getEntries(opts);
|
|
29
|
-
log(`Check ${offset + limit} of ${total} pages`);
|
|
30
|
-
let filteredItems = [];
|
|
31
|
-
for (const item of items) {
|
|
32
|
-
const topicId = item.fields?.topic[defEnvLocaleCode]?.sys?.id;
|
|
33
|
-
const topicEntry = topicId ? await env.getEntry(topicId) : null;
|
|
34
|
-
if (topicEntry && (topicEntry.isDraft() || topicEntry.isArchived())) {
|
|
35
|
-
// log(`Page ${item.sys.id} has a draft or archived topic`, "INFO");
|
|
36
|
-
filteredItems.push(item);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const records = filteredItems.map((pageEntry) => ({
|
|
41
|
-
pageId: pageEntry.sys.id,
|
|
42
|
-
pageType: pageEntry.fields.type[defEnvLocaleCode],
|
|
43
|
-
topicId: pageEntry.fields.topic[defEnvLocaleCode]?.sys?.id,
|
|
44
|
-
}));
|
|
45
|
-
|
|
46
|
-
log(`Writing ${records.length} records to CSV file`);
|
|
47
|
-
|
|
48
|
-
if (records.length) {
|
|
49
|
-
const csvFilePath = path.join("checkTopicDraftAndPagePublished.csv");
|
|
50
|
-
const fileExists = fs.existsSync(csvFilePath);
|
|
51
|
-
const writer = csvWriter.createObjectCsvWriter({
|
|
52
|
-
path: csvFilePath,
|
|
53
|
-
header: [
|
|
54
|
-
{ id: "pageId", title: "Page ID" },
|
|
55
|
-
{ id: "pageType", title: "Page Type" },
|
|
56
|
-
{ id: "topicId", title: "Topic ID" },
|
|
57
|
-
],
|
|
58
|
-
append: fileExists,
|
|
59
|
-
});
|
|
60
|
-
await writer.writeRecords(records);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const count: number = offset + limit;
|
|
64
|
-
return {
|
|
65
|
-
completed: !total || total === count + offset,
|
|
66
|
-
total,
|
|
67
|
-
offset,
|
|
68
|
-
limit,
|
|
69
|
-
};
|
|
70
|
-
};
|