cloudcommerce 0.0.59 → 0.0.60
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/.eslintrc.cjs +2 -0
- package/CHANGELOG.md +23 -0
- package/package.json +9 -8
- package/packages/api/lib/api.d.ts +5036 -0
- package/packages/api/lib/{index.js → api.js} +16 -10
- package/packages/api/lib/api.js.map +1 -0
- package/packages/api/lib/types.d.ts +1 -0
- package/packages/api/package.json +3 -3
- package/packages/api/src/{index.ts → api.ts} +21 -17
- package/packages/api/src/types.ts +1 -0
- package/packages/api/tests/index.test.ts +2 -2
- package/packages/apps/discounts/lib/discounts.js +1 -1
- package/packages/apps/discounts/lib/discounts.js.map +1 -1
- package/packages/apps/discounts/{lib-cjs/apply-discount.cjs → lib-mjs/apply-discount.mjs} +7 -9
- package/packages/apps/discounts/{lib-cjs/helpers.cjs → lib-mjs/helpers.mjs} +2 -2
- package/packages/apps/discounts/package.json +1 -1
- package/packages/apps/discounts/src/discounts.ts +1 -1
- package/packages/apps/tiny-erp/lib/event-to-tiny.js +111 -0
- package/packages/apps/tiny-erp/lib/event-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/index.js +2 -0
- package/packages/apps/tiny-erp/lib/index.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js +79 -0
- package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js +81 -0
- package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js +58 -0
- package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js +7 -0
- package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js +94 -0
- package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js +169 -0
- package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js +46 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js +193 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js +199 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js +129 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js +34 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js +39 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js +47 -0
- package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js.map +1 -0
- package/packages/apps/tiny-erp/lib/tiny-erp.js +17 -0
- package/packages/apps/tiny-erp/lib/tiny-erp.js.map +1 -0
- package/packages/apps/tiny-erp/lib/tiny-webhook.js +135 -0
- package/packages/apps/tiny-erp/lib/tiny-webhook.js.map +1 -0
- package/packages/apps/tiny-erp/package.json +13 -6
- package/packages/apps/tiny-erp/src/event-to-tiny.ts +129 -0
- package/packages/apps/tiny-erp/src/index.ts +1 -0
- package/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts +80 -0
- package/packages/apps/tiny-erp/src/integration/export-order-to-tiny.ts +86 -0
- package/packages/apps/tiny-erp/src/integration/export-product-to-tiny.ts +60 -0
- package/packages/apps/tiny-erp/src/integration/helpers/format-tiny-date.ts +6 -0
- package/packages/apps/tiny-erp/src/integration/import-order-from-tiny.ts +104 -0
- package/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts +174 -0
- package/packages/apps/tiny-erp/src/integration/parsers/order-from-tiny.ts +49 -0
- package/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts +205 -0
- package/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts +215 -0
- package/packages/apps/tiny-erp/src/integration/parsers/product-to-tiny.ts +138 -0
- package/packages/apps/tiny-erp/src/integration/parsers/status-from-tiny.ts +35 -0
- package/packages/apps/tiny-erp/src/integration/parsers/status-to-tiny.ts +42 -0
- package/packages/apps/tiny-erp/src/integration/post-tiny-erp.ts +52 -0
- package/packages/apps/tiny-erp/src/tiny-erp.ts +23 -0
- package/packages/apps/tiny-erp/src/tiny-webhook.ts +143 -0
- package/packages/cli/package.json +1 -1
- package/packages/events/lib/firebase.js +2 -26
- package/packages/events/lib/firebase.js.map +1 -1
- package/packages/events/lib/index.js +1 -1
- package/packages/events/lib/index.js.map +1 -1
- package/packages/events/package.json +1 -1
- package/packages/events/src/firebase.ts +2 -28
- package/packages/events/src/index.ts +1 -1
- package/packages/firebase/lib/config.d.ts +2 -2
- package/packages/firebase/lib/config.js +7 -5
- package/packages/firebase/lib/config.js.map +1 -1
- package/packages/firebase/lib/const.d.ts +2 -0
- package/packages/firebase/lib/const.js +6 -0
- package/packages/firebase/lib/const.js.map +1 -0
- package/packages/firebase/lib/handlers/check-store-events.js +50 -27
- package/packages/firebase/lib/handlers/check-store-events.js.map +1 -1
- package/packages/firebase/lib/helpers/pubsub.d.ts +9 -0
- package/packages/firebase/lib/helpers/pubsub.js +32 -0
- package/packages/firebase/lib/helpers/pubsub.js.map +1 -0
- package/packages/firebase/lib/helpers/update-app-data.d.ts +9 -0
- package/packages/firebase/lib/helpers/update-app-data.js +45 -0
- package/packages/firebase/lib/helpers/update-app-data.js.map +1 -0
- package/packages/firebase/lib/index.d.ts +1 -2
- package/packages/firebase/lib/index.js +1 -6
- package/packages/firebase/lib/index.js.map +1 -1
- package/packages/firebase/lib/init.d.ts +2 -0
- package/packages/firebase/lib/init.js +9 -0
- package/packages/firebase/lib/init.js.map +1 -0
- package/packages/firebase/package.json +5 -2
- package/packages/firebase/src/config.ts +9 -6
- package/packages/firebase/src/const.ts +5 -0
- package/packages/firebase/src/handlers/check-store-events.ts +56 -33
- package/packages/firebase/src/helpers/pubsub.ts +52 -0
- package/packages/firebase/src/helpers/update-app-data.ts +49 -0
- package/packages/firebase/src/index.ts +1 -7
- package/packages/firebase/src/init.ts +9 -0
- package/packages/modules/lib/firebase/handle-module.js +4 -5
- package/packages/modules/lib/firebase/handle-module.js.map +1 -1
- package/packages/modules/lib/firebase/serve-modules-api.js +2 -2
- package/packages/modules/lib/firebase/serve-modules-api.js.map +1 -1
- package/packages/modules/lib/firebase.js +2 -7
- package/packages/modules/lib/firebase.js.map +1 -1
- package/packages/modules/package.json +1 -1
- package/packages/modules/src/firebase/handle-module.ts +2 -5
- package/packages/modules/src/firebase/serve-modules-api.ts +2 -6
- package/packages/modules/src/firebase.ts +2 -7
- package/packages/passport/lib/firebase/handle-passport.js +12 -10
- package/packages/passport/lib/firebase/handle-passport.js.map +1 -1
- package/packages/passport/lib/firebase/serve-passport-api.js +2 -2
- package/packages/passport/lib/firebase/serve-passport-api.js.map +1 -1
- package/packages/passport/lib/firebase.js +2 -7
- package/packages/passport/lib/firebase.js.map +1 -1
- package/packages/passport/package.json +1 -1
- package/packages/passport/src/firebase/handle-passport.ts +10 -19
- package/packages/passport/src/firebase/serve-passport-api.ts +0 -2
- package/packages/passport/src/firebase.ts +1 -7
- package/packages/ssr/lib/firebase.js +1 -4
- package/packages/ssr/lib/firebase.js.map +1 -1
- package/packages/ssr/package.json +1 -1
- package/packages/ssr/src/firebase.ts +1 -4
- package/packages/storefront/package.json +4 -4
- package/packages/types/index.ts +18 -3
- package/packages/types/package.json +1 -1
- package/packages/api/lib/index.d.ts +0 -9974
- package/packages/api/lib/index.js.map +0 -1
- package/packages/apps/tiny-erp/src/firebase.ts +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import axios, { AxiosRequestConfig } from 'axios';
|
|
2
|
+
|
|
3
|
+
export default (
|
|
4
|
+
url: string,
|
|
5
|
+
body: Record<string, any>,
|
|
6
|
+
token = process.env.TINY_ERP_TOKEN,
|
|
7
|
+
options: AxiosRequestConfig = {},
|
|
8
|
+
) => {
|
|
9
|
+
// https://www.tiny.com.br/ajuda/api/api2
|
|
10
|
+
let data = `token=${token}&formato=JSON`;
|
|
11
|
+
if (body) {
|
|
12
|
+
Object.keys(body).forEach((field) => {
|
|
13
|
+
if (body[field]) {
|
|
14
|
+
switch (typeof body[field]) {
|
|
15
|
+
case 'object':
|
|
16
|
+
data += `&${field}=${JSON.stringify(body[field])}`;
|
|
17
|
+
break;
|
|
18
|
+
case 'string':
|
|
19
|
+
case 'number':
|
|
20
|
+
data += `&${field}=${body[field]}`;
|
|
21
|
+
break;
|
|
22
|
+
default:
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return axios.post(url, data, {
|
|
29
|
+
baseURL: 'https://api.tiny.com.br/api2/',
|
|
30
|
+
timeout: 30000,
|
|
31
|
+
...options,
|
|
32
|
+
})
|
|
33
|
+
.then((response) => {
|
|
34
|
+
const { retorno } = response.data;
|
|
35
|
+
if (retorno.status === 'Erro') {
|
|
36
|
+
const err: any = new Error('Tiny error response');
|
|
37
|
+
const tinyErrorCode = parseInt(retorno.codigo_erro, 10);
|
|
38
|
+
if (tinyErrorCode <= 2) {
|
|
39
|
+
response.status = 401;
|
|
40
|
+
} else if (tinyErrorCode === 6) {
|
|
41
|
+
response.status = 503;
|
|
42
|
+
} else if (tinyErrorCode === 20) {
|
|
43
|
+
response.status = 404;
|
|
44
|
+
}
|
|
45
|
+
err.response = response;
|
|
46
|
+
err.config = response.config;
|
|
47
|
+
err.request = response.request;
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
return retorno;
|
|
51
|
+
});
|
|
52
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* eslint-disable import/prefer-default-export */
|
|
2
|
+
|
|
3
|
+
import '@cloudcommerce/firebase/lib/init';
|
|
4
|
+
// eslint-disable-next-line import/no-unresolved
|
|
5
|
+
import { onRequest } from 'firebase-functions/v2/https';
|
|
6
|
+
import config from '@cloudcommerce/firebase/lib/config';
|
|
7
|
+
import {
|
|
8
|
+
createAppEventsFunction,
|
|
9
|
+
ApiEventHandler,
|
|
10
|
+
} from '@cloudcommerce/firebase/lib/helpers/pubsub';
|
|
11
|
+
import handleApiEvent from './event-to-tiny';
|
|
12
|
+
import handleTinyWebhook from './tiny-webhook';
|
|
13
|
+
|
|
14
|
+
const { httpsFunctionOptions } = config.get();
|
|
15
|
+
|
|
16
|
+
export const tinyErpOnApiEvent = createAppEventsFunction(
|
|
17
|
+
'tinyErp',
|
|
18
|
+
handleApiEvent as ApiEventHandler,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export const tinyErpWebhook = onRequest(httpsFunctionOptions, (req, res) => {
|
|
22
|
+
handleTinyWebhook(req, res);
|
|
23
|
+
});
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { Request, Response } from 'firebase-functions';
|
|
2
|
+
import { firestore } from 'firebase-admin';
|
|
3
|
+
import logger from 'firebase-functions/lib/logger';
|
|
4
|
+
import api from '@cloudcommerce/api';
|
|
5
|
+
import config from '@cloudcommerce/firebase/lib/config';
|
|
6
|
+
import updateAppData from '@cloudcommerce/firebase/lib/helpers/update-app-data';
|
|
7
|
+
import importProduct from './integration/import-product-from-tiny';
|
|
8
|
+
import importOrder from './integration/import-order-from-tiny';
|
|
9
|
+
import afterQueue from './integration/after-tiny-queue';
|
|
10
|
+
|
|
11
|
+
export default async (req: Request, res: Response) => {
|
|
12
|
+
const tinyToken = req.query.token;
|
|
13
|
+
if (typeof tinyToken === 'string' && tinyToken && req.body) {
|
|
14
|
+
const { dados, tipo } = req.body;
|
|
15
|
+
if (dados) {
|
|
16
|
+
/*
|
|
17
|
+
TODO: Check Tiny server IPs
|
|
18
|
+
const clientIp = req.get('x-forwarded-for') || req.connection.remoteAddress
|
|
19
|
+
*/
|
|
20
|
+
const { apps: { tinyErp: { appId } } } = config.get();
|
|
21
|
+
const applicationId = req.query._id;
|
|
22
|
+
const appEndpoint = applicationId && typeof applicationId === 'string'
|
|
23
|
+
? `applications/${applicationId}`
|
|
24
|
+
: `applications/app_id:${appId}`;
|
|
25
|
+
const application = (await api.get(appEndpoint as 'applications/id')).data;
|
|
26
|
+
const appData: Record<string, any> = {
|
|
27
|
+
...application.data,
|
|
28
|
+
...application.hidden_data,
|
|
29
|
+
};
|
|
30
|
+
if (appData.tiny_api_token !== tinyToken) {
|
|
31
|
+
return res.sendStatus(401);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (dados.idVendaTiny) {
|
|
35
|
+
let orderNumbers = appData.___importation?.order_numbers;
|
|
36
|
+
if (!Array.isArray(orderNumbers)) {
|
|
37
|
+
orderNumbers = [];
|
|
38
|
+
}
|
|
39
|
+
const orderNumber = `id:${dados.idVendaTiny}`;
|
|
40
|
+
if (!orderNumbers.includes(orderNumber)) {
|
|
41
|
+
logger.info(`> Tiny webhook: order ${orderNumber}`);
|
|
42
|
+
const saveToQueue = () => {
|
|
43
|
+
orderNumbers.push(orderNumber);
|
|
44
|
+
logger.info(`> Order numbers: ${JSON.stringify(orderNumbers)}`);
|
|
45
|
+
return updateAppData(application, {
|
|
46
|
+
___importation: {
|
|
47
|
+
...appData.___importation,
|
|
48
|
+
order_numbers: orderNumbers,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const queueEntry = {
|
|
54
|
+
nextId: orderNumber,
|
|
55
|
+
isNotQueued: true,
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
const payload = await importOrder({}, queueEntry);
|
|
59
|
+
await afterQueue(queueEntry, appData, application, payload);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
await saveToQueue();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (tipo === 'produto' || tipo === 'estoque') {
|
|
67
|
+
if ((dados.id || dados.idProduto) && (dados.codigo || dados.sku)) {
|
|
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
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (tipo === 'produto') {
|
|
116
|
+
const mapeamentos: any[] = [];
|
|
117
|
+
const parseTinyItem = (tinyItem) => {
|
|
118
|
+
if (tinyItem) {
|
|
119
|
+
const {
|
|
120
|
+
idMapeamento,
|
|
121
|
+
id,
|
|
122
|
+
codigo,
|
|
123
|
+
sku,
|
|
124
|
+
} = tinyItem;
|
|
125
|
+
mapeamentos.push({
|
|
126
|
+
idMapeamento: idMapeamento || id,
|
|
127
|
+
skuMapeamento: codigo || sku,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
parseTinyItem(dados);
|
|
132
|
+
if (Array.isArray(dados.variacoes)) {
|
|
133
|
+
dados.variacoes.forEach((variacao) => {
|
|
134
|
+
parseTinyItem(variacao.id ? variacao : variacao.variacao);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return res.status(200).send(mapeamentos);
|
|
138
|
+
}
|
|
139
|
+
return res.sendStatus(200);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return res.sendStatus(403);
|
|
143
|
+
};
|
|
@@ -1,29 +1,5 @@
|
|
|
1
1
|
/* eslint-disable import/prefer-default-export */
|
|
2
|
-
import '
|
|
3
|
-
// eslint-disable-next-line import/no-unresolved
|
|
4
|
-
import { initializeApp } from 'firebase-admin/app';
|
|
5
|
-
import functions from 'firebase-functions';
|
|
6
|
-
import config from '@cloudcommerce/firebase/lib/config';
|
|
2
|
+
import '@cloudcommerce/firebase/lib/init';
|
|
7
3
|
|
|
8
|
-
|
|
9
|
-
initializeApp();
|
|
10
|
-
const eventMaxAgeMs = 60000;
|
|
11
|
-
const newOrderTopic = 'orders-new';
|
|
12
|
-
const { httpsFunctionOptions: { region } } = config.get();
|
|
13
|
-
|
|
14
|
-
export const onNewOrder = functions.region(region)
|
|
15
|
-
.runWith({ failurePolicy: true })
|
|
16
|
-
.pubsub.topic(newOrderTopic).onPublish((message, context) => {
|
|
17
|
-
const eventAgeMs = Date.now() - Date.parse(context.timestamp);
|
|
18
|
-
if (eventAgeMs > eventMaxAgeMs) {
|
|
19
|
-
logger.warn(`Dropping event ${context.eventId} with age[ms]: ${eventAgeMs}`);
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
const { json } = message;
|
|
23
|
-
logger.info({
|
|
24
|
-
topic: newOrderTopic,
|
|
25
|
-
eventId: context.eventId,
|
|
26
|
-
json,
|
|
27
|
-
});
|
|
28
|
-
});
|
|
4
|
+
export * from '@cloudcommerce/app-tiny-erp';
|
|
29
5
|
// # sourceMappingURL=firebase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;
|
|
1
|
+
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,kCAAkC,CAAC;AAE1C,cAAc,6BAA6B,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import './firebase';
|
|
2
2
|
// # sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC"}
|
|
@@ -1,31 +1,5 @@
|
|
|
1
1
|
/* eslint-disable import/prefer-default-export */
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import 'source-map-support/register.js';
|
|
5
|
-
// eslint-disable-next-line import/no-unresolved
|
|
6
|
-
import { initializeApp } from 'firebase-admin/app';
|
|
7
|
-
import functions from 'firebase-functions';
|
|
8
|
-
import config from '@cloudcommerce/firebase/lib/config';
|
|
3
|
+
import '@cloudcommerce/firebase/lib/init';
|
|
9
4
|
|
|
10
|
-
|
|
11
|
-
initializeApp();
|
|
12
|
-
|
|
13
|
-
const eventMaxAgeMs = 60000;
|
|
14
|
-
const newOrderTopic: AppEventsTopic = 'orders-new';
|
|
15
|
-
const { httpsFunctionOptions: { region } } = config.get();
|
|
16
|
-
|
|
17
|
-
export const onNewOrder = functions.region(region)
|
|
18
|
-
.runWith({ failurePolicy: true })
|
|
19
|
-
.pubsub.topic(newOrderTopic).onPublish((message, context) => {
|
|
20
|
-
const eventAgeMs = Date.now() - Date.parse(context.timestamp);
|
|
21
|
-
if (eventAgeMs > eventMaxAgeMs) {
|
|
22
|
-
logger.warn(`Dropping event ${context.eventId} with age[ms]: ${eventAgeMs}`);
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
const { json } = message;
|
|
26
|
-
logger.info({
|
|
27
|
-
topic: newOrderTopic,
|
|
28
|
-
eventId: context.eventId,
|
|
29
|
-
json,
|
|
30
|
-
});
|
|
31
|
-
});
|
|
5
|
+
export * from '@cloudcommerce/app-tiny-erp';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import './firebase';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ApiEventName } from '@cloudcommerce/types';
|
|
2
2
|
declare const _default: {
|
|
3
3
|
get(): {
|
|
4
4
|
hello: string;
|
|
@@ -16,7 +16,7 @@ declare const _default: {
|
|
|
16
16
|
};
|
|
17
17
|
tinyErp: {
|
|
18
18
|
appId: number;
|
|
19
|
-
events:
|
|
19
|
+
events: ApiEventName[];
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
22
|
};
|
|
@@ -8,6 +8,12 @@ const env = (typeof process === 'object' && process?.env)
|
|
|
8
8
|
|| (typeof window === 'object' && window)
|
|
9
9
|
|| {};
|
|
10
10
|
const deepmerge = Deepmerge();
|
|
11
|
+
const tinyErpEvents = [
|
|
12
|
+
'orders-anyStatusSet',
|
|
13
|
+
'products-new',
|
|
14
|
+
'products-priceSet',
|
|
15
|
+
'applications-dataSet',
|
|
16
|
+
];
|
|
11
17
|
const self = {
|
|
12
18
|
__config: {
|
|
13
19
|
hello: 'from @cloudcommerce/firebase',
|
|
@@ -25,11 +31,7 @@ const self = {
|
|
|
25
31
|
},
|
|
26
32
|
tinyErp: {
|
|
27
33
|
appId: 105922,
|
|
28
|
-
events:
|
|
29
|
-
'orders-anyStatusSet',
|
|
30
|
-
'products-new',
|
|
31
|
-
'products-priceSet',
|
|
32
|
-
],
|
|
34
|
+
events: tinyErpEvents,
|
|
33
35
|
},
|
|
34
36
|
},
|
|
35
37
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,aAAa;AACb,MAAM,GAAG,GAA8B,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG,CAAC;OAC/E,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC;OACtC,EAAE,CAAC;AAER,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AAE9B,MAAM,IAAI,GAAG;IACX,QAAQ,EAAE;QACR,KAAK,EAAE,8BAA8B;QACrC,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,YAAY;QACnC,QAAQ,EAAE,GAAG,CAAC,aAAa,IAAI,gBAAgB;QAC/C,cAAc,EAAE,GAAG,CAAC,oBAAoB,IAAI,uBAAuB;QACnE,WAAW,EAAE,GAAG,CAAC,iBAAiB,IAAI,oBAAoB;QAC1D,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QAClC,oBAAoB,EAAE;YACpB,MAAM,EAAE,GAAG,CAAC,aAAa,IAAI,oBAAoB;SAClD;QACD,IAAI,EAAE;YACJ,SAAS,EAAE;gBACT,KAAK,EAAE,IAAI;aACZ;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,aAAa;AACb,MAAM,GAAG,GAA8B,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG,CAAC;OAC/E,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC;OACtC,EAAE,CAAC;AAER,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AAE9B,MAAM,aAAa,GAAmB;IACpC,qBAAqB;IACrB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;CACvB,CAAC;AAEF,MAAM,IAAI,GAAG;IACX,QAAQ,EAAE;QACR,KAAK,EAAE,8BAA8B;QACrC,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,YAAY;QACnC,QAAQ,EAAE,GAAG,CAAC,aAAa,IAAI,gBAAgB;QAC/C,cAAc,EAAE,GAAG,CAAC,oBAAoB,IAAI,uBAAuB;QACnE,WAAW,EAAE,GAAG,CAAC,iBAAiB,IAAI,oBAAoB;QAC1D,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QAClC,oBAAoB,EAAE;YACpB,MAAM,EAAE,GAAG,CAAC,aAAa,IAAI,oBAAoB;SAClD;QACD,IAAI,EAAE;YACJ,SAAS,EAAE;gBACT,KAAK,EAAE,IAAI;aACZ;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,aAAa;aACtB;SACF;KACF;CACF,CAAC;AAEF,eAAe;IACb,GAAG;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,MAAM;QACR,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;SACpC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,EAAE;IAChD,OAAO,MAAM,KAAK,aAAa,CAAC;AAClC,CAAC,CAAC"}
|
|
@@ -3,19 +3,21 @@ import { getFirestore } from 'firebase-admin/firestore';
|
|
|
3
3
|
import logger from 'firebase-functions/lib/logger';
|
|
4
4
|
import { PubSub } from '@google-cloud/pubsub';
|
|
5
5
|
import api from '@cloudcommerce/api';
|
|
6
|
-
import getEnv from '../env.js';
|
|
7
6
|
import config from '../config.js';
|
|
7
|
+
import { EVENT_SKIP_FLAG, GET_PUBSUB_TOPIC } from '../const.js';
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
const [resource,
|
|
11
|
-
const params = {
|
|
9
|
+
const parseEventName = (evName, baseApiEventsFilter) => {
|
|
10
|
+
const [resource, actionName] = evName.split('-');
|
|
11
|
+
const params = {
|
|
12
|
+
'flag!': EVENT_SKIP_FLAG,
|
|
13
|
+
};
|
|
12
14
|
const bodySet = { ...baseApiEventsFilter };
|
|
13
|
-
if (
|
|
15
|
+
if (actionName === 'new') {
|
|
14
16
|
params.action = 'create';
|
|
15
17
|
} else {
|
|
16
18
|
switch (resource) {
|
|
17
19
|
case 'orders':
|
|
18
|
-
switch (
|
|
20
|
+
switch (actionName) {
|
|
19
21
|
case 'paid':
|
|
20
22
|
bodySet['financial_status.current'] = 'paid';
|
|
21
23
|
break;
|
|
@@ -24,7 +26,7 @@ const parseEventsTopic = (eventsTopic, baseApiEventsFilter) => {
|
|
|
24
26
|
break;
|
|
25
27
|
case 'shipped':
|
|
26
28
|
case 'delivered':
|
|
27
|
-
bodySet['fulfillment_status.current'] =
|
|
29
|
+
bodySet['fulfillment_status.current'] = actionName;
|
|
28
30
|
break;
|
|
29
31
|
case 'cancelled':
|
|
30
32
|
bodySet.status = 'cancelled';
|
|
@@ -38,13 +40,16 @@ const parseEventsTopic = (eventsTopic, baseApiEventsFilter) => {
|
|
|
38
40
|
}
|
|
39
41
|
break;
|
|
40
42
|
case 'products':
|
|
41
|
-
params.modified_fields =
|
|
43
|
+
params.modified_fields = actionName === 'priceSet'
|
|
42
44
|
? ['price', 'variations.price']
|
|
43
45
|
: ['quantity']; // quantitySet
|
|
44
46
|
break;
|
|
45
47
|
case 'carts':
|
|
46
48
|
params.modified_fields = ['customers']; // customerSet
|
|
47
49
|
break;
|
|
50
|
+
case 'applications':
|
|
51
|
+
params.modified_fields = ['data', 'hidden_data']; // dataSet
|
|
52
|
+
break;
|
|
48
53
|
default:
|
|
49
54
|
}
|
|
50
55
|
}
|
|
@@ -78,7 +83,6 @@ export default async () => {
|
|
|
78
83
|
'timestamp<': new Date(timestamp).toISOString(),
|
|
79
84
|
};
|
|
80
85
|
const { apps } = config.get();
|
|
81
|
-
const { apiAuth } = getEnv();
|
|
82
86
|
const subscribersApps = [];
|
|
83
87
|
Object.keys(apps).forEach((appName) => {
|
|
84
88
|
const appObj = apps[appName];
|
|
@@ -86,27 +90,30 @@ export default async () => {
|
|
|
86
90
|
subscribersApps.push(appObj);
|
|
87
91
|
}
|
|
88
92
|
});
|
|
89
|
-
const
|
|
93
|
+
const activeApps = (await api.get('applications', {
|
|
90
94
|
params: {
|
|
91
95
|
state: 'active',
|
|
92
96
|
app_id: subscribersApps.map(({ appId }) => appId),
|
|
93
|
-
fields: 'app_id',
|
|
97
|
+
fields: '_id,app_id,data,hidden_data',
|
|
94
98
|
},
|
|
95
|
-
})).data.result
|
|
99
|
+
})).data.result;
|
|
96
100
|
const listenedEvents = [];
|
|
97
101
|
subscribersApps.forEach(({ appId, events }) => {
|
|
98
|
-
if (
|
|
99
|
-
events.forEach((
|
|
100
|
-
if (!listenedEvents.includes(
|
|
101
|
-
listenedEvents.push(
|
|
102
|
+
if (activeApps.find((app) => app.app_id === appId)) {
|
|
103
|
+
events.forEach((evName) => {
|
|
104
|
+
if (!listenedEvents.includes(evName)) {
|
|
105
|
+
listenedEvents.push(evName);
|
|
102
106
|
}
|
|
103
107
|
});
|
|
104
108
|
}
|
|
105
109
|
});
|
|
106
|
-
listenedEvents.forEach(async (
|
|
107
|
-
const { resource, params } =
|
|
110
|
+
listenedEvents.forEach(async (listenedEventName) => {
|
|
111
|
+
const { resource, params } = parseEventName(listenedEventName, baseApiEventsFilter);
|
|
112
|
+
if (resource !== 'orders' && resource !== 'carts' && new Date().getMinutes() % 5) {
|
|
113
|
+
// Other resource events are not listened to every minute
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
108
116
|
let { data: { result } } = await api.get(`events/${resource}`, {
|
|
109
|
-
...apiAuth,
|
|
110
117
|
params,
|
|
111
118
|
});
|
|
112
119
|
/*
|
|
@@ -124,23 +131,39 @@ export default async () => {
|
|
|
124
131
|
if (typeof middleware === 'function') {
|
|
125
132
|
result = await middleware(resource, result);
|
|
126
133
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
134
|
+
const resourceIdsRead = [];
|
|
135
|
+
result.forEach(async (apiEvent) => {
|
|
136
|
+
const resourceId = apiEvent.resource_id;
|
|
137
|
+
if (resourceIdsRead.includes(resourceId)) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
resourceIdsRead.push(resourceId);
|
|
141
|
+
const apiDoc = resource !== 'applications'
|
|
142
|
+
? (await api.get(`${resource}/${resourceId}`)).data
|
|
143
|
+
: null;
|
|
144
|
+
activeApps.forEach((app) => {
|
|
145
|
+
const appConfig = subscribersApps.find(({ appId }) => appId === app.app_id);
|
|
146
|
+
if (appConfig?.events.includes(listenedEventName)) {
|
|
147
|
+
const topicName = GET_PUBSUB_TOPIC(app.app_id);
|
|
148
|
+
const json = {
|
|
149
|
+
evName: listenedEventName,
|
|
150
|
+
apiEvent,
|
|
151
|
+
apiDoc: apiDoc || app,
|
|
152
|
+
app,
|
|
153
|
+
};
|
|
131
154
|
const messageObj = {
|
|
132
|
-
messageId: `${
|
|
133
|
-
json
|
|
155
|
+
messageId: `${resourceId}_${apiEvent.timestamp}`,
|
|
156
|
+
json,
|
|
134
157
|
};
|
|
135
158
|
tryPubSubPublish(topicName, messageObj);
|
|
136
159
|
}
|
|
137
160
|
});
|
|
138
161
|
});
|
|
139
|
-
logger.info(`> '${
|
|
162
|
+
logger.info(`> '${listenedEventName}' events: `, result);
|
|
140
163
|
});
|
|
141
164
|
return documentRef.set({
|
|
142
165
|
timestamp,
|
|
143
|
-
|
|
166
|
+
activeApps,
|
|
144
167
|
listenedEvents,
|
|
145
168
|
});
|
|
146
169
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-store-events.js","sourceRoot":"","sources":["../../src/handlers/check-store-events.ts"],"names":[],"mappings":"AACA,gDAAgD;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,MAAM,MAAM,+BAA+B,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,GAAkB,MAAM,oBAAoB,CAAC;AACpD,OAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"check-store-events.js","sourceRoot":"","sources":["../../src/handlers/check-store-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AppEventsPayload } from '@cloudcommerce/types';
|
|
2
|
+
import functions from 'firebase-functions';
|
|
3
|
+
declare type PubSubHandler<TMessage> = (json: TMessage, context: functions.EventContext, message: functions.pubsub.Message) => void;
|
|
4
|
+
declare type ApiEventHandler = PubSubHandler<AppEventsPayload>;
|
|
5
|
+
declare const createPubSubFunction: (pubSubTopic: string, fn: PubSubHandler<any>, eventMaxAgeMs?: number) => functions.CloudFunction<functions.pubsub.Message>;
|
|
6
|
+
declare const createAppEventsFunction: (appNameOrId: string | number, fn: ApiEventHandler, eventMaxAgeMs?: number) => functions.CloudFunction<functions.pubsub.Message>;
|
|
7
|
+
export default createPubSubFunction;
|
|
8
|
+
export { createPubSubFunction, createAppEventsFunction };
|
|
9
|
+
export type { PubSubHandler, ApiEventHandler };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import functions from 'firebase-functions';
|
|
2
|
+
import config from '../config.js';
|
|
3
|
+
import { GET_PUBSUB_TOPIC } from '../const.js';
|
|
4
|
+
|
|
5
|
+
const { logger } = functions;
|
|
6
|
+
/* eslint-enable no-unused-vars */
|
|
7
|
+
const createPubSubFunction = (pubSubTopic, fn, eventMaxAgeMs = 60000) => {
|
|
8
|
+
const { httpsFunctionOptions: { region } } = config.get();
|
|
9
|
+
return functions.region(region)
|
|
10
|
+
.runWith({ failurePolicy: true })
|
|
11
|
+
.pubsub.topic(pubSubTopic).onPublish((message, context) => {
|
|
12
|
+
const eventAgeMs = Date.now() - Date.parse(context.timestamp);
|
|
13
|
+
if (eventAgeMs > eventMaxAgeMs) {
|
|
14
|
+
logger.warn(`Dropping event ${context.eventId} with age[ms]: ${eventAgeMs}`);
|
|
15
|
+
}
|
|
16
|
+
fn(message.json, context, message);
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
const createAppEventsFunction = (appNameOrId, fn, eventMaxAgeMs = 60000) => {
|
|
20
|
+
let appId;
|
|
21
|
+
if (typeof appNameOrId === 'string') {
|
|
22
|
+
appId = config.get().apps[appNameOrId].appId;
|
|
23
|
+
} else {
|
|
24
|
+
appId = appNameOrId;
|
|
25
|
+
}
|
|
26
|
+
return createPubSubFunction(GET_PUBSUB_TOPIC(appId), fn, eventMaxAgeMs);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default createPubSubFunction;
|
|
30
|
+
|
|
31
|
+
export { createPubSubFunction, createAppEventsFunction };
|
|
32
|
+
// # sourceMappingURL=pubsub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../src/helpers/pubsub.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AAS7B,kCAAkC;AAElC,MAAM,oBAAoB,GAAG,CAC3B,WAAmB,EACnB,EAAsB,EACtB,aAAa,GAAG,KAAK,EACrB,EAAE;IACF,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAC1D,OAAO,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;SAC5B,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAChC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,UAAU,GAAG,aAAa,EAAE;YAC9B,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,OAAO,kBAAkB,UAAU,EAAE,CAAC,CAAC;SAC9E;QACD,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,WAA4B,EAC5B,EAAmB,EACnB,aAAa,GAAG,KAAK,EACrB,EAAE;IACF,IAAI,KAAa,CAAC;IAClB,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACnC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;KAC9C;SAAM;QACL,KAAK,GAAG,WAAW,CAAC;KACrB;IACD,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Applications } from '@cloudcommerce/types';
|
|
2
|
+
declare const _default: (application: Applications | Applications['_id'], data: Record<string, any>, { isHiddenData, canSendPubSub }?: {
|
|
3
|
+
isHiddenData?: boolean | undefined;
|
|
4
|
+
canSendPubSub?: boolean | undefined;
|
|
5
|
+
}) => Promise<Response & {
|
|
6
|
+
config: import("@cloudcommerce/api/lib/types").Config;
|
|
7
|
+
data: null;
|
|
8
|
+
}>;
|
|
9
|
+
export default _default;
|