cloudcommerce 0.0.118 → 0.0.119

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 (58) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/ecomplus-stores/monocard/functions/core/package.json +1 -1
  3. package/ecomplus-stores/monocard/functions/events/package.json +2 -2
  4. package/ecomplus-stores/monocard/functions/modules/package.json +2 -2
  5. package/ecomplus-stores/monocard/functions/passport/package.json +2 -2
  6. package/ecomplus-stores/monocard/functions/ssr/package.json +5 -5
  7. package/ecomplus-stores/monocard/functions/ssr/src/pages/fallback.astro +1 -1
  8. package/ecomplus-stores/monocard/package.json +1 -1
  9. package/package.json +1 -1
  10. package/packages/api/package.json +1 -1
  11. package/packages/apps/correios/package.json +1 -1
  12. package/packages/apps/custom-shipping/package.json +1 -1
  13. package/packages/apps/discounts/package.json +1 -1
  14. package/packages/apps/frenet/package.json +1 -1
  15. package/packages/apps/mercadopago/package.json +1 -1
  16. package/packages/apps/tiny-erp/package.json +1 -1
  17. package/packages/cli/package.json +1 -1
  18. package/packages/config/package.json +1 -1
  19. package/packages/events/lib/firebase.js +7 -0
  20. package/packages/events/lib/firebase.js.map +1 -0
  21. package/packages/events/lib/index.js +2 -0
  22. package/packages/events/lib/index.js.map +1 -0
  23. package/packages/events/package.json +1 -1
  24. package/packages/firebase/package.json +1 -1
  25. package/packages/i18n/package.json +1 -1
  26. package/packages/modules/lib/firebase/ajv.js +34 -0
  27. package/packages/modules/lib/firebase/ajv.js.map +1 -0
  28. package/packages/modules/lib/firebase/call-app-module.js +149 -0
  29. package/packages/modules/lib/firebase/call-app-module.js.map +1 -0
  30. package/packages/modules/lib/firebase/checkout.js +157 -0
  31. package/packages/modules/lib/firebase/checkout.js.map +1 -0
  32. package/packages/modules/lib/firebase/functions-checkout/fix-items.js +200 -0
  33. package/packages/modules/lib/firebase/functions-checkout/fix-items.js.map +1 -0
  34. package/packages/modules/lib/firebase/functions-checkout/get-custumerId.js +39 -0
  35. package/packages/modules/lib/firebase/functions-checkout/get-custumerId.js.map +1 -0
  36. package/packages/modules/lib/firebase/functions-checkout/handle-order-transaction.js +122 -0
  37. package/packages/modules/lib/firebase/functions-checkout/handle-order-transaction.js.map +1 -0
  38. package/packages/modules/lib/firebase/functions-checkout/new-order.js +191 -0
  39. package/packages/modules/lib/firebase/functions-checkout/new-order.js.map +1 -0
  40. package/packages/modules/lib/firebase/functions-checkout/request-to-module.js +60 -0
  41. package/packages/modules/lib/firebase/functions-checkout/request-to-module.js.map +1 -0
  42. package/packages/modules/lib/firebase/functions-checkout/utils.js +227 -0
  43. package/packages/modules/lib/firebase/functions-checkout/utils.js.map +1 -0
  44. package/packages/modules/lib/firebase/handle-module.js +169 -0
  45. package/packages/modules/lib/firebase/handle-module.js.map +1 -0
  46. package/packages/modules/lib/firebase/proxy-apps.js +1 -0
  47. package/packages/modules/lib/firebase/proxy-apps.js.map +1 -0
  48. package/packages/modules/lib/firebase/serve-modules-api.js +64 -0
  49. package/packages/modules/lib/firebase/serve-modules-api.js.map +1 -0
  50. package/packages/modules/lib/firebase.js +16 -0
  51. package/packages/modules/lib/firebase.js.map +1 -0
  52. package/packages/modules/lib/index.js +27 -0
  53. package/packages/modules/lib/index.js.map +1 -0
  54. package/packages/modules/package.json +1 -1
  55. package/packages/passport/package.json +1 -1
  56. package/packages/ssr/package.json +1 -1
  57. package/packages/storefront/package.json +1 -1
  58. package/packages/types/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.0.119](https://github.com/ecomplus/cloud-commerce/compare/v0.0.118...v0.0.119) (2022-10-15)
6
+
5
7
  ### [0.0.118](https://github.com/ecomplus/cloud-commerce/compare/v0.0.117...v0.0.118) (2022-10-15)
6
8
 
7
9
  ### [0.0.117](https://github.com/ecomplus/cloud-commerce/compare/v0.0.116...v0.0.117) (2022-10-15)
@@ -15,6 +15,6 @@
15
15
  },
16
16
  "main": "index.js",
17
17
  "dependencies": {
18
- "@cloudcommerce/firebase": "^0.0.116"
18
+ "@cloudcommerce/firebase": "^0.0.118"
19
19
  }
20
20
  }
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "main": "index.js",
17
17
  "dependencies": {
18
- "@cloudcommerce/events": "^0.0.116",
19
- "@cloudcommerce/firebase": "^0.0.116"
18
+ "@cloudcommerce/events": "^0.0.118",
19
+ "@cloudcommerce/firebase": "^0.0.118"
20
20
  }
21
21
  }
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "main": "index.js",
17
17
  "dependencies": {
18
- "@cloudcommerce/firebase": "^0.0.116",
19
- "@cloudcommerce/modules": "^0.0.116"
18
+ "@cloudcommerce/firebase": "^0.0.118",
19
+ "@cloudcommerce/modules": "^0.0.118"
20
20
  }
21
21
  }
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "main": "index.js",
17
17
  "dependencies": {
18
- "@cloudcommerce/firebase": "^0.0.116",
19
- "@cloudcommerce/passport": "^0.0.116"
18
+ "@cloudcommerce/firebase": "^0.0.118",
19
+ "@cloudcommerce/passport": "^0.0.118"
20
20
  }
21
21
  }
@@ -17,14 +17,14 @@
17
17
  },
18
18
  "main": "index.js",
19
19
  "dependencies": {
20
- "@cloudcommerce/api": "^0.0.116",
21
- "@cloudcommerce/firebase": "^0.0.116",
22
- "@cloudcommerce/ssr": "^0.0.116"
20
+ "@cloudcommerce/api": "^0.0.118",
21
+ "@cloudcommerce/firebase": "^0.0.118",
22
+ "@cloudcommerce/ssr": "^0.0.118"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@astrojs/image": "^0.10.0",
26
- "@cloudcommerce/i18n": "^0.0.116",
27
- "@cloudcommerce/storefront": "^0.0.116",
26
+ "@cloudcommerce/i18n": "^0.0.118",
27
+ "@cloudcommerce/storefront": "^0.0.118",
28
28
  "@iconify-json/arcticons": "^1.1.28",
29
29
  "@iconify-json/wpf": "^1.1.2",
30
30
  "lottie-web": "^5.9.6",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  import loadPageContext, { PageContext } from '@cloudcommerce/storefront/src/lib/ssr-context';
3
- import FallbackMain from '@cloudcommerce/storefront/src/lib/main/Fallback.astro';
3
+ import FallbackMain from '~/main/Fallback.astro';
4
4
  import PagesLayout from '../layouts/Pages.astro';
5
5
 
6
6
  let pageContext: PageContext;
@@ -23,6 +23,6 @@
23
23
  "url": "https://github.com/ecomplus/cloud-commerce/issues"
24
24
  },
25
25
  "dependencies": {
26
- "@cloudcommerce/cli": "^0.0.116"
26
+ "@cloudcommerce/cli": "^0.0.118"
27
27
  }
28
28
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cloudcommerce",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "Open fair-code headless commerce platform: API-first, microservices based, event driven and cloud native",
6
6
  "main": "packages/api/lib/index.js",
7
7
  "author": "E-Com Club Softwares para E-commerce <ti@e-com.club>",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/api",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce APIs client/adapter",
6
6
  "main": "lib/api.js",
7
7
  "types": "lib/api.d.ts",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-correios",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce app for Correios shipping calculation",
6
6
  "main": "lib/correios.js",
7
7
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-custom-shipping",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce app for custom shipping methods",
6
6
  "main": "lib/custom-shipping.js",
7
7
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-discounts",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce app for complex discount rules",
6
6
  "main": "lib/discounts.js",
7
7
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-frenet",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce app for Frenet shipping calculation",
6
6
  "main": "lib/frenet.js",
7
7
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-mercadopago",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce app to integrate Mercado Pago",
6
6
  "main": "lib/mercadopago.js",
7
7
  "exports": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/app-tiny-erp",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce app for Tiny ERP",
6
6
  "main": "lib/tiny-erp.js",
7
7
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/cli",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce CLI tools",
6
6
  "bin": {
7
7
  "cloudcommerce": "./bin/run.mjs"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/config",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce base config",
6
6
  "main": "lib/config.js",
7
7
  "exports": {
@@ -0,0 +1,7 @@
1
+ /* eslint-disable import/prefer-default-export */
2
+ import '@cloudcommerce/firebase/lib/init';
3
+
4
+ export * from '@cloudcommerce/app-tiny-erp';
5
+
6
+ export * from '@cloudcommerce/app-mercadopago/webhook';
7
+ // # sourceMappingURL=firebase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,kCAAkC,CAAC;AAE1C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,wCAAwC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import './firebase.js';
2
+ // # sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce app events",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/firebase",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce on Firebase",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/i18n",
3
3
  "type": "module",
4
- "version": "0.0.118",
4
+ "version": "0.0.119",
5
5
  "description": "E-Com Plus Cloud Commerce i18n",
6
6
  "main": "lib/all.js",
7
7
  "repository": {
@@ -0,0 +1,34 @@
1
+ import Ajv from 'ajv';
2
+ import addFormats from 'ajv-formats';
3
+
4
+ const ajvOptions = {
5
+ coerceTypes: false,
6
+ useDefaults: true,
7
+ removeAdditional: true,
8
+ // Explicitly set `allErrors` to false, when set to true a DoS attack is possible
9
+ allErrors: false,
10
+ multipleOfPrecision: 5,
11
+ allowMatchingProperties: true,
12
+ };
13
+ const ajv = addFormats(new Ajv(ajvOptions));
14
+ const parseAjvErrors = (errors, ajvInstance = ajv) => {
15
+ return ajvInstance.errorsText(errors, { separator: '\n' });
16
+ };
17
+ const sendRequestError = (res, modName, errors) => {
18
+ res.status(400).send({
19
+ status: 400,
20
+ error_code: 'MOD901',
21
+ message: 'Bad-formatted JSON body (POST) or URL params (GET), details in `user_message`',
22
+ user_message: {
23
+ en_us: ajv.errorsText(errors, { separator: '\n' }),
24
+ },
25
+ more_info: `/${modName}/schema`,
26
+ });
27
+ };
28
+
29
+ export default ajv;
30
+
31
+ export {
32
+ ajv, ajvOptions, parseAjvErrors, sendRequestError,
33
+ };
34
+ // # sourceMappingURL=ajv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ajv.js","sourceRoot":"","sources":["../../src/firebase/ajv.ts"],"names":[],"mappings":"AACA,OAAO,GAA6B,MAAM,KAAK,CAAC;AAChD,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAY;IAC1B,WAAW,EAAE,KAAK;IAClB,WAAW,EAAE,IAAI;IACjB,gBAAgB,EAAE,IAAI;IACtB,iFAAiF;IACjF,SAAS,EAAE,KAAK;IAChB,mBAAmB,EAAE,CAAC;IACtB,uBAAuB,EAAE,IAAI;CAC9B,CAAC;AACF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AAE5C,MAAM,cAAc,GAAG,CAAC,MAA6B,EAAE,WAAW,GAAG,GAAG,EAAE,EAAE;IAC1E,OAAO,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,GAAa,EAAE,OAAe,EAAE,MAA6B,EAAE,EAAE;IACzF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,+EAA+E;QACxF,YAAY,EAAE;YACZ,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACnD;QACD,SAAS,EAAE,IAAI,OAAO,SAAS;KAChC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,GAAG,CAAC;AAEnB,OAAO,EACL,GAAG,EACH,UAAU,EACV,cAAc,EACd,gBAAgB,GACjB,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { logger } from 'firebase-functions';
2
+ import axios from 'axios';
3
+ import config from '@cloudcommerce/firebase/lib/config';
4
+
5
+ // Blacklist urls to prevent consecultive errors
6
+ const blacklist = {};
7
+
8
+ export default async (appId, modName, url, data, isBigTimeout) => {
9
+ if (blacklist[url] > 2) {
10
+ logger.log(`> Skipping blacklisted ${url}`);
11
+ const err = new Error('Blacklited endpoint URL');
12
+ return Promise.reject(err);
13
+ }
14
+ const { storeId, apps } = config.get();
15
+ const checkErrorResponse = (logHead, resData) => {
16
+ if (typeof resData === 'object' && resData !== null) {
17
+ const { error, message } = resData;
18
+ if (typeof error === 'string' && error.length && typeof message === 'string') {
19
+ logger.warn(logHead, JSON.stringify({ error, message }));
20
+ }
21
+ }
22
+ };
23
+ const debugAndBlacklist = (response) => {
24
+ const status = response ? response.status : 0;
25
+ if (!blacklist[url]) {
26
+ blacklist[url] = 1;
27
+ } else {
28
+ blacklist[url] += 1;
29
+ }
30
+ setTimeout(() => {
31
+ if (blacklist[url] > 1) {
32
+ blacklist[url] -= 1;
33
+ } else {
34
+ delete blacklist[url];
35
+ }
36
+ }, !status ? 180000 : 6000);
37
+ const logHead = `${url} : ${status}`;
38
+ if (status >= 400 && status < 500) {
39
+ checkErrorResponse(logHead, response.data);
40
+ } else {
41
+ logger.info(logHead);
42
+ }
43
+ };
44
+ // eslint-disable-next-line no-unused-vars
45
+ let internalModuleFn;
46
+ if (modName === 'apply_discount') {
47
+ if (appId === apps.discounts.appId) {
48
+ internalModuleFn = async (_data = data) => {
49
+ return import('@cloudcommerce/app-discounts')
50
+ .then(({ applyDiscount }) => applyDiscount(_data));
51
+ };
52
+ }
53
+ } else if (modName === 'calculate_shipping') {
54
+ if (appId === apps.correios.appId) {
55
+ internalModuleFn = async (_data = data) => {
56
+ return import('@cloudcommerce/app-correios')
57
+ .then(({ calculateShipping }) => calculateShipping(_data));
58
+ };
59
+ } else if (appId === apps.customShipping.appId) {
60
+ internalModuleFn = async (_data = data) => {
61
+ return import('@cloudcommerce/app-custom-shipping')
62
+ .then(({ calculateShipping }) => calculateShipping(_data));
63
+ };
64
+ } else if (appId === apps.frenet.appId) {
65
+ internalModuleFn = async (_data = data) => {
66
+ return import('@cloudcommerce/app-frenet')
67
+ .then(({ calculateShipping }) => calculateShipping(_data));
68
+ };
69
+ }
70
+ } else if (modName === 'list_payments') {
71
+ if (appId === apps.mercadoPago.appId) {
72
+ internalModuleFn = async (_data = data) => {
73
+ return import('@cloudcommerce/app-mercadopago')
74
+ .then(({ listPayments }) => listPayments(_data));
75
+ };
76
+ }
77
+ } else if (modName === 'create_transaction') {
78
+ if (appId === apps.mercadoPago.appId) {
79
+ internalModuleFn = async (_data = data) => {
80
+ return import('@cloudcommerce/app-mercadopago')
81
+ .then(({ createTransaction }) => createTransaction(_data));
82
+ };
83
+ }
84
+ }
85
+ if (internalModuleFn) {
86
+ /*
87
+ global.app1_apply_discount_middleware = async (
88
+ data: any,
89
+ next: () => Promise<any>,
90
+ ) => {
91
+ if (data.params.x === 'sample') {
92
+ return {};
93
+ }
94
+ return next(data);
95
+ };
96
+ */
97
+ const middleware = global[`app${appId}_${modName}_middleware`];
98
+ try {
99
+ let appResponse;
100
+ if (typeof middleware === 'function') {
101
+ appResponse = await middleware(data, internalModuleFn);
102
+ } else {
103
+ appResponse = await internalModuleFn(data);
104
+ }
105
+ checkErrorResponse(`${appId}_${modName}`, appResponse);
106
+ return appResponse;
107
+ } catch (err) {
108
+ logger.error(err);
109
+ let message = 'Failed to execute module function';
110
+ if (typeof middleware === 'function') {
111
+ message += ' (has middleware)';
112
+ }
113
+ return {
114
+ error: 'INTERNAL_MODULE_ERROR',
115
+ message,
116
+ };
117
+ }
118
+ }
119
+ return axios({
120
+ method: 'POST',
121
+ maxRedirects: 2,
122
+ responseType: 'json',
123
+ maxContentLength: 1000000,
124
+ url,
125
+ data,
126
+ headers: {
127
+ 'X-Store-ID': storeId.toString(),
128
+ },
129
+ // Wait 10s by default and 30s in specific cases
130
+ timeout: isBigTimeout ? 30000 : 10000,
131
+ })
132
+ .then((response) => {
133
+ debugAndBlacklist(response);
134
+ return response.data;
135
+ })
136
+ .catch((err) => {
137
+ const { response } = err;
138
+ debugAndBlacklist(response);
139
+ if (err.message || err.code) {
140
+ let msg = `Axios error ${err.code}: ${err.message}`;
141
+ if (data) {
142
+ msg += `\n\n${JSON.stringify(data)}`;
143
+ }
144
+ logger.warn(msg);
145
+ }
146
+ throw err;
147
+ });
148
+ };
149
+ // # sourceMappingURL=call-app-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-app-module.js","sourceRoot":"","sources":["../../src/firebase/call-app-module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import config from '@cloudcommerce/firebase/lib/config';
2
+ import { checkoutSchema } from '../index.js';
3
+ import { ajv, sendRequestError } from './ajv.js';
4
+ import fixItems from './functions-checkout/fix-items.js';
5
+ import getCustomerId from './functions-checkout/get-custumerId.js';
6
+ import requestModule from './functions-checkout/request-to-module.js';
7
+ import {
8
+ sendError, fixAmount, getValidResults, handleShippingServices, handleApplyDiscount, handleListPayments,
9
+ } from './functions-checkout/utils.js';
10
+ import createOrder from './functions-checkout/new-order.js';
11
+
12
+ export default async (req, res) => {
13
+ const { httpsFunctionOptions } = config.get();
14
+ const modulesBaseURL = req.hostname !== 'localhost'
15
+ ? `https://${req.hostname}${req.url.replace(/\/checkout[^/]*/i, '')}`
16
+ : `http://localhost:5001/${process.env.GCLOUD_PROJECT}`
17
+ + `/${(process.env.FUNCTION_REGION || httpsFunctionOptions.region)}/modules`;
18
+ const validate = ajv.compile(checkoutSchema);
19
+ const checkoutBody = req.body;
20
+ if (!req.body.browser_ip && req.ip) {
21
+ req.body.browser_ip = req.ip;
22
+ }
23
+ if (!validate(checkoutBody)) {
24
+ return sendRequestError(res, '@checkout', validate.errors);
25
+ }
26
+ const { items, ...newBody } = checkoutBody;
27
+ const newItems = await fixItems(items);
28
+ const amount = {
29
+ subtotal: 0,
30
+ discount: 0,
31
+ freight: 0,
32
+ total: 0,
33
+ };
34
+ const body = {
35
+ ...newBody,
36
+ items: [...newItems],
37
+ subtotal: 0,
38
+ amount,
39
+ };
40
+ const countCheckoutItems = body.items.length;
41
+ const { customer } = body;
42
+ const customerId = await getCustomerId(customer);
43
+ if (customerId) {
44
+ if (newItems.length) {
45
+ // start mounting order body
46
+ // https://developers.e-com.plus/docs/api/#/store/orders/orders
47
+ const dateTime = new Date().toISOString();
48
+ const orderBody = {
49
+ opened_at: dateTime,
50
+ buyers: [
51
+ // received customer info
52
+ {
53
+ ...customer,
54
+ _id: customerId,
55
+ },
56
+ ],
57
+ items: [],
58
+ amount: {
59
+ total: 0,
60
+ },
61
+ };
62
+ // bypass some order fields
63
+ const fields = [
64
+ 'utm',
65
+ 'affiliate_code',
66
+ 'browser_ip',
67
+ 'channel_id',
68
+ 'channel_type',
69
+ 'domain',
70
+ 'notes',
71
+ ];
72
+ fields.forEach((field) => {
73
+ if (body[field]) {
74
+ orderBody[field] = body[field];
75
+ }
76
+ });
77
+ if (orderBody.domain) {
78
+ // consider default Storefront app routes
79
+ if (!orderBody.checkout_link) {
80
+ orderBody.checkout_link = `https://${orderBody.domain}/app/#/checkout/(_id)`;
81
+ }
82
+ if (!orderBody.status_link) {
83
+ orderBody.status_link = `https://${orderBody.domain}/app/#/order/(_id)`;
84
+ }
85
+ }
86
+ // count subtotal value
87
+ let subtotal = 0;
88
+ newItems.forEach((item) => {
89
+ subtotal += (item.final_price || item.price * item.quantity);
90
+ // pass each item to prevent object overwrite
91
+ if (orderBody.items) {
92
+ orderBody.items.push({ ...item });
93
+ }
94
+ });
95
+ if (subtotal <= 0 && items.length < countCheckoutItems) {
96
+ return sendError(res, 400, 'CKT801', 'Cannot handle checkout, any valid cart item');
97
+ }
98
+ amount.subtotal = subtotal;
99
+ body.subtotal = subtotal;
100
+ fixAmount(amount, body, orderBody);
101
+ const transactions = Array.isArray(body.transaction) ? body.transaction : [body.transaction];
102
+ // add customer ID to order and transaction
103
+ customer._id = customerId;
104
+ transactions.forEach(({ buyer }) => {
105
+ if (buyer) {
106
+ buyer.customer_id = customerId;
107
+ }
108
+ });
109
+ let listShipping = await requestModule(body, modulesBaseURL, 'shipping');
110
+ if (listShipping) {
111
+ listShipping = getValidResults(listShipping, 'shipping_services');
112
+ handleShippingServices(body, listShipping, amount, orderBody);
113
+ } else {
114
+ // problem with shipping response object
115
+ return sendError(res, 400, 'CKT901', 'Any valid shipping service from /calculate_shipping module', {
116
+ en_us: 'Shipping method not available, please choose another',
117
+ pt_br: 'Forma de envio indisponível, por favor escolha outra',
118
+ });
119
+ }
120
+ let discounts = await requestModule(body, modulesBaseURL, 'discount');
121
+ if (discounts) {
122
+ discounts = getValidResults(discounts);
123
+ handleApplyDiscount(body, discounts, amount, orderBody);
124
+ }
125
+ const { transaction, ...bodyPayment } = body;
126
+ let paymentsBody;
127
+ if (Array.isArray(transaction)) {
128
+ paymentsBody = {
129
+ ...bodyPayment,
130
+ transaction: transaction[0],
131
+ };
132
+ } else {
133
+ paymentsBody = {
134
+ ...bodyPayment,
135
+ transaction,
136
+ };
137
+ }
138
+ let listPaymentGateways = await requestModule(paymentsBody, modulesBaseURL, 'payment');
139
+ if (listPaymentGateways) {
140
+ listPaymentGateways = getValidResults(listPaymentGateways, 'payment_gateways');
141
+ handleListPayments(body, listPaymentGateways, paymentsBody, amount, orderBody);
142
+ } else {
143
+ return sendError(res, 409, 'CKT902', 'Any valid payment gateway from /list_payments module', {
144
+ en_us: 'Payment method not available, please choose another',
145
+ pt_br: 'Forma de pagamento indisponível, por favor escolha outra',
146
+ });
147
+ }
148
+ return createOrder(res, modulesBaseURL, amount, checkoutBody, orderBody, transactions, dateTime);
149
+ }
150
+ return sendError(res, 400, 'CKT801', 'Cannot handle checkout, any valid cart item');
151
+ }
152
+ return sendError(res, 404, -404, 'Not found', {
153
+ en_us: 'No customers found with ID or email provided',
154
+ pt_br: 'Nenhum cliente encontrado com ID ou e-mail fornecido',
155
+ });
156
+ };
157
+ // # sourceMappingURL=checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../src/firebase/checkout.ts"],"names":[],"mappings":"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"}