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,339 +0,0 @@
1
- import { log } from "../libs/logs";
2
- import {
3
- getClient,
4
- getEnvironmentDefaultLocaleCode,
5
- getEntryByID,
6
- getTopicPage,
7
- } from "../libs/contentful-cda";
8
- import { cfLocales } from "../libs/contentful";
9
- import { getIndex, AvailableIndicesKey, removeIndexObject } from "./config";
10
- import {
11
- getAllTranslations,
12
- getLocalISOTime,
13
- secondBetweenTwoDate,
14
- } from "../utils";
15
- import type { Entry } from "contentful-management/dist/typings/entities/entry";
16
- import {
17
- CfLocalizedEntryField,
18
- AlgoliaPaginateRecords,
19
- WrapperImageFields,
20
- } from "../types";
21
- import { getWrapperImgixFields } from "../libs/imgix";
22
-
23
- const indexKey: AvailableIndicesKey = "projects";
24
-
25
- export type AlgoliaProjectRecord = {
26
- objectID: string;
27
- name?: CfLocalizedEntryField;
28
- slugs?: {};
29
- isProtected?: boolean;
30
- isBespoke?: boolean;
31
- categories?: string[];
32
- categoriesLocalized?: {};
33
- applications?: string[];
34
- locations?: string[];
35
- thumbnailImgix?: WrapperImageFields | {};
36
- fullPageImageImgix?: WrapperImageFields | {};
37
- locationLabel?: string;
38
- casambiUsed?: boolean;
39
- visualizationDate?: string;
40
- location?: {};
41
- lastSyncDate?: string;
42
- hideInRegions?: string[];
43
- };
44
-
45
- const isObjectToDelete = (
46
- object: any,
47
- defaultEnvironmentLocaleCode: string
48
- ) => {
49
- return !object?.slugs?.[defaultEnvironmentLocaleCode];
50
- };
51
-
52
- const getObject = async (
53
- topicProject: Entry
54
- ): Promise<AlgoliaProjectRecord> => {
55
- const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
56
- log(`Sync the ${topicProject.sys.id} topicProject...`);
57
- let topicProjectWithFields: Entry = topicProject;
58
-
59
- if (!topicProjectWithFields?.fields) {
60
- log(`Get the ${topicProject.sys.id} topicProject details...`);
61
- topicProjectWithFields = await getEntryByID(
62
- topicProject.sys.id,
63
- "topicProject"
64
- );
65
- }
66
-
67
- if (!topicProjectWithFields) {
68
- log(`The topicProject ${topicProject.sys.id} not found`, "WARN");
69
-
70
- const recordFail: AlgoliaProjectRecord = {
71
- objectID: topicProject?.sys?.id,
72
- };
73
-
74
- return recordFail; // return objectID to delete the record if it exists
75
- }
76
-
77
- log(`Get page details...`);
78
- const page = await getTopicPage(
79
- topicProject.sys.id,
80
- "fields.slug,fields.protected,fields.hideInRegions"
81
- );
82
-
83
- if (!page) {
84
- log(`The topicProject page ${topicProject.sys.id} not found`, "WARN");
85
-
86
- const recordFail: AlgoliaProjectRecord = {
87
- objectID: topicProject?.sys?.id,
88
- };
89
-
90
- return recordFail; // return objectID to delete the record if it exists
91
- }
92
-
93
- const slugs = await getAllTranslations(page?.fields.slug || {});
94
- const isProtected = !!page?.fields?.protected?.[defaultEnvironmentLocaleCode];
95
-
96
- log(`Get thumbnail imgix details...`);
97
- let thumbnailImgix = {};
98
- const thumbnailImgixWrapperImgixID =
99
- topicProjectWithFields?.fields?.thumbnailImgix?.[
100
- defaultEnvironmentLocaleCode
101
- ]?.sys.id;
102
- if (thumbnailImgixWrapperImgixID) {
103
- thumbnailImgix = await getWrapperImgixFields(thumbnailImgixWrapperImgixID);
104
- } else {
105
- log(`No thumbnail imgix found`, "WARN");
106
- }
107
-
108
- log(`Get fullPageImage imgix details...`);
109
- let fullPageImageImgix = {};
110
- const fullPageImageImgixWrapperImgixID =
111
- topicProjectWithFields?.fields?.fullPageImageImgix?.[
112
- defaultEnvironmentLocaleCode
113
- ]?.sys.id;
114
- if (fullPageImageImgixWrapperImgixID) {
115
- fullPageImageImgix = await getWrapperImgixFields(
116
- fullPageImageImgixWrapperImgixID
117
- );
118
- } else {
119
- log(`No fullPageImage imgix found`, "WARN");
120
- }
121
-
122
- log(`Get categories details...`);
123
- const categories: string[] = [];
124
- const categoriesLocalized: any = {};
125
- const categoriesIDs = topicProjectWithFields?.fields?.categories?.[
126
- defaultEnvironmentLocaleCode
127
- ]?.map((category: Entry) => category.sys.id);
128
- if (categoriesIDs?.length) {
129
- for (const categoryID of categoriesIDs) {
130
- const category = await getEntryByID(
131
- categoryID,
132
- "topicProjectCategory",
133
- "fields.title"
134
- );
135
- categories.push(
136
- category?.fields?.title?.[defaultEnvironmentLocaleCode] || ""
137
- );
138
- for (const locale of cfLocales) {
139
- if (!categoriesLocalized?.locale) categoriesLocalized[locale] = [];
140
-
141
- categoriesLocalized[locale].push(
142
- category?.fields?.title?.[locale] ||
143
- category?.fields?.title?.[defaultEnvironmentLocaleCode]
144
- );
145
- }
146
- }
147
- } else {
148
- log(`No categories found`, "WARN");
149
- }
150
-
151
- log(`Get location details...`);
152
- let location = {};
153
- if (
154
- topicProjectWithFields?.fields?.location?.[defaultEnvironmentLocaleCode]
155
- ) {
156
- location =
157
- topicProjectWithFields?.fields?.location?.[defaultEnvironmentLocaleCode];
158
- } else {
159
- log(`No location found`, "WARN");
160
- }
161
-
162
- log(`Get hideInRegions details...`);
163
- const hideInRegions =
164
- page.fields.hideInRegions?.[defaultEnvironmentLocaleCode].map(
165
- (item: Entry) => item.sys.id
166
- ) || [];
167
-
168
- // Single record
169
- const record: AlgoliaProjectRecord = {
170
- objectID: topicProjectWithFields.sys.id,
171
- name:
172
- topicProjectWithFields?.fields?.title?.[defaultEnvironmentLocaleCode] ||
173
- "",
174
- slugs,
175
- isProtected,
176
- isBespoke:
177
- !!topicProjectWithFields?.fields?.isBespokeProject?.[
178
- defaultEnvironmentLocaleCode
179
- ],
180
- categories,
181
- categoriesLocalized,
182
- applications:
183
- topicProjectWithFields?.fields?.applications?.[
184
- defaultEnvironmentLocaleCode
185
- ] || [],
186
- locations:
187
- topicProjectWithFields?.fields?.locations?.[
188
- defaultEnvironmentLocaleCode
189
- ] || [],
190
- locationLabel:
191
- topicProjectWithFields?.fields?.locationLabel?.[
192
- defaultEnvironmentLocaleCode
193
- ] || "",
194
- casambiUsed:
195
- !!topicProjectWithFields?.fields?.casambiUseInThisProject?.[
196
- defaultEnvironmentLocaleCode
197
- ],
198
- thumbnailImgix,
199
- fullPageImageImgix,
200
- visualizationDate:
201
- topicProjectWithFields?.fields?.visualizationDate?.[
202
- defaultEnvironmentLocaleCode
203
- ] || "",
204
- location,
205
- hideInRegions,
206
- lastSyncDate: getLocalISOTime(),
207
- };
208
-
209
- return record;
210
- };
211
-
212
- export const reindexProject = async (topicProjectId: string) => {
213
- const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
214
- const timeStart = new Date();
215
-
216
- log(`reindexProject - entryId: ${topicProjectId} `);
217
-
218
- const topicProject = await getEntryByID(topicProjectId, "topicProject");
219
-
220
- const index = getIndex(indexKey);
221
- let record = null;
222
- if (!topicProject) {
223
- log(
224
- `No topicProjectId found with id ${topicProjectId}. Delete object if exists`,
225
- "WARN"
226
- );
227
- record = await index.deleteObject(topicProjectId);
228
- return { ...record };
229
- }
230
-
231
- const object = await getObject(topicProject);
232
-
233
- // Save record to Algolia
234
- if (!isObjectToDelete(object, defaultEnvironmentLocaleCode)) {
235
- log(`Save object`);
236
- record = await index.saveObject(object);
237
- } else {
238
- log(`Delete object`);
239
- record = await index.deleteObject(object.objectID);
240
- }
241
- const timeEnd = new Date();
242
- const seconds = secondBetweenTwoDate(timeStart, timeEnd);
243
- log(`Execution time: ${seconds} seconds`);
244
-
245
- return { ...record, ...object };
246
- };
247
-
248
- /**
249
- * Get Objects
250
- *
251
- * @param offset
252
- * @param limit
253
- * @param filterKey
254
- * @param filterValue
255
- * @returns
256
- */
257
- const getObjects = async (
258
- offset: number,
259
- limit: number,
260
- filterKey?: string,
261
- filterValue?: string
262
- ): Promise<AlgoliaPaginateRecords> => {
263
- const client = await getClient();
264
-
265
- const opts: any = {
266
- content_type: "topicProject",
267
- limit,
268
- skip: offset,
269
- // select: "",
270
- };
271
- if (filterKey && filterValue) {
272
- opts[filterKey] = filterValue;
273
- }
274
- const { items, total } = await client.withAllLocales.getEntries(opts);
275
-
276
- const objects: AlgoliaProjectRecord[] = [];
277
- let count: number = Number(offset);
278
- for (const topicProduct of items) {
279
- log(`${++count} of ${total}`, "INFO");
280
- const timeStart = new Date();
281
- const record = await getObject(topicProduct);
282
- const timeEnd = new Date();
283
- const seconds = secondBetweenTwoDate(timeStart, timeEnd);
284
- log(`Execution time: ${seconds} seconds`);
285
- objects.push(record);
286
- }
287
-
288
- return {
289
- objects,
290
- offset: Number(offset) + Number(limit),
291
- limit: Number(limit),
292
- completed: count >= total, // if is true the import is completed
293
- total,
294
- };
295
- };
296
-
297
- export const reindexProjects = async (
298
- offset: number = 0,
299
- limit: number = 50,
300
- filterKey: string = "",
301
- filterValue: string = ""
302
- ) => {
303
- const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
304
- const timeStart = new Date();
305
- log(
306
- `reindexProjects - filterKey: ${filterKey} filterValue: ${filterValue} offset: ${offset} limit: ${limit} `
307
- );
308
-
309
- const records = await getObjects(offset, limit, filterKey, filterValue);
310
- const objectsToSave = records.objects.filter(
311
- (object) => !isObjectToDelete(object, defaultEnvironmentLocaleCode)
312
- );
313
- const objectIdsToDelete = records.objects
314
- .filter((object) => isObjectToDelete(object, defaultEnvironmentLocaleCode))
315
- .map((object) => object.objectID);
316
-
317
- // Save records to Algolia
318
- const index = getIndex(indexKey);
319
- log(`Save ${objectsToSave.length} objects to ${index.indexName} index`);
320
- const savedObjectIDs = await index.saveObjects(objectsToSave);
321
- log(
322
- `Delete ${objectIdsToDelete.length} objects from ${index.indexName} index`
323
- );
324
- const deletedObjectIDs = await index.deleteObjects(objectIdsToDelete);
325
-
326
- const timeEnd = new Date();
327
- const seconds = secondBetweenTwoDate(timeStart, timeEnd);
328
- log(`Execution time: ${seconds} seconds`);
329
-
330
- return {
331
- ...records,
332
- savedObjectIDs: savedObjectIDs.objectIDs,
333
- deletedObjectIDs: deletedObjectIDs.objectIDs,
334
- };
335
- };
336
-
337
- export const removeProjectObject = async (objectId: string) => {
338
- return removeIndexObject(objectId, indexKey);
339
- };
@@ -1,347 +0,0 @@
1
- import { log } from "../libs/logs";
2
- import {
3
- getClient,
4
- getEnvironmentDefaultLocaleCode,
5
- getEntryByID,
6
- getTopicPage,
7
- } from "../libs/contentful-cda";
8
- import { getIndex, AvailableIndicesKey, removeIndexObject } from "./config";
9
- import {
10
- getAllTranslations,
11
- getLocalISOTime,
12
- secondBetweenTwoDate,
13
- } from "../utils";
14
- import type { Entry } from "contentful-management/dist/typings/entities/entry";
15
- import {
16
- CfLocalizedEntryField,
17
- AlgoliaPaginateRecords,
18
- WrapperImageFields,
19
- } from "../types";
20
- import { getWrapperImgixFields } from "../libs/imgix";
21
- import removeMd from "remove-markdown";
22
-
23
- const indexKey: AvailableIndicesKey = "stories";
24
-
25
- export type AlgoliaStoryRecord = {
26
- objectID: string;
27
- name?: CfLocalizedEntryField;
28
- excerpt?: CfLocalizedEntryField;
29
- previewExcerpt?: CfLocalizedEntryField;
30
- description?: CfLocalizedEntryField;
31
- slugs?: {};
32
- isProtected?: boolean;
33
- fullScreenImageImgix?: WrapperImageFields | {};
34
- previewImagesImgix?: any;
35
- video?: {};
36
- category?: {};
37
- previewLayout?: string;
38
- visualizationDate?: string;
39
- lastSyncDate?: string;
40
- hideInRegions?: string[];
41
- };
42
-
43
- const isObjectToDelete = (
44
- object: any,
45
- defaultEnvironmentLocaleCode: string
46
- ) => {
47
- return !object?.slugs?.[defaultEnvironmentLocaleCode];
48
- };
49
-
50
- const getObject = async (topicStory: Entry): Promise<AlgoliaStoryRecord> => {
51
- const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
52
- log(`Sync the ${topicStory.sys.id} topicStory...`);
53
- let topicStoryWithFields: Entry = topicStory;
54
-
55
- const emptyLocalizedField: CfLocalizedEntryField = {
56
- [defaultEnvironmentLocaleCode]: "",
57
- };
58
-
59
- if (!topicStoryWithFields?.fields) {
60
- log(`Get the ${topicStory.sys.id} topicStory details...`);
61
- topicStoryWithFields = await getEntryByID(topicStory.sys.id, "topicStory");
62
- }
63
-
64
- if (!topicStoryWithFields) {
65
- log(`The topicStory ${topicStory.sys.id} not found`, "WARN");
66
-
67
- const recordFail: AlgoliaStoryRecord = {
68
- objectID: topicStory?.sys?.id,
69
- };
70
-
71
- return recordFail; // return objectID to delete the record if it exists
72
- }
73
-
74
- log(`Get page details...`);
75
- const page = await getTopicPage(
76
- topicStory.sys.id,
77
- "fields.slug,fields.protected,fields.hideInRegions"
78
- );
79
-
80
- if (!page) {
81
- log(`The topicStory page ${topicStory.sys.id} not found`, "WARN");
82
-
83
- const recordFail: AlgoliaStoryRecord = {
84
- objectID: topicStory?.sys?.id,
85
- };
86
-
87
- return recordFail; // return objectID to delete the record if it exists
88
- }
89
-
90
- const slugs = await getAllTranslations(page?.fields.slug || {});
91
- const isProtected = !!page?.fields?.protected?.[defaultEnvironmentLocaleCode];
92
-
93
- log(`Get Full Screen Image Imgix details...`);
94
- let fullScreenImageImgix = {};
95
- const fullScreenImageImgixWrapperImgixID =
96
- topicStory?.fields?.fullScreenImageImgix?.[defaultEnvironmentLocaleCode]
97
- ?.sys.id;
98
- if (fullScreenImageImgixWrapperImgixID) {
99
- fullScreenImageImgix = await getWrapperImgixFields(
100
- fullScreenImageImgixWrapperImgixID
101
- );
102
- } else {
103
- log(`No Full Screen Image Imgix found`, "WARN");
104
- }
105
-
106
- log(`Get Preview Images Imgix details...`);
107
- const previewImagesImgix = [];
108
- if (topicStory?.fields?.previewImagesImgix?.[defaultEnvironmentLocaleCode]) {
109
- for (const previewImageImgix of topicStory.fields.previewImagesImgix[
110
- defaultEnvironmentLocaleCode
111
- ]) {
112
- const previewImagesImgixWrapperImgixID = previewImageImgix?.sys.id;
113
- if (previewImagesImgixWrapperImgixID) {
114
- const currentPreviewImagesImgix = await getWrapperImgixFields(
115
- previewImagesImgixWrapperImgixID
116
- );
117
- previewImagesImgix.push(currentPreviewImagesImgix);
118
- }
119
- }
120
- } else {
121
- log(`No Preview Images Imgix found`, "WARN");
122
- }
123
-
124
- log(`Get videoId details...`);
125
- let video = {};
126
- if (topicStory.fields?.video?.[defaultEnvironmentLocaleCode]?.sys?.id) {
127
- const componentVideo = await getEntryByID(
128
- topicStory.fields.video[defaultEnvironmentLocaleCode].sys.id,
129
- "componentVideo"
130
- );
131
- let posterImage = {};
132
- if (
133
- componentVideo?.fields?.posterImgix?.[defaultEnvironmentLocaleCode]?.sys
134
- ?.id
135
- ) {
136
- const posterImgixId =
137
- componentVideo?.fields?.posterImgix?.[defaultEnvironmentLocaleCode]?.sys
138
- .id;
139
- posterImage = await getWrapperImgixFields(posterImgixId);
140
- }
141
- video = {
142
- id: componentVideo?.fields?.videoId?.[defaultEnvironmentLocaleCode] || "",
143
- type: componentVideo?.fields?.type?.[defaultEnvironmentLocaleCode] || "",
144
- posterImage,
145
- };
146
- } else {
147
- log(`No videoId found`, "WARN");
148
- }
149
-
150
- log(`Get category details...`);
151
- let category = {};
152
- if (topicStory.fields?.category?.[defaultEnvironmentLocaleCode]?.sys?.id) {
153
- const categoryEntry = await getEntryByID(
154
- topicStory.fields.category[defaultEnvironmentLocaleCode].sys.id,
155
- "topicStoryCategory"
156
- );
157
- if (categoryEntry) {
158
- category = {
159
- sysId: topicStory.fields.category[defaultEnvironmentLocaleCode].sys.id,
160
- title: await getAllTranslations(categoryEntry?.fields?.title || {}),
161
- priority: await getAllTranslations(
162
- categoryEntry?.fields?.priority || {}
163
- ),
164
- };
165
- } else {
166
- log(`No categoryEntry found`, "WARN");
167
- }
168
- } else {
169
- log(`No category found`, "WARN");
170
- }
171
-
172
- const clearExcerpt = {};
173
- for (const locale in topicStoryWithFields?.fields?.excerpt) {
174
- if (topicStoryWithFields?.fields?.excerpt?.[locale]) {
175
- (clearExcerpt as any)[locale] = removeMd(
176
- topicStoryWithFields?.fields?.excerpt?.[locale]
177
- );
178
- }
179
- }
180
-
181
- log(`Get hideInRegions details...`);
182
- const hideInRegions =
183
- page.fields.hideInRegions?.[defaultEnvironmentLocaleCode].map(
184
- (item: Entry) => item.sys.id
185
- ) || [];
186
-
187
- // Single record
188
- const record: AlgoliaStoryRecord = {
189
- objectID: topicStoryWithFields.sys.id,
190
- name: await getAllTranslations(
191
- topicStoryWithFields?.fields?.title || emptyLocalizedField
192
- ),
193
- excerpt: await getAllTranslations(
194
- topicStoryWithFields?.fields?.excerpt ? clearExcerpt : emptyLocalizedField
195
- ),
196
- description: await getAllTranslations(
197
- topicStoryWithFields?.fields?.description || emptyLocalizedField
198
- ),
199
- slugs,
200
- isProtected,
201
- fullScreenImageImgix,
202
- previewImagesImgix,
203
- video,
204
- category,
205
- previewLayout:
206
- topicStoryWithFields?.fields?.previewLayout?.[
207
- defaultEnvironmentLocaleCode
208
- ] || "",
209
- visualizationDate:
210
- topicStoryWithFields?.fields?.visualizationDate?.[
211
- defaultEnvironmentLocaleCode
212
- ] || "",
213
- hideInRegions,
214
- lastSyncDate: getLocalISOTime(),
215
- };
216
-
217
- return record;
218
- };
219
-
220
- export const reindexStory = async (topicStoryId: string) => {
221
- const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
222
- const timeStart = new Date();
223
-
224
- log(`reindexStory - entryId: ${topicStoryId} `);
225
-
226
- const topicStory = await getEntryByID(topicStoryId, "topicStory");
227
-
228
- const index = getIndex(indexKey);
229
- let record = null;
230
- if (!topicStory) {
231
- log(
232
- `No topicStoryId found with id ${topicStoryId}. Delete object if exists`,
233
- "WARN"
234
- );
235
- record = await index.deleteObject(topicStoryId);
236
- return { ...record };
237
- }
238
-
239
- const object = await getObject(topicStory);
240
-
241
- // Save record to Algolia
242
- if (!isObjectToDelete(object, defaultEnvironmentLocaleCode)) {
243
- log(`Save object to ${index.indexName} index`);
244
- record = await index.saveObject(object);
245
- } else {
246
- log(`Delete object from ${index.indexName} index`);
247
- record = await index.deleteObject(object.objectID);
248
- }
249
- const timeEnd = new Date();
250
- const seconds = secondBetweenTwoDate(timeStart, timeEnd);
251
- log(`Execution time: ${seconds} seconds`);
252
-
253
- return { ...record, ...object };
254
- };
255
-
256
- /**
257
- * Get Objects
258
- *
259
- * @param offset
260
- * @param limit
261
- * @param filterKey
262
- * @param filterValue
263
- * @returns
264
- */
265
- const getObjects = async (
266
- offset: number,
267
- limit: number,
268
- filterKey?: string,
269
- filterValue?: string
270
- ): Promise<AlgoliaPaginateRecords> => {
271
- const client = await getClient();
272
-
273
- const opts: any = {
274
- content_type: "topicStory",
275
- limit,
276
- skip: offset,
277
- // select: "",
278
- };
279
- if (filterKey && filterValue) {
280
- opts[filterKey] = filterValue;
281
- }
282
- const { items, total } = await client.withAllLocales.getEntries(opts);
283
-
284
- const objects: AlgoliaStoryRecord[] = [];
285
- let count: number = Number(offset);
286
- for (const topicStory of items) {
287
- log(`${++count} of ${total}`, "INFO");
288
- const timeStart = new Date();
289
- const record = await getObject(topicStory);
290
- const timeEnd = new Date();
291
- const seconds = secondBetweenTwoDate(timeStart, timeEnd);
292
- log(`Execution time: ${seconds} seconds`);
293
- objects.push(record);
294
- }
295
-
296
- return {
297
- objects,
298
- offset: Number(offset) + Number(limit),
299
- limit: Number(limit),
300
- completed: count >= total, // if is true the import is completed
301
- total,
302
- };
303
- };
304
-
305
- export const reindexStories = async (
306
- offset: number = 0,
307
- limit: number = 50,
308
- filterKey: string = "",
309
- filterValue: string = ""
310
- ) => {
311
- const defaultEnvironmentLocaleCode = await getEnvironmentDefaultLocaleCode();
312
- const timeStart = new Date();
313
- log(
314
- `reindexStories - filterKey: ${filterKey} filterValue: ${filterValue} offset: ${offset} limit: ${limit} `
315
- );
316
-
317
- const records = await getObjects(offset, limit, filterKey, filterValue);
318
- const objectsToSave = records.objects.filter(
319
- (object) => !isObjectToDelete(object, defaultEnvironmentLocaleCode)
320
- );
321
- const objectIdsToDelete = records.objects
322
- .filter((object) => isObjectToDelete(object, defaultEnvironmentLocaleCode))
323
- .map((object) => object.objectID);
324
-
325
- // Save records to Algolia
326
- const index = getIndex(indexKey);
327
- log(`Save ${objectsToSave.length} objects to ${index.indexName} index`);
328
- const savedObjectIDs = await index.saveObjects(objectsToSave);
329
- log(
330
- `Delete ${objectIdsToDelete.length} objects from ${index.indexName} index`
331
- );
332
- const deletedObjectIDs = await index.deleteObjects(objectIdsToDelete);
333
-
334
- const timeEnd = new Date();
335
- const seconds = secondBetweenTwoDate(timeStart, timeEnd);
336
- log(`Execution time: ${seconds} seconds`);
337
-
338
- return {
339
- ...records,
340
- savedObjectIDs: savedObjectIDs.objectIDs,
341
- deletedObjectIDs: deletedObjectIDs.objectIDs,
342
- };
343
- };
344
-
345
- export const removeStoryObject = async (objectId: string) => {
346
- return removeIndexObject(objectId, indexKey);
347
- };