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
package/src/libs/s3.ts
DELETED
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
import dotenv from "dotenv";
|
|
2
|
-
import axios from "@atoms-studio/axios";
|
|
3
|
-
import AWS from "aws-sdk";
|
|
4
|
-
import { basename, secondBetweenTwoDate } from "../utils";
|
|
5
|
-
import {
|
|
6
|
-
config as configPim,
|
|
7
|
-
checkConfig as checkPimConfig,
|
|
8
|
-
} from "../pim/config";
|
|
9
|
-
import https from "https";
|
|
10
|
-
import { AvailableCatalogs } from "../types";
|
|
11
|
-
import { log } from "./logs";
|
|
12
|
-
dotenv.config();
|
|
13
|
-
|
|
14
|
-
interface AWSConfig {
|
|
15
|
-
accessKeyId: string;
|
|
16
|
-
secretAccessKey: string;
|
|
17
|
-
region: string;
|
|
18
|
-
}
|
|
19
|
-
interface Config extends AWSConfig {
|
|
20
|
-
bucket: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export let config: Config;
|
|
24
|
-
export let s3: AWS.S3;
|
|
25
|
-
|
|
26
|
-
export const checkConfig = (skipInit: boolean = false): void => {
|
|
27
|
-
if (!skipInit) {
|
|
28
|
-
init();
|
|
29
|
-
}
|
|
30
|
-
const beforeMessage = "S3 - ";
|
|
31
|
-
const afterMessage: string =
|
|
32
|
-
'You must call "init" before using any s3 method';
|
|
33
|
-
if (typeof config === "undefined") {
|
|
34
|
-
throw new Error(beforeMessage + "config not found. " + afterMessage);
|
|
35
|
-
} else if (!config.accessKeyId) {
|
|
36
|
-
throw new Error(beforeMessage + "accessKeyId not found. " + afterMessage);
|
|
37
|
-
} else if (!config.secretAccessKey) {
|
|
38
|
-
throw new Error(
|
|
39
|
-
beforeMessage + "secretAccessKey not found. " + afterMessage
|
|
40
|
-
);
|
|
41
|
-
} else if (!config.region) {
|
|
42
|
-
throw new Error(beforeMessage + "region not found. " + afterMessage);
|
|
43
|
-
} else if (!config.bucket) {
|
|
44
|
-
throw new Error(beforeMessage + "bucket not found. " + afterMessage);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
AWS.config.update({
|
|
48
|
-
accessKeyId: config.accessKeyId,
|
|
49
|
-
secretAccessKey: config.secretAccessKey,
|
|
50
|
-
region: config.region,
|
|
51
|
-
});
|
|
52
|
-
s3 = new AWS.S3();
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export const init = (opts?: Config): void => {
|
|
56
|
-
if (!opts) {
|
|
57
|
-
opts = {
|
|
58
|
-
accessKeyId: process.env.FPI_AWS_ACCESS_KEY!,
|
|
59
|
-
secretAccessKey: process.env.FPI_AWS_SECRET_ACCESS_KEY!,
|
|
60
|
-
region: process.env.FPI_AWS_REGION!,
|
|
61
|
-
bucket: process.env.FPI_AWS_S3_BUCKET!,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
config = { ...opts };
|
|
65
|
-
checkConfig(true);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
export const listObjects = async (prefix: string = "") => {
|
|
69
|
-
checkConfig();
|
|
70
|
-
|
|
71
|
-
const params = {
|
|
72
|
-
Bucket: config.bucket /* required */,
|
|
73
|
-
Prefix: prefix || "", // Can be your folder name
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
return s3
|
|
77
|
-
.listObjectsV2(params)
|
|
78
|
-
.promise()
|
|
79
|
-
.then((data) => {
|
|
80
|
-
return data;
|
|
81
|
-
})
|
|
82
|
-
.catch((err) => {
|
|
83
|
-
console.log(err);
|
|
84
|
-
throw new Error("Not exist folder exception is not catch here!");
|
|
85
|
-
});
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* Upload file to s3
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* upload('https://domain.com/myimage.jpg', 'myimage.jpg', 'dir/subdir')
|
|
92
|
-
*
|
|
93
|
-
* @param url File URL
|
|
94
|
-
* @param fileName File name
|
|
95
|
-
* @param path Path of s3 in which to save the file
|
|
96
|
-
* @param metaData Object of metadata es: { metadata1: "value1", metadata2: "value2" } // See https://stackoverflow.com/a/50187528
|
|
97
|
-
* @returns
|
|
98
|
-
*/
|
|
99
|
-
export const upload = async (
|
|
100
|
-
url: string,
|
|
101
|
-
fileName: string = "",
|
|
102
|
-
path: string = "",
|
|
103
|
-
metaData: any = {}
|
|
104
|
-
) => {
|
|
105
|
-
checkConfig();
|
|
106
|
-
|
|
107
|
-
const agent = new https.Agent({
|
|
108
|
-
rejectUnauthorized: false,
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
const fileRes = await axios.get(url, {
|
|
112
|
-
httpsAgent: agent,
|
|
113
|
-
responseType: "arraybuffer",
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
if (fileRes.status !== 200) {
|
|
117
|
-
throw new Error(
|
|
118
|
-
`Status: ${fileRes.status}. ${fileRes.statusText} \n URL: ${fileRes.config.url}`
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (path && path.substr(-1) !== "/") {
|
|
123
|
-
path += "/";
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
fileName = fileName || basename(url);
|
|
127
|
-
|
|
128
|
-
let contentLength = Number(fileRes.headers["content-length"]);
|
|
129
|
-
if (!contentLength) {
|
|
130
|
-
contentLength = Number(fileRes.data.byteLength); // 93473
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const obj = {
|
|
134
|
-
Bucket: config.bucket, // unique bucket name
|
|
135
|
-
Key: `${path}${fileName}`, // s3 file path es: dir/subdir/filename.ext
|
|
136
|
-
ContentType: fileRes.headers["content-type"],
|
|
137
|
-
ContentLength: contentLength,
|
|
138
|
-
Body: fileRes.data, // buffer
|
|
139
|
-
Metadata: metaData,
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
return s3
|
|
143
|
-
.upload(obj)
|
|
144
|
-
.promise()
|
|
145
|
-
.then((data) => {
|
|
146
|
-
return data;
|
|
147
|
-
})
|
|
148
|
-
.catch((err) => {
|
|
149
|
-
throw new Error(err);
|
|
150
|
-
});
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
export const getFileFromS3 = async (
|
|
154
|
-
path: string,
|
|
155
|
-
returnUrl: boolean = false
|
|
156
|
-
): Promise<any> => {
|
|
157
|
-
checkConfig();
|
|
158
|
-
const url = `https://${config.bucket}.s3.${config.region}.amazonaws.com/${path}`;
|
|
159
|
-
try {
|
|
160
|
-
const res = await axios.get(url);
|
|
161
|
-
if (returnUrl) {
|
|
162
|
-
return url;
|
|
163
|
-
} else {
|
|
164
|
-
return res.data;
|
|
165
|
-
}
|
|
166
|
-
} catch (err: any) {
|
|
167
|
-
log(`S3 file not found. ${url}`);
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
export const saveCatalogToS3 = async (catalog: AvailableCatalogs) => {
|
|
173
|
-
checkPimConfig();
|
|
174
|
-
checkConfig();
|
|
175
|
-
|
|
176
|
-
const timeStart = new Date();
|
|
177
|
-
const dateNow = new Date();
|
|
178
|
-
const dateDirName = dateNow.toISOString().split("T")[0]; // 2021-05-07T13-35-00-057Z
|
|
179
|
-
|
|
180
|
-
const path = `pim/${dateDirName}/catalog/`;
|
|
181
|
-
const fileName = `catalogs-${catalog}.json`;
|
|
182
|
-
const fileUrl = `${configPim.baseURL}catalogs?onlyweb=true&catalog=${catalog}`;
|
|
183
|
-
|
|
184
|
-
log(`Uploading "${fileName}" to S3 path "${path}"`, "INFO");
|
|
185
|
-
await upload(fileUrl, fileName, path);
|
|
186
|
-
log(`"${fileName}" saved to S3`);
|
|
187
|
-
|
|
188
|
-
const timeEnd = new Date();
|
|
189
|
-
const seconds = secondBetweenTwoDate(timeStart, timeEnd);
|
|
190
|
-
log(`Request time: ${seconds} seconds - saveCatalogToS3`);
|
|
191
|
-
|
|
192
|
-
return `${path}${fileName}`;
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
export const saveAllProductsToS3 = async (
|
|
196
|
-
catalog: AvailableCatalogs,
|
|
197
|
-
lastModified: string
|
|
198
|
-
) => {
|
|
199
|
-
checkPimConfig();
|
|
200
|
-
checkConfig();
|
|
201
|
-
|
|
202
|
-
const timeStart = new Date();
|
|
203
|
-
const dateNow = new Date();
|
|
204
|
-
const dateDirName = dateNow.toISOString().split("T")[0]; // 2021-05-07
|
|
205
|
-
|
|
206
|
-
const path = `pim/${dateDirName}/all-products/`;
|
|
207
|
-
const fileName = `all-products-${catalog}-${lastModified}.json`;
|
|
208
|
-
const fileUrl = `${configPim.baseURL}products/?onlyweb=true&catalog=${catalog}&lastModified=${lastModified}`;
|
|
209
|
-
|
|
210
|
-
log(`Uploading "${fileName}" to S3 path "${path}"`, "INFO");
|
|
211
|
-
await upload(fileUrl, fileName, path);
|
|
212
|
-
log(`"${fileName}" saved to S3`);
|
|
213
|
-
|
|
214
|
-
const timeEnd = new Date();
|
|
215
|
-
const seconds = secondBetweenTwoDate(timeStart, timeEnd);
|
|
216
|
-
log(`Request time: ${seconds} seconds - saveAllProductsToS3`);
|
|
217
|
-
|
|
218
|
-
return `${path}${fileName}`;
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
export const saveJsonToS3 = async (
|
|
222
|
-
obj: any,
|
|
223
|
-
fileName: string = "",
|
|
224
|
-
path: string = ""
|
|
225
|
-
) => {
|
|
226
|
-
checkConfig();
|
|
227
|
-
const timeStart = new Date();
|
|
228
|
-
|
|
229
|
-
if (typeof obj !== "string") {
|
|
230
|
-
obj = JSON.stringify(obj);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const buf = Buffer.from(obj);
|
|
234
|
-
|
|
235
|
-
// add trailing slash
|
|
236
|
-
if (path && path.substr(-1) !== "/") {
|
|
237
|
-
path += "/";
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const data = {
|
|
241
|
-
Bucket: config.bucket, // unique bucket name
|
|
242
|
-
Key: `${path}${fileName}`, // s3 file path es: dir/subdir/filename.ext
|
|
243
|
-
ContentEncoding: "base64",
|
|
244
|
-
ContentType: "application/json",
|
|
245
|
-
ContentLength: Number(buf.byteLength),
|
|
246
|
-
Body: buf,
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
return s3
|
|
250
|
-
.upload(data)
|
|
251
|
-
.promise()
|
|
252
|
-
.then((res) => {
|
|
253
|
-
const timeEnd = new Date();
|
|
254
|
-
const seconds = secondBetweenTwoDate(timeStart, timeEnd);
|
|
255
|
-
log(`Request time: ${seconds} seconds - saveJsonToS3`);
|
|
256
|
-
return res;
|
|
257
|
-
})
|
|
258
|
-
.catch((err) => {
|
|
259
|
-
throw new Error(err);
|
|
260
|
-
});
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Save PDF to S3
|
|
265
|
-
*
|
|
266
|
-
* @param pdf
|
|
267
|
-
* @param fileName E.g. my-file
|
|
268
|
-
* @param path E.g. tech-spec
|
|
269
|
-
* @returns url
|
|
270
|
-
*/
|
|
271
|
-
export const savePDFToS3 = async (
|
|
272
|
-
pdf: any,
|
|
273
|
-
fileName: string,
|
|
274
|
-
path: string = ""
|
|
275
|
-
) => {
|
|
276
|
-
fileName = !fileName.match(/\.pdf?$/) ? fileName + ".pdf" : fileName;
|
|
277
|
-
log(`savePDFToS3 - fileName: ${fileName} path: ${path}`);
|
|
278
|
-
checkConfig();
|
|
279
|
-
const timeStart = new Date();
|
|
280
|
-
|
|
281
|
-
// add trailing slash
|
|
282
|
-
if (path && path.substr(-1) !== "/") {
|
|
283
|
-
path += "/";
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const s3Params = {
|
|
287
|
-
Bucket: config.bucket, // unique bucket name
|
|
288
|
-
Key: `${path}${fileName}`, // s3 file path es: dir/subdir/filename.ext
|
|
289
|
-
Body: pdf,
|
|
290
|
-
ContentType: "application/pdf",
|
|
291
|
-
ServerSideEncryption: "AES256",
|
|
292
|
-
};
|
|
293
|
-
let url;
|
|
294
|
-
try {
|
|
295
|
-
s3.getBucketWebsite();
|
|
296
|
-
await s3.putObject(s3Params).promise();
|
|
297
|
-
url = `https://${config.bucket}.s3.${config.region}.amazonaws.com/${path}${fileName}`;
|
|
298
|
-
} catch (err: any) {
|
|
299
|
-
console.log(err);
|
|
300
|
-
}
|
|
301
|
-
const timeEnd = new Date();
|
|
302
|
-
const seconds = secondBetweenTwoDate(timeStart, timeEnd);
|
|
303
|
-
log(`Request time: ${seconds} seconds - savePDFToS3`);
|
|
304
|
-
return url;
|
|
305
|
-
};
|
package/src/libs/sentry.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import dotenv from "dotenv";
|
|
2
|
-
dotenv.config();
|
|
3
|
-
import * as Sentry from "@sentry/node";
|
|
4
|
-
// import * as Tracing from "@sentry/tracing";
|
|
5
|
-
let sentryInitialized = false;
|
|
6
|
-
|
|
7
|
-
export const initSentry = async () => {
|
|
8
|
-
if (process.env.FPI_SENTRY_DSN) {
|
|
9
|
-
const sentry = await Sentry.init({
|
|
10
|
-
dsn: process.env.FPI_SENTRY_DSN,
|
|
11
|
-
|
|
12
|
-
// Set tracesSampleRate to 1.0 to capture 100%
|
|
13
|
-
// of transactions for performance monitoring.
|
|
14
|
-
// We recommend adjusting this value in production
|
|
15
|
-
tracesSampleRate: Number(process.env.FPI_SENTRY_TRACE_SAMPLE_RATE) || 1.0,
|
|
16
|
-
});
|
|
17
|
-
sentryInitialized = true;
|
|
18
|
-
return sentry;
|
|
19
|
-
} else {
|
|
20
|
-
throw new Error("No FPI_SENTRY_DSN evironment var found");
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export const reportError = async (error: any) => {
|
|
25
|
-
if (!sentryInitialized) await initSentry();
|
|
26
|
-
|
|
27
|
-
if (typeof error === "string") {
|
|
28
|
-
Sentry.captureMessage(error);
|
|
29
|
-
} else {
|
|
30
|
-
Sentry.captureException(error);
|
|
31
|
-
}
|
|
32
|
-
await Sentry.flush();
|
|
33
|
-
};
|
package/src/pim/config.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import dotenv from "dotenv";
|
|
2
|
-
import { resetBaseRequest } from "./request";
|
|
3
|
-
dotenv.config();
|
|
4
|
-
|
|
5
|
-
export interface Config {
|
|
6
|
-
baseURL: string;
|
|
7
|
-
username?: string;
|
|
8
|
-
password?: string;
|
|
9
|
-
timeout?: number;
|
|
10
|
-
sslverify?: boolean;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const defaultConfig: Readonly<Config> = {
|
|
14
|
-
baseURL: "",
|
|
15
|
-
username: "",
|
|
16
|
-
password: "",
|
|
17
|
-
timeout: 300,
|
|
18
|
-
sslverify: true,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export let config: Config = { ...defaultConfig };
|
|
22
|
-
|
|
23
|
-
export const resetConfig = (): void => {
|
|
24
|
-
Object.assign(config, defaultConfig);
|
|
25
|
-
resetBaseRequest();
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const checkConfig = (skipInit: boolean = false) => {
|
|
29
|
-
if (!skipInit) {
|
|
30
|
-
init();
|
|
31
|
-
}
|
|
32
|
-
if (!Object.entries(config).length) {
|
|
33
|
-
throw new Error("Required parameters not found");
|
|
34
|
-
} else if (!config.baseURL) {
|
|
35
|
-
throw new Error("Missing pim baseURL");
|
|
36
|
-
} else if (
|
|
37
|
-
typeof config.timeout !== "undefined" &&
|
|
38
|
-
(isNaN(config.timeout) || config.timeout === 0)
|
|
39
|
-
) {
|
|
40
|
-
throw new Error("The pim timeout value is not valid");
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export const init = (providedConfig?: Config) => {
|
|
45
|
-
const hasPrarams = !!(
|
|
46
|
-
providedConfig && Object.entries(providedConfig).length
|
|
47
|
-
);
|
|
48
|
-
if (!hasPrarams) {
|
|
49
|
-
providedConfig = {
|
|
50
|
-
baseURL: process.env.FPI_PIM_BASE_URL!,
|
|
51
|
-
username: process.env.FPI_PIM_USERNAME,
|
|
52
|
-
password: process.env.FPI_PIM_PASSWORD,
|
|
53
|
-
timeout: Number(process.env.FPI_PIM_TIMEOUT) || 300,
|
|
54
|
-
sslverify: process.env.FPI_PIM_SSL_VERIFY === "true",
|
|
55
|
-
};
|
|
56
|
-
} else if (!providedConfig) {
|
|
57
|
-
throw new Error("Configuration params not found");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// required params
|
|
61
|
-
config.baseURL = providedConfig.baseURL;
|
|
62
|
-
|
|
63
|
-
// optional params
|
|
64
|
-
config.username =
|
|
65
|
-
typeof providedConfig.username !== "undefined"
|
|
66
|
-
? providedConfig.username
|
|
67
|
-
: defaultConfig.username;
|
|
68
|
-
config.password =
|
|
69
|
-
typeof providedConfig.password !== "undefined"
|
|
70
|
-
? providedConfig.password
|
|
71
|
-
: defaultConfig.password;
|
|
72
|
-
config.timeout =
|
|
73
|
-
typeof providedConfig.timeout !== "undefined"
|
|
74
|
-
? Number(providedConfig.timeout)
|
|
75
|
-
: defaultConfig.timeout;
|
|
76
|
-
config.sslverify =
|
|
77
|
-
typeof providedConfig.sslverify !== "undefined"
|
|
78
|
-
? !!providedConfig.sslverify
|
|
79
|
-
: defaultConfig.sslverify;
|
|
80
|
-
|
|
81
|
-
checkConfig(true);
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
export const getConfig = (): Readonly<Config> => config;
|