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.
Files changed (135) hide show
  1. package/.eslintrc.cjs +2 -0
  2. package/CHANGELOG.md +23 -0
  3. package/package.json +9 -8
  4. package/packages/api/lib/api.d.ts +5036 -0
  5. package/packages/api/lib/{index.js → api.js} +16 -10
  6. package/packages/api/lib/api.js.map +1 -0
  7. package/packages/api/lib/types.d.ts +1 -0
  8. package/packages/api/package.json +3 -3
  9. package/packages/api/src/{index.ts → api.ts} +21 -17
  10. package/packages/api/src/types.ts +1 -0
  11. package/packages/api/tests/index.test.ts +2 -2
  12. package/packages/apps/discounts/lib/discounts.js +1 -1
  13. package/packages/apps/discounts/lib/discounts.js.map +1 -1
  14. package/packages/apps/discounts/{lib-cjs/apply-discount.cjs → lib-mjs/apply-discount.mjs} +7 -9
  15. package/packages/apps/discounts/{lib-cjs/helpers.cjs → lib-mjs/helpers.mjs} +2 -2
  16. package/packages/apps/discounts/package.json +1 -1
  17. package/packages/apps/discounts/src/discounts.ts +1 -1
  18. package/packages/apps/tiny-erp/lib/event-to-tiny.js +111 -0
  19. package/packages/apps/tiny-erp/lib/event-to-tiny.js.map +1 -0
  20. package/packages/apps/tiny-erp/lib/index.js +2 -0
  21. package/packages/apps/tiny-erp/lib/index.js.map +1 -0
  22. package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js +79 -0
  23. package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js.map +1 -0
  24. package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js +81 -0
  25. package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js.map +1 -0
  26. package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js +58 -0
  27. package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js.map +1 -0
  28. package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js +7 -0
  29. package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js.map +1 -0
  30. package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js +94 -0
  31. package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js.map +1 -0
  32. package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js +169 -0
  33. package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js.map +1 -0
  34. package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js +46 -0
  35. package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js.map +1 -0
  36. package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js +193 -0
  37. package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js.map +1 -0
  38. package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js +199 -0
  39. package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js.map +1 -0
  40. package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js +129 -0
  41. package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js.map +1 -0
  42. package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js +34 -0
  43. package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js.map +1 -0
  44. package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js +39 -0
  45. package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js.map +1 -0
  46. package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js +47 -0
  47. package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js.map +1 -0
  48. package/packages/apps/tiny-erp/lib/tiny-erp.js +17 -0
  49. package/packages/apps/tiny-erp/lib/tiny-erp.js.map +1 -0
  50. package/packages/apps/tiny-erp/lib/tiny-webhook.js +135 -0
  51. package/packages/apps/tiny-erp/lib/tiny-webhook.js.map +1 -0
  52. package/packages/apps/tiny-erp/package.json +13 -6
  53. package/packages/apps/tiny-erp/src/event-to-tiny.ts +129 -0
  54. package/packages/apps/tiny-erp/src/index.ts +1 -0
  55. package/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts +80 -0
  56. package/packages/apps/tiny-erp/src/integration/export-order-to-tiny.ts +86 -0
  57. package/packages/apps/tiny-erp/src/integration/export-product-to-tiny.ts +60 -0
  58. package/packages/apps/tiny-erp/src/integration/helpers/format-tiny-date.ts +6 -0
  59. package/packages/apps/tiny-erp/src/integration/import-order-from-tiny.ts +104 -0
  60. package/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts +174 -0
  61. package/packages/apps/tiny-erp/src/integration/parsers/order-from-tiny.ts +49 -0
  62. package/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts +205 -0
  63. package/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts +215 -0
  64. package/packages/apps/tiny-erp/src/integration/parsers/product-to-tiny.ts +138 -0
  65. package/packages/apps/tiny-erp/src/integration/parsers/status-from-tiny.ts +35 -0
  66. package/packages/apps/tiny-erp/src/integration/parsers/status-to-tiny.ts +42 -0
  67. package/packages/apps/tiny-erp/src/integration/post-tiny-erp.ts +52 -0
  68. package/packages/apps/tiny-erp/src/tiny-erp.ts +23 -0
  69. package/packages/apps/tiny-erp/src/tiny-webhook.ts +143 -0
  70. package/packages/cli/package.json +1 -1
  71. package/packages/events/lib/firebase.js +2 -26
  72. package/packages/events/lib/firebase.js.map +1 -1
  73. package/packages/events/lib/index.js +1 -1
  74. package/packages/events/lib/index.js.map +1 -1
  75. package/packages/events/package.json +1 -1
  76. package/packages/events/src/firebase.ts +2 -28
  77. package/packages/events/src/index.ts +1 -1
  78. package/packages/firebase/lib/config.d.ts +2 -2
  79. package/packages/firebase/lib/config.js +7 -5
  80. package/packages/firebase/lib/config.js.map +1 -1
  81. package/packages/firebase/lib/const.d.ts +2 -0
  82. package/packages/firebase/lib/const.js +6 -0
  83. package/packages/firebase/lib/const.js.map +1 -0
  84. package/packages/firebase/lib/handlers/check-store-events.js +50 -27
  85. package/packages/firebase/lib/handlers/check-store-events.js.map +1 -1
  86. package/packages/firebase/lib/helpers/pubsub.d.ts +9 -0
  87. package/packages/firebase/lib/helpers/pubsub.js +32 -0
  88. package/packages/firebase/lib/helpers/pubsub.js.map +1 -0
  89. package/packages/firebase/lib/helpers/update-app-data.d.ts +9 -0
  90. package/packages/firebase/lib/helpers/update-app-data.js +45 -0
  91. package/packages/firebase/lib/helpers/update-app-data.js.map +1 -0
  92. package/packages/firebase/lib/index.d.ts +1 -2
  93. package/packages/firebase/lib/index.js +1 -6
  94. package/packages/firebase/lib/index.js.map +1 -1
  95. package/packages/firebase/lib/init.d.ts +2 -0
  96. package/packages/firebase/lib/init.js +9 -0
  97. package/packages/firebase/lib/init.js.map +1 -0
  98. package/packages/firebase/package.json +5 -2
  99. package/packages/firebase/src/config.ts +9 -6
  100. package/packages/firebase/src/const.ts +5 -0
  101. package/packages/firebase/src/handlers/check-store-events.ts +56 -33
  102. package/packages/firebase/src/helpers/pubsub.ts +52 -0
  103. package/packages/firebase/src/helpers/update-app-data.ts +49 -0
  104. package/packages/firebase/src/index.ts +1 -7
  105. package/packages/firebase/src/init.ts +9 -0
  106. package/packages/modules/lib/firebase/handle-module.js +4 -5
  107. package/packages/modules/lib/firebase/handle-module.js.map +1 -1
  108. package/packages/modules/lib/firebase/serve-modules-api.js +2 -2
  109. package/packages/modules/lib/firebase/serve-modules-api.js.map +1 -1
  110. package/packages/modules/lib/firebase.js +2 -7
  111. package/packages/modules/lib/firebase.js.map +1 -1
  112. package/packages/modules/package.json +1 -1
  113. package/packages/modules/src/firebase/handle-module.ts +2 -5
  114. package/packages/modules/src/firebase/serve-modules-api.ts +2 -6
  115. package/packages/modules/src/firebase.ts +2 -7
  116. package/packages/passport/lib/firebase/handle-passport.js +12 -10
  117. package/packages/passport/lib/firebase/handle-passport.js.map +1 -1
  118. package/packages/passport/lib/firebase/serve-passport-api.js +2 -2
  119. package/packages/passport/lib/firebase/serve-passport-api.js.map +1 -1
  120. package/packages/passport/lib/firebase.js +2 -7
  121. package/packages/passport/lib/firebase.js.map +1 -1
  122. package/packages/passport/package.json +1 -1
  123. package/packages/passport/src/firebase/handle-passport.ts +10 -19
  124. package/packages/passport/src/firebase/serve-passport-api.ts +0 -2
  125. package/packages/passport/src/firebase.ts +1 -7
  126. package/packages/ssr/lib/firebase.js +1 -4
  127. package/packages/ssr/lib/firebase.js.map +1 -1
  128. package/packages/ssr/package.json +1 -1
  129. package/packages/ssr/src/firebase.ts +1 -4
  130. package/packages/storefront/package.json +4 -4
  131. package/packages/types/index.ts +18 -3
  132. package/packages/types/package.json +1 -1
  133. package/packages/api/lib/index.d.ts +0 -9974
  134. package/packages/api/lib/index.js.map +0 -1
  135. 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,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/cli",
3
3
  "type": "module",
4
- "version": "0.0.59",
4
+ "version": "0.0.60",
5
5
  "description": "E-Com Plus Cloud Commerce CLI tools",
6
6
  "bin": {
7
7
  "cloudcommerce": "./bin/run.mjs"
@@ -1,29 +1,5 @@
1
1
  /* eslint-disable import/prefer-default-export */
2
- import 'source-map-support/register.js';
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
- const { logger } = functions;
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;AAGjD,OAAO,gCAAgC,CAAC;AACxC,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,oCAAoC,CAAC;AAExD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AAC7B,aAAa,EAAE,CAAC;AAEhB,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,aAAa,GAAmB,YAAY,CAAC;AACnD,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;KAC/C,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;KAChC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,UAAU,GAAG,aAAa,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,OAAO,kBAAkB,UAAU,EAAE,CAAC,CAAC;QAC7E,OAAO;KACR;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,IAAI,CAAC;QACV,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI;KACL,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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
- export default {};
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,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/events",
3
3
  "type": "module",
4
- "version": "0.0.59",
4
+ "version": "0.0.60",
5
5
  "description": "E-Com Plus Cloud Commerce app events",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -1,31 +1,5 @@
1
1
  /* eslint-disable import/prefer-default-export */
2
2
 
3
- import type { AppEventsTopic } from '@cloudcommerce/types';
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
- const { logger } = functions;
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
- export default {};
1
+ import './firebase';
@@ -1,4 +1,4 @@
1
- import type { AppEventsTopic } from '@cloudcommerce/types';
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: AppEventsTopic[];
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;oBACN,qBAAqB;oBACrB,cAAc;oBACd,mBAAmB;iBACA;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"}
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,2 @@
1
+ export declare const EVENT_SKIP_FLAG = "_skip";
2
+ export declare const GET_PUBSUB_TOPIC: (appId: number) => string;
@@ -0,0 +1,6 @@
1
+ export const EVENT_SKIP_FLAG = '_skip';
2
+
3
+ export const GET_PUBSUB_TOPIC = (appId) => {
4
+ return `app${appId}_api_events`;
5
+ };
6
+ // # sourceMappingURL=const.js.map
@@ -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 parseEventsTopic = (eventsTopic, baseApiEventsFilter) => {
10
- const [resource, eventName] = eventsTopic.split('-');
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 (eventName === 'new') {
15
+ if (actionName === 'new') {
14
16
  params.action = 'create';
15
17
  } else {
16
18
  switch (resource) {
17
19
  case 'orders':
18
- switch (eventName) {
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'] = eventName;
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 = eventName === 'priceSet'
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 activeAppsIds = (await api.get('applications', {
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.map((app) => app.app_id);
99
+ })).data.result;
96
100
  const listenedEvents = [];
97
101
  subscribersApps.forEach(({ appId, events }) => {
98
- if (activeAppsIds.includes(appId)) {
99
- events.forEach((eventsTopic) => {
100
- if (!listenedEvents.includes(eventsTopic)) {
101
- listenedEvents.push(eventsTopic);
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 (eventsTopic) => {
107
- const { resource, params } = parseEventsTopic(eventsTopic, baseApiEventsFilter);
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
- result.forEach((apiEvent) => {
128
- subscribersApps.forEach(({ appId, events }) => {
129
- if (events.includes(eventsTopic) && activeAppsIds.includes(appId)) {
130
- const topicName = `app${appId}_${eventsTopic}`;
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: `${eventsTopic}_${apiEvent.timestamp}`,
133
- json: apiEvent,
155
+ messageId: `${resourceId}_${apiEvent.timestamp}`,
156
+ json,
134
157
  };
135
158
  tryPubSubPublish(topicName, messageObj);
136
159
  }
137
160
  });
138
161
  });
139
- logger.info(`> '${eventsTopic}' events: `, result);
162
+ logger.info(`> '${listenedEventName}' events: `, result);
140
163
  });
141
164
  return documentRef.set({
142
165
  timestamp,
143
- activeAppsIds,
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":"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"}
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;