@cloudcommerce/app-tiny-erp 0.0.60 → 0.0.61
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/.turbo/turbo-build.log +32 -32
- package/lib/event-to-tiny.js +9 -3
- package/lib/event-to-tiny.js.map +1 -1
- package/lib/integration/import-product-from-tiny.js +5 -16
- package/lib/integration/import-product-from-tiny.js.map +1 -1
- package/lib/tiny-webhook.js +46 -89
- package/lib/tiny-webhook.js.map +1 -1
- package/package.json +4 -4
- package/src/event-to-tiny.ts +10 -3
- package/src/integration/import-product-from-tiny.ts +5 -17
- package/src/tiny-webhook.ts +49 -92
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
[
|
|
2
|
-
[
|
|
3
|
-
[
|
|
4
|
-
[
|
|
5
|
-
[
|
|
6
|
-
[
|
|
7
|
-
[
|
|
8
|
-
[
|
|
9
|
-
[
|
|
10
|
-
[
|
|
11
|
-
[
|
|
12
|
-
[
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
[
|
|
17
|
-
[
|
|
18
|
-
[
|
|
19
|
-
[
|
|
20
|
-
[
|
|
21
|
-
[
|
|
22
|
-
[
|
|
23
|
-
[
|
|
24
|
-
[
|
|
25
|
-
[
|
|
26
|
-
[
|
|
27
|
-
[
|
|
28
|
-
[
|
|
29
|
-
[
|
|
30
|
-
[
|
|
31
|
-
[
|
|
32
|
-
[
|
|
1
|
+
[36m@cloudcommerce/app-tiny-erp:build[0m: cache hit, replaying output [2m02e4be25cd419867[0m
|
|
2
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
3
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m> @cloudcommerce/app-tiny-erp@0.0.60 build /home/leo/code/ecomplus/cloud-commerce/packages/apps/tiny-erp
|
|
4
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m> sh ../../../scripts/build-lib.sh
|
|
5
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
6
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
7
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m/home/leo/code/ecomplus/cloud-commerce/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js
|
|
8
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 37:32 warning 'data' is already declared in the upper scope on line 29 column 17 no-shadow
|
|
9
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
10
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m/home/leo/code/ecomplus/cloud-commerce/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js
|
|
11
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 22:41 warning 'variation' is already declared in the upper scope on line 22 column 11 no-shadow
|
|
12
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 63:16 warning 'produto' is already declared in the upper scope on line 38 column 30 no-shadow
|
|
13
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 66:13 warning 'productId' is already declared in the upper scope on line 8 column 15 no-shadow
|
|
14
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 77:63 warning 'product' is already declared in the upper scope on line 9 column 7 no-shadow
|
|
15
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 79:13 warning Assignment to property of function parameter 'product' no-param-reassign
|
|
16
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
17
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m/home/leo/code/ecomplus/cloud-commerce/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js
|
|
18
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 30:9 warning Assignment to property of function parameter 'tinyObject' no-param-reassign
|
|
19
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
20
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m/home/leo/code/ecomplus/cloud-commerce/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js
|
|
21
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 27:16 warning 'data' is already declared in the upper scope on line 17 column 14 no-shadow
|
|
22
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 32:22 warning Assignment to property of function parameter 'data' no-param-reassign
|
|
23
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 36:22 warning Assignment to property of function parameter 'data' no-param-reassign
|
|
24
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 38:13 warning Assignment to property of function parameter 'data' no-param-reassign
|
|
25
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
26
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m/home/leo/code/ecomplus/cloud-commerce/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js
|
|
27
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 13:14 warning Do not nest ternary expressions no-nested-ternary
|
|
28
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 60:21 warning Do not nest ternary expressions no-nested-ternary
|
|
29
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m 117:42 warning 'i' is already declared in the upper scope on line 106 column 45 no-shadow
|
|
30
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
|
31
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m✖ 14 problems (0 errors, 14 warnings)
|
|
32
|
+
[36m@cloudcommerce/app-tiny-erp:build: [0m
|
package/lib/event-to-tiny.js
CHANGED
|
@@ -29,9 +29,15 @@ const handleApiEvent = async ({
|
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
31
|
logger.info(`> Webhook ${resourceId} [${evName}]`);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
if (!process.env.TINY_ERP_TOKEN) {
|
|
33
|
+
const tinyToken = appData.tiny_api_token;
|
|
34
|
+
if (typeof tinyToken === 'string' && tinyToken) {
|
|
35
|
+
process.env.TINY_ERP_TOKEN = tinyToken;
|
|
36
|
+
} else {
|
|
37
|
+
logger.warn('Missing Tiny API token');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (process.env.TINY_ERP_TOKEN) {
|
|
35
41
|
let integrationConfig;
|
|
36
42
|
let canCreateNew = false;
|
|
37
43
|
if (evName === 'applications-dataSet') {
|
package/lib/event-to-tiny.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-to-tiny.js","sourceRoot":"","sources":["../src/event-to-tiny.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,+BAA+B,CAAC;AACnD,OAAO,aAAa,MAAM,sCAAsC,CAAC;AACjE,OAAO,WAAW,MAAM,oCAAoC,CAAC;AAC7D,OAAO,aAAa,MAAM,wCAAwC,CAAC;AACnE,OAAO,WAAW,MAAM,sCAAsC,CAAC;AAC/D,OAAO,UAAU,MAAM,gCAAgC,CAAC;AAExD,6BAA6B;AAC7B,MAAM,mBAAmB,GAAG;IAC1B,WAAW,EAAE;QACX,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,WAAW;KACvB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,aAAa,EAAE,WAAW;KAC3B;CACF,CAAC;AAEF,MAAM,cAAc,GAAoB,KAAK,EAAE,EAC7C,MAAM,EACN,QAAQ,EACR,MAAM,EACN,GAAG,GACJ,EAAE,EAAE;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD,IACE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;WACjC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EACzC;QACA,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;KACb;IACD,MAAM,CAAC,IAAI,CAAC,aAAa,UAAU,KAAK,MAAM,GAAG,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"event-to-tiny.js","sourceRoot":"","sources":["../src/event-to-tiny.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// eslint-disable-next-line import/no-unresolved
|
|
2
|
-
import { getFirestore } from 'firebase-admin/firestore';
|
|
3
1
|
import logger from 'firebase-functions/lib/logger';
|
|
4
2
|
import api from '@cloudcommerce/api';
|
|
5
3
|
import updateAppData from '@cloudcommerce/firebase/lib/helpers/update-app-data';
|
|
@@ -8,20 +6,6 @@ import parseProduct from './parsers/product-from-tiny.js';
|
|
|
8
6
|
|
|
9
7
|
export default async (apiDoc, queueEntry, appData, canCreateNew, isHiddenQueue) => {
|
|
10
8
|
const [sku, productId] = String(queueEntry.nextId).split(';:');
|
|
11
|
-
let { tinyStockUpdate } = queueEntry;
|
|
12
|
-
if (!tinyStockUpdate) {
|
|
13
|
-
const querySnapshot = await getFirestore().collection('tinyErpStockUpdates')
|
|
14
|
-
.where('ref', '==', `${sku}`).get();
|
|
15
|
-
let lastUpdateTime;
|
|
16
|
-
querySnapshot.forEach((documentSnapshot) => {
|
|
17
|
-
const updateTime = documentSnapshot.updateTime.toDate().getTime();
|
|
18
|
-
if (!lastUpdateTime || updateTime > lastUpdateTime) {
|
|
19
|
-
lastUpdateTime = updateTime;
|
|
20
|
-
tinyStockUpdate = documentSnapshot.data();
|
|
21
|
-
}
|
|
22
|
-
documentSnapshot.ref.delete().catch(logger.error);
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
9
|
let product = null;
|
|
26
10
|
try {
|
|
27
11
|
product = (await api.get(`products/${(productId || `sku:${sku}`)}`)).data;
|
|
@@ -101,6 +85,10 @@ export default async (apiDoc, queueEntry, appData, canCreateNew, isHiddenQueue)
|
|
|
101
85
|
data: product,
|
|
102
86
|
});
|
|
103
87
|
if (Array.isArray(produto.variacoes) && produto.variacoes.length) {
|
|
88
|
+
if (!queueEntry.app) {
|
|
89
|
+
logger.warn('Variations cannot be queued without `queueEntry.app`');
|
|
90
|
+
return promise;
|
|
91
|
+
}
|
|
104
92
|
promise.then((response) => {
|
|
105
93
|
let skus = appData.__importation && appData.__importation.skus;
|
|
106
94
|
if (!Array.isArray(skus)) {
|
|
@@ -141,6 +129,7 @@ export default async (apiDoc, queueEntry, appData, canCreateNew, isHiddenQueue)
|
|
|
141
129
|
hasVariations,
|
|
142
130
|
variationId,
|
|
143
131
|
}));
|
|
132
|
+
const { tinyStockUpdate } = queueEntry;
|
|
144
133
|
if (tinyStockUpdate && isHiddenQueue && productId) {
|
|
145
134
|
return handleTinyStock(tinyStockUpdate);
|
|
146
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-product-from-tiny.js","sourceRoot":"","sources":["../../src/integration/import-product-from-tiny.ts"],"names":[],"mappings":"AACA,
|
|
1
|
+
{"version":3,"file":"import-product-from-tiny.js","sourceRoot":"","sources":["../../src/integration/import-product-from-tiny.ts"],"names":[],"mappings":"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"}
|
package/lib/tiny-webhook.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { firestore } from 'firebase-admin';
|
|
2
1
|
import logger from 'firebase-functions/lib/logger';
|
|
3
2
|
import api from '@cloudcommerce/api';
|
|
4
3
|
import config from '@cloudcommerce/firebase/lib/config';
|
|
5
|
-
import updateAppData from '@cloudcommerce/firebase/lib/helpers/update-app-data';
|
|
6
4
|
import importProduct from './integration/import-product-from-tiny.js';
|
|
7
5
|
import importOrder from './integration/import-order-from-tiny.js';
|
|
8
|
-
|
|
6
|
+
|
|
7
|
+
let appData = {};
|
|
8
|
+
let application;
|
|
9
9
|
|
|
10
10
|
export default async (req, res) => {
|
|
11
11
|
const tinyToken = req.query.token;
|
|
@@ -16,95 +16,51 @@ export default async (req, res) => {
|
|
|
16
16
|
TODO: Check Tiny server IPs
|
|
17
17
|
const clientIp = req.get('x-forwarded-for') || req.connection.remoteAddress
|
|
18
18
|
*/
|
|
19
|
-
const {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
19
|
+
const { TINY_ERP_TOKEN } = process.env;
|
|
20
|
+
if (!TINY_ERP_TOKEN || TINY_ERP_TOKEN !== tinyToken) {
|
|
21
|
+
const { apps: { tinyErp: { appId } } } = config.get();
|
|
22
|
+
const applicationId = req.query._id;
|
|
23
|
+
const appEndpoint = applicationId && typeof applicationId === 'string'
|
|
24
|
+
? `applications/${applicationId}`
|
|
25
|
+
: `applications/app_id:${appId}`;
|
|
26
|
+
application = (await api.get(appEndpoint)).data;
|
|
27
|
+
appData = {
|
|
28
|
+
...application.data,
|
|
29
|
+
...application.hidden_data,
|
|
30
|
+
};
|
|
31
|
+
if (appData.tiny_api_token !== tinyToken) {
|
|
32
|
+
return res.sendStatus(401);
|
|
33
|
+
}
|
|
34
|
+
process.env.TINY_ERP_TOKEN = tinyToken;
|
|
31
35
|
}
|
|
32
36
|
if (dados.idVendaTiny) {
|
|
33
|
-
let orderNumbers = appData.___importation?.order_numbers;
|
|
34
|
-
if (!Array.isArray(orderNumbers)) {
|
|
35
|
-
orderNumbers = [];
|
|
36
|
-
}
|
|
37
37
|
const orderNumber = `id:${dados.idVendaTiny}`;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const nextId = String(dados.skuMapeamento || dados.sku || dados.codigo);
|
|
65
|
-
const tinyStockUpdate = {
|
|
66
|
-
ref: `${nextId}`,
|
|
67
|
-
tipo,
|
|
68
|
-
produto: {
|
|
69
|
-
id: dados.idProduto,
|
|
70
|
-
codigo: dados.sku,
|
|
71
|
-
...dados,
|
|
72
|
-
},
|
|
73
|
-
updatedAt: firestore.Timestamp.fromDate(new Date()),
|
|
74
|
-
};
|
|
75
|
-
logger.info(`> Tiny webhook: ${nextId} => ${tinyStockUpdate.produto.saldo}`);
|
|
76
|
-
const saveToQueue = () => {
|
|
77
|
-
let skus = appData.___importation && appData.___importation.skus;
|
|
78
|
-
if (!Array.isArray(skus)) {
|
|
79
|
-
skus = [];
|
|
80
|
-
}
|
|
81
|
-
if (!skus.includes(nextId)) {
|
|
82
|
-
return firestore().collection('tinyErpStockUpdates').add(tinyStockUpdate)
|
|
83
|
-
.then(() => {
|
|
84
|
-
skus.push(nextId);
|
|
85
|
-
logger.info(`> SKUs: ${JSON.stringify(skus)}`);
|
|
86
|
-
return updateAppData(application, {
|
|
87
|
-
___importation: {
|
|
88
|
-
...appData.___importation,
|
|
89
|
-
skus,
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
return Promise.resolve(null);
|
|
95
|
-
};
|
|
96
|
-
const queueEntry = {
|
|
97
|
-
nextId,
|
|
98
|
-
tinyStockUpdate,
|
|
99
|
-
isNotQueued: true,
|
|
100
|
-
};
|
|
101
|
-
try {
|
|
102
|
-
const payload = await importProduct({}, queueEntry, appData, false, true);
|
|
103
|
-
await afterQueue(queueEntry, appData, application, payload);
|
|
104
|
-
} catch (e) {
|
|
105
|
-
await saveToQueue();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
38
|
+
const queueEntry = {
|
|
39
|
+
nextId: orderNumber,
|
|
40
|
+
isNotQueued: true,
|
|
41
|
+
};
|
|
42
|
+
await importOrder({}, queueEntry);
|
|
43
|
+
} else if ((tipo === 'produto' || tipo === 'estoque')
|
|
44
|
+
&& (dados.id || dados.idProduto)
|
|
45
|
+
&& (dados.codigo || dados.sku)) {
|
|
46
|
+
const nextId = String(dados.skuMapeamento || dados.sku || dados.codigo);
|
|
47
|
+
const tinyStockUpdate = {
|
|
48
|
+
ref: `${nextId}`,
|
|
49
|
+
tipo,
|
|
50
|
+
produto: {
|
|
51
|
+
id: dados.idProduto,
|
|
52
|
+
codigo: dados.sku,
|
|
53
|
+
...dados,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
logger.info(`> Tiny webhook: ${nextId} => ${tinyStockUpdate.produto.saldo}`);
|
|
57
|
+
const queueEntry = {
|
|
58
|
+
nextId,
|
|
59
|
+
tinyStockUpdate,
|
|
60
|
+
isNotQueued: true,
|
|
61
|
+
app: application,
|
|
62
|
+
};
|
|
63
|
+
await importProduct({}, queueEntry, appData, false, true);
|
|
108
64
|
}
|
|
109
65
|
if (tipo === 'produto') {
|
|
110
66
|
const mapeamentos = [];
|
|
@@ -129,6 +85,7 @@ export default async (req, res) => {
|
|
|
129
85
|
}
|
|
130
86
|
return res.sendStatus(200);
|
|
131
87
|
}
|
|
88
|
+
logger.warn('< Invalid Tiny Webhook body', req.body);
|
|
132
89
|
}
|
|
133
90
|
return res.sendStatus(403);
|
|
134
91
|
};
|
package/lib/tiny-webhook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiny-webhook.js","sourceRoot":"","sources":["../src/tiny-webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tiny-webhook.js","sourceRoot":"","sources":["../src/tiny-webhook.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcommerce/app-tiny-erp",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.61",
|
|
5
5
|
"description": "E-Com Plus Cloud Commerce app for Tiny ERP",
|
|
6
6
|
"main": "lib/tiny-erp.js",
|
|
7
7
|
"repository": {
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
},
|
|
17
17
|
"homepage": "https://github.com/ecomplus/cloud-commerce/tree/main/packages/apps/tiny-erp#readme",
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@cloudcommerce/api": "0.0.
|
|
20
|
-
"@cloudcommerce/firebase": "0.0.
|
|
19
|
+
"@cloudcommerce/api": "0.0.61",
|
|
20
|
+
"@cloudcommerce/firebase": "0.0.61",
|
|
21
21
|
"@ecomplus/utils": "^1.4.1",
|
|
22
22
|
"axios": "^0.27.2",
|
|
23
23
|
"firebase-admin": "^11.0.1",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"form-data": "^4.0.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@cloudcommerce/types": "0.0.
|
|
28
|
+
"@cloudcommerce/types": "0.0.61",
|
|
29
29
|
"@firebase/app-types": "^0.7.0"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
package/src/event-to-tiny.ts
CHANGED
|
@@ -37,9 +37,16 @@ const handleApiEvent: ApiEventHandler = async ({
|
|
|
37
37
|
}
|
|
38
38
|
logger.info(`> Webhook ${resourceId} [${evName}]`);
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
if (!process.env.TINY_ERP_TOKEN) {
|
|
41
|
+
const tinyToken = appData.tiny_api_token;
|
|
42
|
+
if (typeof tinyToken === 'string' && tinyToken) {
|
|
43
|
+
process.env.TINY_ERP_TOKEN = tinyToken;
|
|
44
|
+
} else {
|
|
45
|
+
logger.warn('Missing Tiny API token');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (process.env.TINY_ERP_TOKEN) {
|
|
43
50
|
let integrationConfig;
|
|
44
51
|
let canCreateNew = false;
|
|
45
52
|
if (evName === 'applications-dataSet') {
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { Products } from '@cloudcommerce/types';
|
|
2
|
-
// eslint-disable-next-line import/no-unresolved
|
|
3
|
-
import { getFirestore } from 'firebase-admin/firestore';
|
|
4
2
|
import logger from 'firebase-functions/lib/logger';
|
|
5
3
|
import api from '@cloudcommerce/api';
|
|
6
4
|
import updateAppData from '@cloudcommerce/firebase/lib/helpers/update-app-data';
|
|
@@ -9,21 +7,6 @@ import parseProduct from './parsers/product-from-tiny';
|
|
|
9
7
|
|
|
10
8
|
export default async (apiDoc, queueEntry, appData, canCreateNew, isHiddenQueue) => {
|
|
11
9
|
const [sku, productId] = String(queueEntry.nextId).split(';:');
|
|
12
|
-
let { tinyStockUpdate } = queueEntry;
|
|
13
|
-
if (!tinyStockUpdate) {
|
|
14
|
-
const querySnapshot = await getFirestore().collection('tinyErpStockUpdates')
|
|
15
|
-
.where('ref', '==', `${sku}`).get();
|
|
16
|
-
let lastUpdateTime;
|
|
17
|
-
querySnapshot.forEach((documentSnapshot) => {
|
|
18
|
-
const updateTime = documentSnapshot.updateTime.toDate().getTime();
|
|
19
|
-
if (!lastUpdateTime || updateTime > lastUpdateTime) {
|
|
20
|
-
lastUpdateTime = updateTime;
|
|
21
|
-
tinyStockUpdate = documentSnapshot.data();
|
|
22
|
-
}
|
|
23
|
-
documentSnapshot.ref.delete().catch(logger.error);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
10
|
let product: Products | null = null;
|
|
28
11
|
try {
|
|
29
12
|
product = (await api.get(`products/${(productId || `sku:${sku}`)}`)).data;
|
|
@@ -106,6 +89,10 @@ export default async (apiDoc, queueEntry, appData, canCreateNew, isHiddenQueue)
|
|
|
106
89
|
});
|
|
107
90
|
|
|
108
91
|
if (Array.isArray(produto.variacoes) && produto.variacoes.length) {
|
|
92
|
+
if (!queueEntry.app) {
|
|
93
|
+
logger.warn('Variations cannot be queued without `queueEntry.app`');
|
|
94
|
+
return promise;
|
|
95
|
+
}
|
|
109
96
|
promise.then((response) => {
|
|
110
97
|
let skus = appData.__importation && appData.__importation.skus;
|
|
111
98
|
if (!Array.isArray(skus)) {
|
|
@@ -147,6 +134,7 @@ export default async (apiDoc, queueEntry, appData, canCreateNew, isHiddenQueue)
|
|
|
147
134
|
hasVariations,
|
|
148
135
|
variationId,
|
|
149
136
|
}));
|
|
137
|
+
const { tinyStockUpdate } = queueEntry;
|
|
150
138
|
if (tinyStockUpdate && isHiddenQueue && productId) {
|
|
151
139
|
return handleTinyStock(tinyStockUpdate as any);
|
|
152
140
|
}
|
package/src/tiny-webhook.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { Request, Response } from 'firebase-functions';
|
|
2
|
-
import {
|
|
2
|
+
import type { Applications } from '@cloudcommerce/types';
|
|
3
3
|
import logger from 'firebase-functions/lib/logger';
|
|
4
4
|
import api from '@cloudcommerce/api';
|
|
5
5
|
import config from '@cloudcommerce/firebase/lib/config';
|
|
6
|
-
import updateAppData from '@cloudcommerce/firebase/lib/helpers/update-app-data';
|
|
7
6
|
import importProduct from './integration/import-product-from-tiny';
|
|
8
7
|
import importOrder from './integration/import-order-from-tiny';
|
|
9
|
-
|
|
8
|
+
|
|
9
|
+
let appData: Record<string, any> = {};
|
|
10
|
+
let application: Applications;
|
|
10
11
|
|
|
11
12
|
export default async (req: Request, res: Response) => {
|
|
12
13
|
const tinyToken = req.query.token;
|
|
@@ -17,99 +18,54 @@ export default async (req: Request, res: Response) => {
|
|
|
17
18
|
TODO: Check Tiny server IPs
|
|
18
19
|
const clientIp = req.get('x-forwarded-for') || req.connection.remoteAddress
|
|
19
20
|
*/
|
|
20
|
-
const {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
const { TINY_ERP_TOKEN } = process.env;
|
|
22
|
+
if (!TINY_ERP_TOKEN || TINY_ERP_TOKEN !== tinyToken) {
|
|
23
|
+
const { apps: { tinyErp: { appId } } } = config.get();
|
|
24
|
+
const applicationId = req.query._id;
|
|
25
|
+
const appEndpoint = applicationId && typeof applicationId === 'string'
|
|
26
|
+
? `applications/${applicationId}`
|
|
27
|
+
: `applications/app_id:${appId}`;
|
|
28
|
+
application = (await api.get(appEndpoint as 'applications/id')).data;
|
|
29
|
+
appData = {
|
|
30
|
+
...application.data,
|
|
31
|
+
...application.hidden_data,
|
|
32
|
+
};
|
|
33
|
+
if (appData.tiny_api_token !== tinyToken) {
|
|
34
|
+
return res.sendStatus(401);
|
|
35
|
+
}
|
|
36
|
+
process.env.TINY_ERP_TOKEN = tinyToken;
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
if (dados.idVendaTiny) {
|
|
35
|
-
let orderNumbers = appData.___importation?.order_numbers;
|
|
36
|
-
if (!Array.isArray(orderNumbers)) {
|
|
37
|
-
orderNumbers = [];
|
|
38
|
-
}
|
|
39
40
|
const orderNumber = `id:${dados.idVendaTiny}`;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const nextId = String(dados.skuMapeamento || dados.sku || dados.codigo);
|
|
69
|
-
const tinyStockUpdate = {
|
|
70
|
-
ref: `${nextId}`,
|
|
71
|
-
tipo,
|
|
72
|
-
produto: {
|
|
73
|
-
id: dados.idProduto,
|
|
74
|
-
codigo: dados.sku,
|
|
75
|
-
...dados,
|
|
76
|
-
},
|
|
77
|
-
updatedAt: firestore.Timestamp.fromDate(new Date()),
|
|
78
|
-
};
|
|
79
|
-
logger.info(`> Tiny webhook: ${nextId} => ${tinyStockUpdate.produto.saldo}`);
|
|
80
|
-
const saveToQueue = () => {
|
|
81
|
-
let skus = appData.___importation && appData.___importation.skus;
|
|
82
|
-
if (!Array.isArray(skus)) {
|
|
83
|
-
skus = [];
|
|
84
|
-
}
|
|
85
|
-
if (!skus.includes(nextId)) {
|
|
86
|
-
return firestore().collection('tinyErpStockUpdates').add(tinyStockUpdate)
|
|
87
|
-
.then(() => {
|
|
88
|
-
skus.push(nextId);
|
|
89
|
-
logger.info(`> SKUs: ${JSON.stringify(skus)}`);
|
|
90
|
-
return updateAppData(application, {
|
|
91
|
-
___importation: {
|
|
92
|
-
...appData.___importation,
|
|
93
|
-
skus,
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
return Promise.resolve(null);
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const queueEntry = {
|
|
102
|
-
nextId,
|
|
103
|
-
tinyStockUpdate,
|
|
104
|
-
isNotQueued: true,
|
|
105
|
-
};
|
|
106
|
-
try {
|
|
107
|
-
const payload = await importProduct({}, queueEntry, appData, false, true);
|
|
108
|
-
await afterQueue(queueEntry, appData, application, payload);
|
|
109
|
-
} catch (e) {
|
|
110
|
-
await saveToQueue();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
41
|
+
const queueEntry = {
|
|
42
|
+
nextId: orderNumber,
|
|
43
|
+
isNotQueued: true,
|
|
44
|
+
};
|
|
45
|
+
await importOrder({}, queueEntry);
|
|
46
|
+
} else if (
|
|
47
|
+
(tipo === 'produto' || tipo === 'estoque')
|
|
48
|
+
&& (dados.id || dados.idProduto)
|
|
49
|
+
&& (dados.codigo || dados.sku)
|
|
50
|
+
) {
|
|
51
|
+
const nextId = String(dados.skuMapeamento || dados.sku || dados.codigo);
|
|
52
|
+
const tinyStockUpdate = {
|
|
53
|
+
ref: `${nextId}`,
|
|
54
|
+
tipo,
|
|
55
|
+
produto: {
|
|
56
|
+
id: dados.idProduto,
|
|
57
|
+
codigo: dados.sku,
|
|
58
|
+
...dados,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
logger.info(`> Tiny webhook: ${nextId} => ${tinyStockUpdate.produto.saldo}`);
|
|
62
|
+
const queueEntry = {
|
|
63
|
+
nextId,
|
|
64
|
+
tinyStockUpdate,
|
|
65
|
+
isNotQueued: true,
|
|
66
|
+
app: application,
|
|
67
|
+
};
|
|
68
|
+
await importProduct({}, queueEntry, appData, false, true);
|
|
113
69
|
}
|
|
114
70
|
|
|
115
71
|
if (tipo === 'produto') {
|
|
@@ -138,6 +94,7 @@ export default async (req: Request, res: Response) => {
|
|
|
138
94
|
}
|
|
139
95
|
return res.sendStatus(200);
|
|
140
96
|
}
|
|
97
|
+
logger.warn('< Invalid Tiny Webhook body', req.body);
|
|
141
98
|
}
|
|
142
99
|
return res.sendStatus(403);
|
|
143
100
|
};
|