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.
Files changed (249) hide show
  1. package/dist/algolia/clean.js +0 -1
  2. package/dist/algolia/config.js +0 -1
  3. package/dist/algolia/downloads.js +0 -1
  4. package/dist/algolia/families.js +0 -1
  5. package/dist/algolia/inspirations.js +0 -1
  6. package/dist/algolia/models.js +0 -1
  7. package/dist/algolia/news.js +0 -1
  8. package/dist/algolia/pressRelease.js +0 -1
  9. package/dist/algolia/pressReview.js +0 -1
  10. package/dist/algolia/products.js +0 -1
  11. package/dist/algolia/projects.js +0 -1
  12. package/dist/algolia/stories.js +0 -1
  13. package/dist/algolia/subFamilies.js +0 -1
  14. package/dist/algolia/subModels.js +0 -1
  15. package/dist/browser.js +0 -1
  16. package/dist/downloads/classes/manageEntry.js +0 -1
  17. package/dist/downloads/import.js +0 -1
  18. package/dist/index.js +0 -1
  19. package/dist/libs/contentful-cda.js +0 -1
  20. package/dist/libs/contentful.js +0 -1
  21. package/dist/libs/imgix.js +0 -1
  22. package/dist/libs/logs.js +0 -1
  23. package/dist/libs/netlify.js +0 -1
  24. package/dist/libs/notifications.js +0 -1
  25. package/dist/libs/pdf.js +0 -1
  26. package/dist/libs/s3.js +0 -1
  27. package/dist/libs/sentry.js +0 -1
  28. package/dist/pim/config.js +0 -1
  29. package/dist/pim/endpoints.js +0 -1
  30. package/dist/pim/methods/bulkPublish.js +0 -1
  31. package/dist/pim/methods/catalogs.js +0 -1
  32. package/dist/pim/methods/checkTopicDraftAndPagePublished.js +0 -1
  33. package/dist/pim/methods/designers.js +0 -1
  34. package/dist/pim/methods/dictionary.js +0 -1
  35. package/dist/pim/methods/families.js +0 -1
  36. package/dist/pim/methods/latestProducts.js +0 -1
  37. package/dist/pim/methods/migrateEntryFields.js +0 -1
  38. package/dist/pim/methods/models.js +0 -1
  39. package/dist/pim/methods/pages/catalogs.js +0 -1
  40. package/dist/pim/methods/pages/families.js +0 -1
  41. package/dist/pim/methods/pages/subfamilies.js +0 -1
  42. package/dist/pim/methods/products.js +0 -1
  43. package/dist/pim/methods/subfamilies.js +0 -1
  44. package/dist/pim/methods/submodels.js +0 -1
  45. package/dist/pim/request.js +0 -1
  46. package/dist/resources/AllProducts.js +0 -1
  47. package/dist/resources/Audit.js +0 -1
  48. package/dist/resources/CatalogDetails.js +0 -1
  49. package/dist/resources/CollectionModels.js +0 -1
  50. package/dist/resources/CollectionSubFamilies.js +0 -1
  51. package/dist/resources/CollectionSubModels.js +0 -1
  52. package/dist/resources/DProductSubLine.js +0 -1
  53. package/dist/resources/FamilyDetails.js +0 -1
  54. package/dist/resources/ProductDetails.js +0 -1
  55. package/dist/resources/ProductRelation.js +0 -1
  56. package/dist/resources/cfFields.js +0 -1
  57. package/dist/types.js +0 -1
  58. package/dist/utils.js +0 -1
  59. package/package.json +7 -2
  60. package/.env.example +0 -46
  61. package/.nvmrc +0 -1
  62. package/.vscode/settings.json +0 -21
  63. package/dist/algolia/clean.js.map +0 -1
  64. package/dist/algolia/config.js.map +0 -1
  65. package/dist/algolia/downloads.js.map +0 -1
  66. package/dist/algolia/families.js.map +0 -1
  67. package/dist/algolia/inspirations.js.map +0 -1
  68. package/dist/algolia/models.js.map +0 -1
  69. package/dist/algolia/news.js.map +0 -1
  70. package/dist/algolia/pressRelease.js.map +0 -1
  71. package/dist/algolia/pressReview.js.map +0 -1
  72. package/dist/algolia/products.js.map +0 -1
  73. package/dist/algolia/projects.js.map +0 -1
  74. package/dist/algolia/stories.js.map +0 -1
  75. package/dist/algolia/subFamilies.js.map +0 -1
  76. package/dist/algolia/subModels.js.map +0 -1
  77. package/dist/browser.js.map +0 -1
  78. package/dist/downloads/classes/manageEntry.js.map +0 -1
  79. package/dist/downloads/import.js.map +0 -1
  80. package/dist/index.js.map +0 -1
  81. package/dist/libs/contentful-cda.js.map +0 -1
  82. package/dist/libs/contentful.js.map +0 -1
  83. package/dist/libs/imgix.js.map +0 -1
  84. package/dist/libs/logs.js.map +0 -1
  85. package/dist/libs/netlify.js.map +0 -1
  86. package/dist/libs/notifications.js.map +0 -1
  87. package/dist/libs/pdf.js.map +0 -1
  88. package/dist/libs/s3.js.map +0 -1
  89. package/dist/libs/sentry.js.map +0 -1
  90. package/dist/pim/config.js.map +0 -1
  91. package/dist/pim/endpoints.js.map +0 -1
  92. package/dist/pim/methods/bulkPublish.js.map +0 -1
  93. package/dist/pim/methods/catalogs.js.map +0 -1
  94. package/dist/pim/methods/checkTopicDraftAndPagePublished.js.map +0 -1
  95. package/dist/pim/methods/designers.js.map +0 -1
  96. package/dist/pim/methods/dictionary.js.map +0 -1
  97. package/dist/pim/methods/families.js.map +0 -1
  98. package/dist/pim/methods/latestProducts.js.map +0 -1
  99. package/dist/pim/methods/migrateEntryFields.js.map +0 -1
  100. package/dist/pim/methods/models.js.map +0 -1
  101. package/dist/pim/methods/pages/catalogs.js.map +0 -1
  102. package/dist/pim/methods/pages/families.js.map +0 -1
  103. package/dist/pim/methods/pages/subfamilies.js.map +0 -1
  104. package/dist/pim/methods/products.js.map +0 -1
  105. package/dist/pim/methods/subfamilies.js.map +0 -1
  106. package/dist/pim/methods/submodels.js.map +0 -1
  107. package/dist/pim/request.js.map +0 -1
  108. package/dist/resources/AllProducts.js.map +0 -1
  109. package/dist/resources/Audit.js.map +0 -1
  110. package/dist/resources/CatalogDetails.js.map +0 -1
  111. package/dist/resources/CollectionModels.js.map +0 -1
  112. package/dist/resources/CollectionSubFamilies.js.map +0 -1
  113. package/dist/resources/CollectionSubModels.js.map +0 -1
  114. package/dist/resources/DProductSubLine.js.map +0 -1
  115. package/dist/resources/FamilyDetails.js.map +0 -1
  116. package/dist/resources/ProductDetails.js.map +0 -1
  117. package/dist/resources/ProductRelation.js.map +0 -1
  118. package/dist/resources/cfFields.js.map +0 -1
  119. package/dist/types.js.map +0 -1
  120. package/dist/utils.js.map +0 -1
  121. package/docs/import-data-from-the-dictionary.md +0 -83
  122. package/docs/import-products.md +0 -61
  123. package/docs/import-taxonomies-from-the-catalog.md +0 -60
  124. package/docs/settings.md +0 -47
  125. package/jest.config.js +0 -16
  126. package/local-fn/reindex.js +0 -182
  127. package/src/algolia/clean.ts +0 -164
  128. package/src/algolia/config.ts +0 -390
  129. package/src/algolia/downloads.ts +0 -346
  130. package/src/algolia/families.ts +0 -652
  131. package/src/algolia/inspirations.ts +0 -315
  132. package/src/algolia/models.ts +0 -589
  133. package/src/algolia/news.ts +0 -258
  134. package/src/algolia/pressRelease.ts +0 -255
  135. package/src/algolia/pressReview.ts +0 -247
  136. package/src/algolia/products.ts +0 -731
  137. package/src/algolia/projects.ts +0 -339
  138. package/src/algolia/stories.ts +0 -347
  139. package/src/algolia/subFamilies.ts +0 -709
  140. package/src/algolia/subModels.ts +0 -359
  141. package/src/browser.ts +0 -122
  142. package/src/downloads/classes/manageEntry.ts +0 -99
  143. package/src/downloads/csv/legal.csv +0 -5
  144. package/src/downloads/csv/products.csv +0 -373
  145. package/src/downloads/import.ts +0 -381
  146. package/src/index.ts +0 -140
  147. package/src/libs/contentful-cda.ts +0 -543
  148. package/src/libs/contentful.ts +0 -1453
  149. package/src/libs/imgix.ts +0 -297
  150. package/src/libs/logs.ts +0 -121
  151. package/src/libs/netlify.ts +0 -37
  152. package/src/libs/notifications.ts +0 -104
  153. package/src/libs/pdf.ts +0 -107
  154. package/src/libs/s3.ts +0 -305
  155. package/src/libs/sentry.ts +0 -33
  156. package/src/pim/config.ts +0 -84
  157. package/src/pim/data/productFields.json +0 -1178
  158. package/src/pim/endpoints.ts +0 -364
  159. package/src/pim/methods/bulkPublish.ts +0 -266
  160. package/src/pim/methods/catalogs.ts +0 -586
  161. package/src/pim/methods/checkTopicDraftAndPagePublished.ts +0 -70
  162. package/src/pim/methods/designers.ts +0 -128
  163. package/src/pim/methods/dictionary.ts +0 -611
  164. package/src/pim/methods/families.ts +0 -345
  165. package/src/pim/methods/latestProducts.ts +0 -70
  166. package/src/pim/methods/migrateEntryFields.ts +0 -99
  167. package/src/pim/methods/models.ts +0 -349
  168. package/src/pim/methods/pages/catalogs.ts +0 -28
  169. package/src/pim/methods/pages/families.ts +0 -50
  170. package/src/pim/methods/pages/subfamilies.ts +0 -98
  171. package/src/pim/methods/products.ts +0 -3297
  172. package/src/pim/methods/subfamilies.ts +0 -706
  173. package/src/pim/methods/submodels.ts +0 -262
  174. package/src/pim/request.ts +0 -61
  175. package/src/resources/AllProducts.ts +0 -41
  176. package/src/resources/Audit.ts +0 -24
  177. package/src/resources/CatalogDetails.ts +0 -51
  178. package/src/resources/CollectionModels.ts +0 -42
  179. package/src/resources/CollectionSubFamilies.ts +0 -45
  180. package/src/resources/CollectionSubModels.ts +0 -36
  181. package/src/resources/DProductSubLine.ts +0 -34
  182. package/src/resources/FamilyDetails.ts +0 -31
  183. package/src/resources/ProductDetails.ts +0 -352
  184. package/src/resources/ProductRelation.ts +0 -24
  185. package/src/resources/cfFields.ts +0 -8
  186. package/src/types.ts +0 -268
  187. package/src/utils.ts +0 -553
  188. package/tsconfig.json +0 -93
  189. package/tslint.json +0 -22
  190. package/types/libs/puppeteer.d.ts +0 -17
  191. package/types/pim/methods/checkIp.d.ts +0 -1
  192. /package/{types → dist}/algolia/clean.d.ts +0 -0
  193. /package/{types → dist}/algolia/config.d.ts +0 -0
  194. /package/{types → dist}/algolia/downloads.d.ts +0 -0
  195. /package/{types → dist}/algolia/families.d.ts +0 -0
  196. /package/{types → dist}/algolia/inspirations.d.ts +0 -0
  197. /package/{types → dist}/algolia/models.d.ts +0 -0
  198. /package/{types → dist}/algolia/news.d.ts +0 -0
  199. /package/{types → dist}/algolia/pressRelease.d.ts +0 -0
  200. /package/{types → dist}/algolia/pressReview.d.ts +0 -0
  201. /package/{types → dist}/algolia/products.d.ts +0 -0
  202. /package/{types → dist}/algolia/projects.d.ts +0 -0
  203. /package/{types → dist}/algolia/stories.d.ts +0 -0
  204. /package/{types → dist}/algolia/subFamilies.d.ts +0 -0
  205. /package/{types → dist}/algolia/subModels.d.ts +0 -0
  206. /package/{types → dist}/browser.d.ts +0 -0
  207. /package/{types → dist}/downloads/classes/manageEntry.d.ts +0 -0
  208. /package/{types → dist}/downloads/import.d.ts +0 -0
  209. /package/{types → dist}/index.d.ts +0 -0
  210. /package/{types → dist}/libs/contentful-cda.d.ts +0 -0
  211. /package/{types → dist}/libs/contentful.d.ts +0 -0
  212. /package/{types → dist}/libs/imgix.d.ts +0 -0
  213. /package/{types → dist}/libs/logs.d.ts +0 -0
  214. /package/{types → dist}/libs/netlify.d.ts +0 -0
  215. /package/{types → dist}/libs/notifications.d.ts +0 -0
  216. /package/{types → dist}/libs/pdf.d.ts +0 -0
  217. /package/{types → dist}/libs/s3.d.ts +0 -0
  218. /package/{types → dist}/libs/sentry.d.ts +0 -0
  219. /package/{types → dist}/pim/config.d.ts +0 -0
  220. /package/{types → dist}/pim/endpoints.d.ts +0 -0
  221. /package/{types → dist}/pim/methods/bulkPublish.d.ts +0 -0
  222. /package/{types → dist}/pim/methods/catalogs.d.ts +0 -0
  223. /package/{types → dist}/pim/methods/checkTopicDraftAndPagePublished.d.ts +0 -0
  224. /package/{types → dist}/pim/methods/designers.d.ts +0 -0
  225. /package/{types → dist}/pim/methods/dictionary.d.ts +0 -0
  226. /package/{types → dist}/pim/methods/families.d.ts +0 -0
  227. /package/{types → dist}/pim/methods/latestProducts.d.ts +0 -0
  228. /package/{types → dist}/pim/methods/migrateEntryFields.d.ts +0 -0
  229. /package/{types → dist}/pim/methods/models.d.ts +0 -0
  230. /package/{types → dist}/pim/methods/pages/catalogs.d.ts +0 -0
  231. /package/{types → dist}/pim/methods/pages/families.d.ts +0 -0
  232. /package/{types → dist}/pim/methods/pages/subfamilies.d.ts +0 -0
  233. /package/{types → dist}/pim/methods/products.d.ts +0 -0
  234. /package/{types → dist}/pim/methods/subfamilies.d.ts +0 -0
  235. /package/{types → dist}/pim/methods/submodels.d.ts +0 -0
  236. /package/{types → dist}/pim/request.d.ts +0 -0
  237. /package/{types → dist}/resources/AllProducts.d.ts +0 -0
  238. /package/{types → dist}/resources/Audit.d.ts +0 -0
  239. /package/{types → dist}/resources/CatalogDetails.d.ts +0 -0
  240. /package/{types → dist}/resources/CollectionModels.d.ts +0 -0
  241. /package/{types → dist}/resources/CollectionSubFamilies.d.ts +0 -0
  242. /package/{types → dist}/resources/CollectionSubModels.d.ts +0 -0
  243. /package/{types → dist}/resources/DProductSubLine.d.ts +0 -0
  244. /package/{types → dist}/resources/FamilyDetails.d.ts +0 -0
  245. /package/{types → dist}/resources/ProductDetails.d.ts +0 -0
  246. /package/{types → dist}/resources/ProductRelation.d.ts +0 -0
  247. /package/{types → dist}/resources/cfFields.d.ts +0 -0
  248. /package/{types → dist}/types.d.ts +0 -0
  249. /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
- };