cloudcommerce 0.0.57 → 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 (145) hide show
  1. package/.eslintrc.cjs +2 -0
  2. package/CHANGELOG.md +41 -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/CHANGELOG.md +1 -0
  19. package/packages/apps/tiny-erp/README.md +1 -0
  20. package/packages/apps/tiny-erp/lib/event-to-tiny.js +111 -0
  21. package/packages/apps/tiny-erp/lib/event-to-tiny.js.map +1 -0
  22. package/packages/apps/tiny-erp/lib/index.js +2 -0
  23. package/packages/apps/tiny-erp/lib/index.js.map +1 -0
  24. package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js +79 -0
  25. package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js.map +1 -0
  26. package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js +81 -0
  27. package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js.map +1 -0
  28. package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js +58 -0
  29. package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js.map +1 -0
  30. package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js +7 -0
  31. package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js.map +1 -0
  32. package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js +94 -0
  33. package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js.map +1 -0
  34. package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js +169 -0
  35. package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js.map +1 -0
  36. package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js +46 -0
  37. package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js.map +1 -0
  38. package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js +193 -0
  39. package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js.map +1 -0
  40. package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js +199 -0
  41. package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js.map +1 -0
  42. package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js +129 -0
  43. package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js.map +1 -0
  44. package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js +34 -0
  45. package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js.map +1 -0
  46. package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js +39 -0
  47. package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js.map +1 -0
  48. package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js +47 -0
  49. package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js.map +1 -0
  50. package/packages/apps/tiny-erp/lib/tiny-erp.js +17 -0
  51. package/packages/apps/tiny-erp/lib/tiny-erp.js.map +1 -0
  52. package/packages/apps/tiny-erp/lib/tiny-webhook.js +135 -0
  53. package/packages/apps/tiny-erp/lib/tiny-webhook.js.map +1 -0
  54. package/packages/apps/tiny-erp/package.json +34 -0
  55. package/packages/apps/tiny-erp/src/event-to-tiny.ts +129 -0
  56. package/packages/apps/tiny-erp/src/index.ts +1 -0
  57. package/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts +80 -0
  58. package/packages/apps/tiny-erp/src/integration/export-order-to-tiny.ts +86 -0
  59. package/packages/apps/tiny-erp/src/integration/export-product-to-tiny.ts +60 -0
  60. package/packages/apps/tiny-erp/src/integration/helpers/format-tiny-date.ts +6 -0
  61. package/packages/apps/tiny-erp/src/integration/import-order-from-tiny.ts +104 -0
  62. package/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts +174 -0
  63. package/packages/apps/tiny-erp/src/integration/parsers/order-from-tiny.ts +49 -0
  64. package/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts +205 -0
  65. package/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts +215 -0
  66. package/packages/apps/tiny-erp/src/integration/parsers/product-to-tiny.ts +138 -0
  67. package/packages/apps/tiny-erp/src/integration/parsers/status-from-tiny.ts +35 -0
  68. package/packages/apps/tiny-erp/src/integration/parsers/status-to-tiny.ts +42 -0
  69. package/packages/apps/tiny-erp/src/integration/post-tiny-erp.ts +52 -0
  70. package/packages/apps/tiny-erp/src/tiny-erp.ts +23 -0
  71. package/packages/apps/tiny-erp/src/tiny-webhook.ts +143 -0
  72. package/packages/apps/tiny-erp/tsconfig.json +3 -0
  73. package/packages/cli/config/firebase.json +6 -3
  74. package/packages/cli/lib/index.js +23 -4
  75. package/packages/cli/lib/{config-gcloud.js → setup-gcloud.js} +2 -2
  76. package/packages/cli/lib/setup-gh.js +59 -0
  77. package/packages/cli/package.json +2 -1
  78. package/packages/cli/src/index.ts +30 -3
  79. package/packages/cli/src/{config-gcloud.ts → setup-gcloud.ts} +2 -2
  80. package/packages/cli/src/setup-gh.ts +83 -0
  81. package/packages/events/lib/firebase.js +2 -26
  82. package/packages/events/lib/firebase.js.map +1 -1
  83. package/packages/events/lib/index.js +1 -1
  84. package/packages/events/lib/index.js.map +1 -1
  85. package/packages/events/package.json +2 -1
  86. package/packages/events/src/firebase.ts +2 -28
  87. package/packages/events/src/index.ts +1 -1
  88. package/packages/firebase/lib/config.d.ts +2 -2
  89. package/packages/firebase/lib/config.js +8 -6
  90. package/packages/firebase/lib/config.js.map +1 -1
  91. package/packages/firebase/lib/const.d.ts +2 -0
  92. package/packages/firebase/lib/const.js +6 -0
  93. package/packages/firebase/lib/const.js.map +1 -0
  94. package/packages/firebase/lib/handlers/check-store-events.d.ts +1 -1
  95. package/packages/firebase/lib/handlers/check-store-events.js +86 -22
  96. package/packages/firebase/lib/handlers/check-store-events.js.map +1 -1
  97. package/packages/firebase/lib/helpers/pubsub.d.ts +9 -0
  98. package/packages/firebase/lib/helpers/pubsub.js +32 -0
  99. package/packages/firebase/lib/helpers/pubsub.js.map +1 -0
  100. package/packages/firebase/lib/helpers/update-app-data.d.ts +9 -0
  101. package/packages/firebase/lib/helpers/update-app-data.js +45 -0
  102. package/packages/firebase/lib/helpers/update-app-data.js.map +1 -0
  103. package/packages/firebase/lib/index.d.ts +1 -2
  104. package/packages/firebase/lib/index.js +1 -6
  105. package/packages/firebase/lib/index.js.map +1 -1
  106. package/packages/firebase/lib/init.d.ts +2 -0
  107. package/packages/firebase/lib/init.js +9 -0
  108. package/packages/firebase/lib/init.js.map +1 -0
  109. package/packages/firebase/package.json +6 -2
  110. package/packages/firebase/src/config.ts +10 -7
  111. package/packages/firebase/src/const.ts +5 -0
  112. package/packages/firebase/src/handlers/check-store-events.ts +100 -28
  113. package/packages/firebase/src/helpers/pubsub.ts +52 -0
  114. package/packages/firebase/src/helpers/update-app-data.ts +49 -0
  115. package/packages/firebase/src/index.ts +1 -7
  116. package/packages/firebase/src/init.ts +9 -0
  117. package/packages/modules/lib/firebase/handle-module.js +4 -5
  118. package/packages/modules/lib/firebase/handle-module.js.map +1 -1
  119. package/packages/modules/lib/firebase/serve-modules-api.js +2 -2
  120. package/packages/modules/lib/firebase/serve-modules-api.js.map +1 -1
  121. package/packages/modules/lib/firebase.js +2 -7
  122. package/packages/modules/lib/firebase.js.map +1 -1
  123. package/packages/modules/package.json +1 -1
  124. package/packages/modules/src/firebase/handle-module.ts +2 -5
  125. package/packages/modules/src/firebase/serve-modules-api.ts +2 -6
  126. package/packages/modules/src/firebase.ts +2 -7
  127. package/packages/passport/lib/firebase/handle-passport.js +12 -10
  128. package/packages/passport/lib/firebase/handle-passport.js.map +1 -1
  129. package/packages/passport/lib/firebase/serve-passport-api.js +2 -2
  130. package/packages/passport/lib/firebase/serve-passport-api.js.map +1 -1
  131. package/packages/passport/lib/firebase.js +2 -7
  132. package/packages/passport/lib/firebase.js.map +1 -1
  133. package/packages/passport/package.json +1 -1
  134. package/packages/passport/src/firebase/handle-passport.ts +10 -19
  135. package/packages/passport/src/firebase/serve-passport-api.ts +0 -2
  136. package/packages/passport/src/firebase.ts +1 -7
  137. package/packages/ssr/lib/firebase.js +1 -4
  138. package/packages/ssr/lib/firebase.js.map +1 -1
  139. package/packages/ssr/package.json +1 -1
  140. package/packages/ssr/src/firebase.ts +1 -4
  141. package/packages/storefront/package.json +5 -4
  142. package/packages/types/index.ts +18 -3
  143. package/packages/types/package.json +1 -1
  144. package/packages/api/lib/index.d.ts +0 -9974
  145. package/packages/api/lib/index.js.map +0 -1
@@ -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',
@@ -17,7 +23,7 @@ const self = {
17
23
  countryCode: env.ECOM_COUNTRY_CODE || DEFAULT_COUNTRY_CODE,
18
24
  storeId: Number(env.ECOM_STORE_ID),
19
25
  httpsFunctionOptions: {
20
- region: env.DEPLOY_REGION || 'us-central1',
26
+ region: env.DEPLOY_REGION || 'southamerica-east1',
21
27
  },
22
28
  apps: {
23
29
  discounts: {
@@ -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,aAAa;SAC3C;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"}
@@ -1,2 +1,2 @@
1
- declare const _default: () => Promise<boolean>;
1
+ declare const _default: () => Promise<FirebaseFirestore.WriteResult>;
2
2
  export default _default;
@@ -1,18 +1,23 @@
1
+ // eslint-disable-next-line import/no-unresolved
2
+ import { getFirestore } from 'firebase-admin/firestore';
1
3
  import logger from 'firebase-functions/lib/logger';
4
+ import { PubSub } from '@google-cloud/pubsub';
2
5
  import api from '@cloudcommerce/api';
3
- import getEnv from '../env.js';
4
6
  import config from '../config.js';
7
+ import { EVENT_SKIP_FLAG, GET_PUBSUB_TOPIC } from '../const.js';
5
8
 
6
- const parseEventsTopic = (eventsTopic) => {
7
- const [resource, eventName] = eventsTopic.split('-');
8
- const params = {};
9
- const bodySet = {};
10
- if (eventName === 'new') {
9
+ const parseEventName = (evName, baseApiEventsFilter) => {
10
+ const [resource, actionName] = evName.split('-');
11
+ const params = {
12
+ 'flag!': EVENT_SKIP_FLAG,
13
+ };
14
+ const bodySet = { ...baseApiEventsFilter };
15
+ if (actionName === 'new') {
11
16
  params.action = 'create';
12
17
  } else {
13
18
  switch (resource) {
14
19
  case 'orders':
15
- switch (eventName) {
20
+ switch (actionName) {
16
21
  case 'paid':
17
22
  bodySet['financial_status.current'] = 'paid';
18
23
  break;
@@ -21,7 +26,7 @@ const parseEventsTopic = (eventsTopic) => {
21
26
  break;
22
27
  case 'shipped':
23
28
  case 'delivered':
24
- bodySet['fulfillment_status.current'] = eventName;
29
+ bodySet['fulfillment_status.current'] = actionName;
25
30
  break;
26
31
  case 'cancelled':
27
32
  bodySet.status = 'cancelled';
@@ -35,13 +40,16 @@ const parseEventsTopic = (eventsTopic) => {
35
40
  }
36
41
  break;
37
42
  case 'products':
38
- params.modified_fields = eventName === 'priceSet'
43
+ params.modified_fields = actionName === 'priceSet'
39
44
  ? ['price', 'variations.price']
40
45
  : ['quantity']; // quantitySet
41
46
  break;
42
47
  case 'carts':
43
48
  params.modified_fields = ['customers']; // customerSet
44
49
  break;
50
+ case 'applications':
51
+ params.modified_fields = ['data', 'hidden_data']; // dataSet
52
+ break;
45
53
  default:
46
54
  }
47
55
  }
@@ -50,10 +58,31 @@ const parseEventsTopic = (eventsTopic) => {
50
58
  });
51
59
  return { resource, params };
52
60
  };
61
+ const pubSubClient = new PubSub();
62
+ const tryPubSubPublish = (topicName, messageObj, retries = 0) => {
63
+ pubSubClient.topic(topicName).publishMessage(messageObj)
64
+ .catch((err) => {
65
+ // eslint-disable-next-line no-param-reassign
66
+ err.retries = retries;
67
+ logger.error(err);
68
+ if (retries <= 3) {
69
+ setTimeout(() => {
70
+ tryPubSubPublish(topicName, messageObj, retries + 1);
71
+ }, 1000 * (2 ** retries));
72
+ }
73
+ });
74
+ };
53
75
 
54
76
  export default async () => {
77
+ const timestamp = Date.now();
78
+ const documentRef = getFirestore().doc('storeEvents/last');
79
+ const lastRunTimestamp = (await documentRef.get()).get('timestamp')
80
+ || Date.now() - 1000 * 60 * 5;
81
+ const baseApiEventsFilter = {
82
+ 'timestamp>': new Date(lastRunTimestamp - 1).toISOString(),
83
+ 'timestamp<': new Date(timestamp).toISOString(),
84
+ };
55
85
  const { apps } = config.get();
56
- const { apiAuth } = getEnv();
57
86
  const subscribersApps = [];
58
87
  Object.keys(apps).forEach((appName) => {
59
88
  const appObj = apps[appName];
@@ -61,27 +90,30 @@ export default async () => {
61
90
  subscribersApps.push(appObj);
62
91
  }
63
92
  });
64
- const activeSubscribersApps = (await api.get('applications', {
93
+ const activeApps = (await api.get('applications', {
65
94
  params: {
66
95
  state: 'active',
67
96
  app_id: subscribersApps.map(({ appId }) => appId),
68
- fields: 'app_id',
97
+ fields: '_id,app_id,data,hidden_data',
69
98
  },
70
99
  })).data.result;
71
- logger.info({ activeSubscribersApps });
72
100
  const listenedEvents = [];
73
101
  subscribersApps.forEach(({ appId, events }) => {
74
- if (activeSubscribersApps.find((app) => app.app_id === appId)) {
75
- events.forEach((eventsTopic) => {
76
- 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);
106
+ }
77
107
  });
78
108
  }
79
109
  });
80
- logger.info({ listenedEvents });
81
- listenedEvents.forEach(async (eventsTopic) => {
82
- const { resource, params } = parseEventsTopic(eventsTopic);
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
+ }
83
116
  let { data: { result } } = await api.get(`events/${resource}`, {
84
- ...apiAuth,
85
117
  params,
86
118
  });
87
119
  /*
@@ -99,8 +131,40 @@ export default async () => {
99
131
  if (typeof middleware === 'function') {
100
132
  result = await middleware(resource, result);
101
133
  }
102
- logger.info(`> '${eventsTopic}' events: `, result);
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
+ };
154
+ const messageObj = {
155
+ messageId: `${resourceId}_${apiEvent.timestamp}`,
156
+ json,
157
+ };
158
+ tryPubSubPublish(topicName, messageObj);
159
+ }
160
+ });
161
+ });
162
+ logger.info(`> '${listenedEventName}' events: `, result);
163
+ });
164
+ return documentRef.set({
165
+ timestamp,
166
+ activeApps,
167
+ listenedEvents,
103
168
  });
104
- return true;
105
169
  };
106
170
  // # sourceMappingURL=check-store-events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-store-events.js","sourceRoot":"","sources":["../../src/handlers/check-store-events.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,+BAA+B,CAAC;AACnD,OAAO,GAAkB,MAAM,oBAAoB,CAAC;AACpD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,WAAW,CAAC;AAE/B,MAAM,gBAAgB,GAAG,CAAC,WAA2B,EAAE,EAAE;IACvD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,SAAS,KAAK,KAAK,EAAE;QACvB,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;KAC1B;SAAM;QACL,QAAQ,QAAQ,EAAE;YAChB,KAAK,QAAQ;gBACX,QAAQ,SAAS,EAAE;oBACjB,KAAK,MAAM;wBACT,OAAO,CAAC,0BAA0B,CAAC,GAAG,MAAM,CAAC;wBAC7C,MAAM;oBACR,KAAK,kBAAkB;wBACrB,OAAO,CAAC,4BAA4B,CAAC,GAAG,oBAAoB,CAAC;wBAC7D,MAAM;oBACR,KAAK,SAAS,CAAC;oBACf,KAAK,WAAW;wBACd,OAAO,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAAC;wBAClD,MAAM;oBACR,KAAK,WAAW;wBACd,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;wBAC7B,MAAM;oBACR,SAAS,eAAe;wBACtB,MAAM,CAAC,eAAe,GAAG;4BACvB,kBAAkB;4BAClB,oBAAoB;4BACpB,QAAQ;yBACT,CAAC;iBACL;gBACD,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,CAAC,eAAe,GAAG,SAAS,KAAK,UAAU;oBAC/C,CAAC,CAAC,CAAC,OAAO,EAAE,kBAAkB,CAAC;oBAC/B,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc;gBAChC,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,eAAe,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;gBACtD,MAAM;YACR,QAAQ;SACT;KACF;IACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACrC,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAGxB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,KAAK,IAAI,EAAE;IACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,MAAM,eAAe,GAAuD,EAAE,CAAC;IAC/E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YACzC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9B;IACH,CAAC,CAAC,CAAC;IACH,MAAM,qBAAqB,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE;QAC3D,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC;YACjD,MAAM,EAAE,QAAQ;SACjB;KACF,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACvC,MAAM,cAAc,GAAqB,EAAE,CAAC;IAC5C,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5C,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE;YAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC7B,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;IAChC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;QAC3C,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC3D,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,QAAQ,EAAE,EAAE;YAC7D,GAAG,OAAO;YACV,MAAM;SACP,CAAC,CAAC;QACH;;;;;;;;;;UAUE;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC;QAChD,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE;YACpC,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;SAC7C;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,WAAW,YAAY,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
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;
@@ -0,0 +1,45 @@
1
+ import { PubSub } from '@google-cloud/pubsub';
2
+ import logger from 'firebase-functions/lib/logger';
3
+ import api from '@cloudcommerce/api';
4
+ import { EVENT_SKIP_FLAG, GET_PUBSUB_TOPIC } from '../const.js';
5
+
6
+ export default async (application, data, { isHiddenData = false, canSendPubSub = true } = {}) => {
7
+ const applicationId = typeof application === 'string'
8
+ ? application : application._id;
9
+ const subresource = isHiddenData ? 'hidden_data' : 'data';
10
+ if (application && typeof application === 'object' && canSendPubSub) {
11
+ // eslint-disable-next-line no-param-reassign
12
+ application[subresource] = data;
13
+ const json = {
14
+ evName: 'applications-dataSet',
15
+ apiEvent: {
16
+ timestamp: new Date().toISOString(),
17
+ resource_id: applicationId,
18
+ action: 'update',
19
+ modified_fields: [subresource],
20
+ authentication_id: null,
21
+ },
22
+ apiDoc: application,
23
+ app: {
24
+ _id: applicationId,
25
+ app_id: application.app_id,
26
+ data: application.data,
27
+ hidden_data: application.hidden_data,
28
+ },
29
+ isInternal: true,
30
+ };
31
+ try {
32
+ await new PubSub()
33
+ .topic(GET_PUBSUB_TOPIC(application.app_id))
34
+ .publishMessage({ json });
35
+ } catch (err) {
36
+ logger.error(err);
37
+ }
38
+ }
39
+ return api.patch(`applications/${applicationId}/${subresource}`, data, {
40
+ headers: {
41
+ 'X-Event-Flag': EVENT_SKIP_FLAG,
42
+ },
43
+ });
44
+ };
45
+ // # sourceMappingURL=update-app-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-app-data.js","sourceRoot":"","sources":["../../src/helpers/update-app-data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,MAAM,MAAM,+BAA+B,CAAC;AACnD,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7D,eAAe,KAAK,EAClB,WAA+C,EAC/C,IAAyB,EACzB,EAAE,YAAY,GAAG,KAAK,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,EAAE,EACnD,EAAE;IACF,MAAM,aAAa,GAAG,OAAO,WAAW,KAAK,QAAQ;QACnD,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;IAClC,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,aAAa,EAAE;QACnE,6CAA6C;QAC7C,WAAW,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAChC,MAAM,IAAI,GAAqB;YAC7B,MAAM,EAAE,sBAAsB;YAC9B,QAAQ,EAAE;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,WAAW,EAAE,aAAa;gBAC1B,MAAM,EAAE,QAAQ;gBAChB,eAAe,EAAE,CAAC,WAAW,CAAC;gBAC9B,iBAAiB,EAAE,IAAI;aACxB;YACD,MAAM,EAAE,WAAW;YACnB,GAAG,EAAE;gBACH,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,WAAW,EAAE,WAAW,CAAC,WAAW;aACrC;YACD,UAAU,EAAE,IAAI;SACjB,CAAC;QACF,IAAI;YACF,MAAM,IAAI,MAAM,EAAE;iBACf,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;iBAC3C,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACnB;KACF;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,gBAAgB,aAAa,IAAI,WAAW,EAAE,EAAE,IAAI,EAAE;QACrE,OAAO,EAAE;YACP,cAAc,EAAE,eAAe;SAChC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1,4 +1,3 @@
1
- import 'source-map-support/register.js';
2
- import '@cloudcommerce/api/fetch-polyfill.js';
1
+ import './init';
3
2
  import functions from 'firebase-functions';
4
3
  export declare const cronStoreEvents: functions.CloudFunction<unknown>;
@@ -1,14 +1,9 @@
1
1
  /* eslint-disable import/prefer-default-export */
2
- import 'source-map-support/register.js';
3
- import '@cloudcommerce/api/fetch-polyfill.js';
4
- // https://github.com/import-js/eslint-plugin-import/issues/1810
5
- // eslint-disable-next-line import/no-unresolved
6
- import { initializeApp } from 'firebase-admin/app';
2
+ import './init';
7
3
  import functions from 'firebase-functions';
8
4
  import config from './config.js';
9
5
  import checkStoreEvents from './handlers/check-store-events.js';
10
6
 
11
- initializeApp();
12
7
  const { httpsFunctionOptions: { region } } = config.get();
13
8
  const functionBuilder = functions
14
9
  .region(region)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,gCAAgC,CAAC;AACxC,OAAO,sCAAsC,CAAC;AAC9C,gEAAgE;AAChE,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,aAAa,EAAE,CAAC;AAEhB,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,eAAe,GAAG,SAAS;KAC9B,MAAM,CAAC,MAAM,CAAC;KACd,OAAO,CAAC;IACP,cAAc,EAAE,GAAG;IACnB,MAAM,EAAE,OAAO;CAChB,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM;KAClD,QAAQ,CAAC,WAAW,CAAC;KACrB,KAAK,CAAC,GAAG,EAAE;IACV,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,QAAQ,CAAC;AAChB,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,eAAe,GAAG,SAAS;KAC9B,MAAM,CAAC,MAAM,CAAC;KACd,OAAO,CAAC;IACP,cAAc,EAAE,GAAG;IACnB,MAAM,EAAE,OAAO;CAChB,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM;KAClD,QAAQ,CAAC,WAAW,CAAC;KACrB,KAAK,CAAC,GAAG,EAAE;IACV,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import 'source-map-support/register.js';
2
+ import '@cloudcommerce/api/fetch-polyfill.js';
@@ -0,0 +1,9 @@
1
+ /* eslint-disable import/first */
2
+ import 'source-map-support/register.js';
3
+ import '@cloudcommerce/api/fetch-polyfill.js';
4
+ // https://github.com/import-js/eslint-plugin-import/issues/1810
5
+ // eslint-disable-next-line import/no-unresolved
6
+ import { initializeApp } from 'firebase-admin/app';
7
+
8
+ initializeApp();
9
+ // # sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,OAAO,gCAAgC,CAAC;AACxC,OAAO,sCAAsC,CAAC;AAC9C,gEAAgE;AAChE,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,aAAa,EAAE,CAAC"}
@@ -1,15 +1,18 @@
1
1
  {
2
2
  "name": "@cloudcommerce/firebase",
3
3
  "type": "module",
4
- "version": "0.0.57",
4
+ "version": "0.0.60",
5
5
  "description": "E-Com Plus Cloud Commerce on Firebase",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
8
8
  "exports": {
9
9
  ".": "./lib/index.js",
10
10
  "./config": "./config.js",
11
+ "./lib/init": "./lib/init.js",
11
12
  "./lib/config": "./lib/config.js",
12
- "./lib/env": "./lib/env.js"
13
+ "./lib/env": "./lib/env.js",
14
+ "./lib/helpers/pubsub": "./lib/helpers/pubsub.js",
15
+ "./lib/helpers/update-app-data": "./lib/helpers/update-app-data.js"
13
16
  },
14
17
  "repository": {
15
18
  "type": "git",
@@ -28,6 +31,7 @@
28
31
  "dependencies": {
29
32
  "@cloudcommerce/api": "workspace:*",
30
33
  "@fastify/deepmerge": "^1.1.0",
34
+ "@google-cloud/pubsub": "^3.1.0",
31
35
  "firebase-admin": "^11.0.1",
32
36
  "firebase-functions": "^3.22.0",
33
37
  "node-fetch": "^3.2.10",
@@ -1,4 +1,4 @@
1
- import type { AppEventsTopic } from '@cloudcommerce/types';
1
+ import type { ApiEventName } from '@cloudcommerce/types';
2
2
  import Deepmerge from '@fastify/deepmerge';
3
3
  import {
4
4
  DEFAULT_LANG,
@@ -14,6 +14,13 @@ const env: { [key: string]: string } = (typeof process === 'object' && process?.
14
14
 
15
15
  const deepmerge = Deepmerge();
16
16
 
17
+ const tinyErpEvents: ApiEventName[] = [
18
+ 'orders-anyStatusSet',
19
+ 'products-new',
20
+ 'products-priceSet',
21
+ 'applications-dataSet',
22
+ ];
23
+
17
24
  const self = {
18
25
  __config: {
19
26
  hello: 'from @cloudcommerce/firebase',
@@ -23,7 +30,7 @@ const self = {
23
30
  countryCode: env.ECOM_COUNTRY_CODE || DEFAULT_COUNTRY_CODE,
24
31
  storeId: Number(env.ECOM_STORE_ID),
25
32
  httpsFunctionOptions: {
26
- region: env.DEPLOY_REGION || 'us-central1',
33
+ region: env.DEPLOY_REGION || 'southamerica-east1',
27
34
  },
28
35
  apps: {
29
36
  discounts: {
@@ -31,11 +38,7 @@ const self = {
31
38
  },
32
39
  tinyErp: {
33
40
  appId: 105922,
34
- events: [
35
- 'orders-anyStatusSet',
36
- 'products-new',
37
- 'products-priceSet',
38
- ] as AppEventsTopic[],
41
+ events: tinyErpEvents,
39
42
  },
40
43
  },
41
44
  },
@@ -0,0 +1,5 @@
1
+ export const EVENT_SKIP_FLAG = '_skip';
2
+
3
+ export const GET_PUBSUB_TOPIC = (appId: number) => {
4
+ return `app${appId}_api_events`;
5
+ };