cloudcommerce 2.9.0 → 2.10.0

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 (194) hide show
  1. package/.github/renovate.json +4 -0
  2. package/.github/workflows/test-apps.yml +2 -2
  3. package/CHANGELOG.md +26 -0
  4. package/README.md +2 -0
  5. package/action.yml +2 -2
  6. package/ecomplus-stores/barradoce/functions/many/package.json +3 -3
  7. package/ecomplus-stores/barradoce/functions/ssr/package.json +6 -6
  8. package/ecomplus-stores/barradoce/functions/ssr/src/components/CartSidebar.vue +0 -15
  9. package/ecomplus-stores/barradoce/functions/ssr/src/components/ShopHeaderMenu.vue +16 -33
  10. package/ecomplus-stores/barradoce/functions/ssr/src/components/ShopHeaderSubmenu.vue +1 -2
  11. package/ecomplus-stores/barradoce/functions/ssr/src/pages/app/index.astro +4 -0
  12. package/ecomplus-stores/barradoce/functions/with-apps/package.json +3 -3
  13. package/ecomplus-stores/barradoce/package.json +2 -2
  14. package/package.json +9 -9
  15. package/packages/__skeleton/package.json +6 -0
  16. package/packages/api/lib/api.d.ts +6 -6
  17. package/packages/api/lib/api.js.map +1 -1
  18. package/packages/api/package.json +7 -2
  19. package/packages/api/types.ts +7 -1
  20. package/packages/apps/affiliate-program/lib/events-to-affiliate-program.js.map +1 -1
  21. package/packages/apps/affiliate-program/package.json +8 -2
  22. package/packages/apps/correios/package.json +9 -3
  23. package/packages/apps/custom-payment/lib/custom-payment-create-transaction.js.map +1 -1
  24. package/packages/apps/custom-payment/lib/custom-payment-list-payments.js.map +1 -1
  25. package/packages/apps/custom-payment/package.json +7 -1
  26. package/packages/apps/custom-shipping/package.json +7 -1
  27. package/packages/apps/datafrete/lib/datafrete-webhook.js.map +1 -1
  28. package/packages/apps/datafrete/package.json +9 -3
  29. package/packages/apps/discounts/package.json +7 -1
  30. package/packages/apps/emails/lib/events-to-app-emails.js.map +1 -1
  31. package/packages/apps/emails/lib/functios-lib/abandoned-carts.js +3 -2
  32. package/packages/apps/emails/lib/functios-lib/abandoned-carts.js.map +1 -1
  33. package/packages/apps/emails/lib/functios-lib/get-mail-render.js +10 -0
  34. package/packages/apps/emails/lib/functios-lib/get-mail-render.js.map +1 -0
  35. package/packages/apps/emails/lib/functios-lib/handle-orders.js +7 -4
  36. package/packages/apps/emails/lib/functios-lib/handle-orders.js.map +1 -1
  37. package/packages/apps/emails/package.json +9 -3
  38. package/packages/apps/emails/src/functios-lib/abandoned-carts.ts +3 -2
  39. package/packages/apps/emails/src/functios-lib/get-mail-render.ts +9 -0
  40. package/packages/apps/emails/src/functios-lib/handle-orders.ts +7 -6
  41. package/packages/apps/fb-conversions/lib/fb-conversions-events.js.map +1 -1
  42. package/packages/apps/fb-conversions/lib/functions-lib/create-fb-objects.js.map +1 -1
  43. package/packages/apps/fb-conversions/package.json +9 -3
  44. package/packages/apps/flash-courier/package.json +9 -3
  45. package/packages/apps/frenet/lib/functions-lib/database.js.map +1 -1
  46. package/packages/apps/frenet/lib/functions-lib/events-to-frenet.js.map +1 -1
  47. package/packages/apps/frenet/lib/functions-lib/remove-delivered.js.map +1 -1
  48. package/packages/apps/frenet/lib/functions-lib/tracking-codes.js.map +1 -1
  49. package/packages/apps/frenet/lib/functions-lib/update-fulfillments.js.map +1 -1
  50. package/packages/apps/frenet/package.json +9 -3
  51. package/packages/apps/galaxpay/lib/functions-lib/all-parses.js.map +1 -1
  52. package/packages/apps/galaxpay/lib/functions-lib/ecom/events-to-galaxpay.js.map +1 -1
  53. package/packages/apps/galaxpay/lib/functions-lib/galaxpay/auth/create-access.js.map +1 -1
  54. package/packages/apps/galaxpay/lib/functions-lib/galaxpay/auth/create-axios.js.map +1 -1
  55. package/packages/apps/galaxpay/lib/functions-lib/galaxpay/auth/gerate-token.js.map +1 -1
  56. package/packages/apps/galaxpay/lib/functions-lib/galaxpay/handle-plans.js.map +1 -1
  57. package/packages/apps/galaxpay/lib/functions-lib/galaxpay/update-subscription.js.map +1 -1
  58. package/packages/apps/galaxpay/lib/functions-lib/galaxpay/webhook.d.ts +1 -0
  59. package/packages/apps/galaxpay/lib/functions-lib/galaxpay/webhook.js.map +1 -1
  60. package/packages/apps/galaxpay/lib/galaxpay-create-transaction.js +2 -2
  61. package/packages/apps/galaxpay/lib/galaxpay-create-transaction.js.map +1 -1
  62. package/packages/apps/galaxpay/lib/galaxpay-events.js.map +1 -1
  63. package/packages/apps/galaxpay/lib/galaxpay-list-payments.js +1 -1
  64. package/packages/apps/galaxpay/lib/galaxpay-list-payments.js.map +1 -1
  65. package/packages/apps/galaxpay/package.json +9 -3
  66. package/packages/apps/google-analytics/lib/google-analytics-events.js.map +1 -1
  67. package/packages/apps/google-analytics/package.json +9 -3
  68. package/packages/apps/jadlog/package.json +8 -2
  69. package/packages/apps/loyalty-points/lib/functions-lib/cron-add-points.js.map +1 -1
  70. package/packages/apps/loyalty-points/lib/functions-lib/get-program-id.js.map +1 -1
  71. package/packages/apps/loyalty-points/lib/functions-lib/handle-loyalty-points-event.js.map +1 -1
  72. package/packages/apps/loyalty-points/lib/loyalty-create-transaction.js.map +1 -1
  73. package/packages/apps/loyalty-points/lib/loyalty-list-payments.js.map +1 -1
  74. package/packages/apps/loyalty-points/lib/loyalty-points-events.js.map +1 -1
  75. package/packages/apps/loyalty-points/package.json +7 -1
  76. package/packages/apps/mandae/package.json +9 -3
  77. package/packages/apps/melhor-envio/lib/functions-lib/database.js.map +1 -1
  78. package/packages/apps/melhor-envio/lib/functions-lib/events-to-melhor-envio.js.map +1 -1
  79. package/packages/apps/melhor-envio/lib/functions-lib/new-label.js.map +1 -1
  80. package/packages/apps/melhor-envio/lib/functions-lib/order-is-valid.js.map +1 -1
  81. package/packages/apps/melhor-envio/lib/functions-lib/tracking-codes.js.map +1 -1
  82. package/packages/apps/melhor-envio/package.json +9 -3
  83. package/packages/apps/mercadopago/lib/mp-create-transaction.js.map +1 -1
  84. package/packages/apps/mercadopago/lib/mp-list-payments.js.map +1 -1
  85. package/packages/apps/mercadopago/lib/mp-webhook.js.map +1 -1
  86. package/packages/apps/mercadopago/package.json +9 -3
  87. package/packages/apps/pagarme/lib/functions-lib/add-installments.js.map +1 -1
  88. package/packages/apps/pagarme/lib/functions-lib/parse-status-to-ecom.js.map +1 -1
  89. package/packages/apps/pagarme/lib/pagarme-create-transaction.js.map +1 -1
  90. package/packages/apps/pagarme/lib/pagarme-list-payments.js.map +1 -1
  91. package/packages/apps/pagarme/lib/pagarme-webhook.js.map +1 -1
  92. package/packages/apps/pagarme/package.json +9 -3
  93. package/packages/apps/pagarme-v5/lib/pagarme-v5-events.js.map +1 -1
  94. package/packages/apps/pagarme-v5/package.json +9 -3
  95. package/packages/apps/paghiper/lib/functions-lib/handle-webhook.d.ts +1 -0
  96. package/packages/apps/paghiper/lib/functions-lib/handle-webhook.js.map +1 -1
  97. package/packages/apps/paghiper/lib/paghiper-create-transaction.js.map +1 -1
  98. package/packages/apps/paghiper/lib/paghiper-list-payments.js.map +1 -1
  99. package/packages/apps/paghiper/lib/paghiper-webhook.js.map +1 -1
  100. package/packages/apps/paghiper/package.json +9 -3
  101. package/packages/apps/pix/lib/functions-lib/get-certificate.js.map +1 -1
  102. package/packages/apps/pix/lib/functions-lib/pix-auth/construtor.js.map +1 -1
  103. package/packages/apps/pix/lib/functions-lib/pix-auth/create-axios.js.map +1 -1
  104. package/packages/apps/pix/lib/functions-lib/pix-auth/oauth.js.map +1 -1
  105. package/packages/apps/pix/lib/pix-create-transaction.js.map +1 -1
  106. package/packages/apps/pix/lib/pix-list-payments.js.map +1 -1
  107. package/packages/apps/pix/lib/pix-webhook.js.map +1 -1
  108. package/packages/apps/pix/package.json +9 -3
  109. package/packages/apps/tiny-erp/lib/event-to-tiny.js.map +1 -1
  110. package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js.map +1 -1
  111. package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js.map +1 -1
  112. package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js.map +1 -1
  113. package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js.map +1 -1
  114. package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js.map +1 -1
  115. package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js.map +1 -1
  116. package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js.map +1 -1
  117. package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js.map +1 -1
  118. package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js.map +1 -1
  119. package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js.map +1 -1
  120. package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js.map +1 -1
  121. package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js.map +1 -1
  122. package/packages/apps/tiny-erp/lib/tiny-webhook.js.map +1 -1
  123. package/packages/apps/tiny-erp/package.json +9 -3
  124. package/packages/apps/webhooks/lib/events-to-webhooks-app.js.map +1 -1
  125. package/packages/apps/webhooks/package.json +9 -3
  126. package/packages/cli/package.json +9 -2
  127. package/packages/config/lib/config.js.map +1 -1
  128. package/packages/config/lib/env.js.map +1 -1
  129. package/packages/config/package.json +6 -1
  130. package/packages/emails/lib/index.js.map +1 -1
  131. package/packages/emails/lib/parse-template-to-html.js.map +1 -1
  132. package/packages/emails/lib/providers/sendgrid/index.js.map +1 -1
  133. package/packages/emails/lib/providers/sendgrid/parse-to-data.js.map +1 -1
  134. package/packages/emails/lib/providers/smtp/index.js.map +1 -1
  135. package/packages/emails/package.json +8 -3
  136. package/packages/eslint/package.json +8 -5
  137. package/packages/events/package.json +7 -2
  138. package/packages/feeds/lib/firebase/serve-feeds.js.map +1 -1
  139. package/packages/feeds/package.json +6 -1
  140. package/packages/firebase/lib/config.js.map +1 -1
  141. package/packages/firebase/lib/handlers/check-store-events.js.map +1 -1
  142. package/packages/firebase/lib/helpers/firestore.js.map +1 -1
  143. package/packages/firebase/lib/helpers/pubsub.js.map +1 -1
  144. package/packages/firebase/lib/helpers/update-app-data.js.map +1 -1
  145. package/packages/firebase/package.json +7 -2
  146. package/packages/i18n/package.json +6 -1
  147. package/packages/modules/lib/firebase/call-app-module.js.map +1 -1
  148. package/packages/modules/lib/firebase/checkout.js +127 -112
  149. package/packages/modules/lib/firebase/checkout.js.map +1 -1
  150. package/packages/modules/lib/firebase/functions-checkout/fix-items.js.map +1 -1
  151. package/packages/modules/lib/firebase/functions-checkout/handle-order-transaction.js.map +1 -1
  152. package/packages/modules/lib/firebase/functions-checkout/new-order.js.map +1 -1
  153. package/packages/modules/lib/firebase/functions-checkout/read-or-save-customer.js +35 -0
  154. package/packages/modules/lib/firebase/functions-checkout/read-or-save-customer.js.map +1 -0
  155. package/packages/modules/lib/firebase/functions-checkout/request-to-module.js.map +1 -1
  156. package/packages/modules/lib/firebase/functions-checkout/utils.js.map +1 -1
  157. package/packages/modules/lib/firebase/handle-module.js +6 -1
  158. package/packages/modules/lib/firebase/handle-module.js.map +1 -1
  159. package/packages/modules/lib/firebase/serve-modules-api.js.map +1 -1
  160. package/packages/modules/lib/firebase.js.map +1 -1
  161. package/packages/modules/package.json +9 -3
  162. package/packages/modules/schemas/list_payments.cjs +1 -6
  163. package/packages/modules/src/firebase/checkout.ts +153 -143
  164. package/packages/modules/src/firebase/functions-checkout/read-or-save-customer.ts +36 -0
  165. package/packages/modules/src/firebase/handle-module.ts +19 -1
  166. package/packages/modules/src/types/index.d.ts +2 -2
  167. package/packages/passport/lib/firebase/authenticate-customer.js +26 -15
  168. package/packages/passport/lib/firebase/authenticate-customer.js.map +1 -1
  169. package/packages/passport/lib/firebase/serve-passport-api.js +89 -2
  170. package/packages/passport/lib/firebase/serve-passport-api.js.map +1 -1
  171. package/packages/passport/lib/firebase.js.map +1 -1
  172. package/packages/passport/package.json +7 -2
  173. package/packages/passport/src/firebase/authenticate-customer.ts +32 -18
  174. package/packages/passport/src/firebase/serve-passport-api.ts +94 -3
  175. package/packages/ssr/lib/lib/analytics/send-to-ga4.js.map +1 -1
  176. package/packages/ssr/lib/lib/analytics/send-to-meta.js.map +1 -1
  177. package/packages/ssr/lib/lib/analytics/send-to-tiktok.js.map +1 -1
  178. package/packages/ssr/lib/lib/analytics-events.js.map +1 -1
  179. package/packages/ssr/lib/lib/cron-ssr-save-views.js +11 -5
  180. package/packages/ssr/lib/lib/cron-ssr-save-views.js.map +1 -1
  181. package/packages/ssr/lib/lib/serve-storefront.js.map +1 -1
  182. package/packages/ssr/package.json +12 -7
  183. package/packages/ssr/src/cloudflare/package.json +14 -0
  184. package/packages/ssr/src/lib/cron-ssr-save-views.ts +11 -5
  185. package/packages/storefront/package.json +18 -11
  186. package/packages/storefront/src/lib/components/globals/ALink.vue +22 -7
  187. package/packages/storefront/src/lib/scripts/vbeta-app.ts +15 -12
  188. package/packages/test-base/lib/endpoints.js.map +1 -1
  189. package/packages/test-base/package.json +7 -1
  190. package/packages/types/modules/list_payments:params.d.ts +0 -4
  191. package/packages/types/package.json +6 -1
  192. package/packages/modules/lib/firebase/functions-checkout/get-custumerId.js +0 -39
  193. package/packages/modules/lib/firebase/functions-checkout/get-custumerId.js.map +0 -1
  194. package/packages/modules/src/firebase/functions-checkout/get-custumerId.ts +0 -39
@@ -8,7 +8,7 @@ import type {
8
8
  import { checkoutSchema } from '../index';
9
9
  import { ajv, sendRequestError } from './ajv';
10
10
  import fixItems from './functions-checkout/fix-items';
11
- import getCustomerId from './functions-checkout/get-custumerId';
11
+ import readOrSaveCustomer from './functions-checkout/read-or-save-customer';
12
12
  import requestModule from './functions-checkout/request-to-module';
13
13
  import {
14
14
  sendError,
@@ -52,161 +52,171 @@ export default async (req: Request, res: Response) => {
52
52
  subtotal: 0,
53
53
  amount,
54
54
  };
55
+ if (!newItems.length) {
56
+ return sendError(res, 400, 'CKT801', 'Cannot handle checkout, any valid cart item');
57
+ }
55
58
 
56
59
  const countCheckoutItems = body.items.length;
57
60
  const { customer } = body;
58
- const customerId = await getCustomerId(customer);
59
- if (customerId) {
60
- if (newItems.length) {
61
- // start mounting order body
62
- // https://developers.e-com.plus/docs/api/#/store/orders/orders
63
- const dateTime = new Date().toISOString();
64
- const orderBody: OrderSet = {
65
- opened_at: dateTime,
66
- buyers: [
67
- // received customer info
68
- {
69
- ...customer,
70
- _id: customerId,
71
- },
72
- ],
73
- items: [],
74
- amount: {
75
- total: 0,
76
- },
77
- };
78
- // bypass some order fields
79
- const fields = [
80
- 'utm',
81
- 'affiliate_code',
82
- 'client_ip',
83
- 'client_user_agent',
84
- 'channel_id',
85
- 'channel_type',
86
- 'domain',
87
- 'notes',
88
- ];
89
- fields.forEach((field) => {
90
- if (body[field]) {
91
- orderBody[field] = body[field];
92
- }
93
- });
94
- if (orderBody.domain) {
95
- // consider default Storefront app routes
96
- if (!orderBody.checkout_link) {
97
- orderBody.checkout_link = `https://${orderBody.domain}/app/#/checkout/(_id)`;
98
- }
99
- if (!orderBody.status_link) {
100
- orderBody.status_link = `https://${orderBody.domain}/app/#/order/(_id)`;
101
- }
61
+ const savedCustomer = await readOrSaveCustomer(customer);
62
+ const customerId = savedCustomer._id;
63
+ if (customerId === customer._id) {
64
+ Object.keys(savedCustomer).forEach((field) => {
65
+ if (customer[field] === undefined) {
66
+ customer[field] = savedCustomer[field];
102
67
  }
103
-
104
- // count subtotal value
105
- let subtotal = 0;
106
- newItems.forEach(
107
- (item: Item) => {
108
- subtotal += (item.final_price || item.price * item.quantity);
109
- // pass each item to prevent object overwrite
110
- if (orderBody.items) {
111
- orderBody.items.push({ ...item });
112
- }
113
- },
114
- );
115
- if (subtotal <= 0 && items.length < countCheckoutItems) {
116
- return sendError(res, 400, 'CKT801', 'Cannot handle checkout, any valid cart item');
68
+ });
69
+ if (customer.name.family_name?.includes('***') && savedCustomer.name) {
70
+ customer.name = savedCustomer.name;
71
+ }
72
+ if (customer.phones?.[0].number.match(/^0{3,}\d{1,4}$/)) {
73
+ customer.phones = savedCustomer.phones;
74
+ }
75
+ }
76
+ customer._id = customerId;
77
+ const fixMaskedAddr = (bodyAddr: typeof body.shipping.to) => {
78
+ if (bodyAddr.line_address?.includes('***') || bodyAddr.name?.includes('***')) {
79
+ const savedAddr = savedCustomer.addresses?.find(({ zip }) => zip === bodyAddr.zip);
80
+ if (savedAddr) {
81
+ Object.assign(bodyAddr, savedAddr);
117
82
  }
118
- amount.subtotal = subtotal;
119
- body.subtotal = subtotal;
120
- fixAmount(amount, body, orderBody);
83
+ }
84
+ };
85
+ fixMaskedAddr(body.shipping.to);
121
86
 
122
- const transactions = Array.isArray(body.transaction) ? body.transaction : [body.transaction];
123
- // add customer ID to order and transaction
124
- customer._id = customerId;
125
- transactions.forEach(({ buyer }) => {
126
- if (buyer) {
127
- buyer.customer_id = customerId;
128
- }
129
- });
87
+ // start mounting order body
88
+ // https://developers.e-com.plus/docs/api/#/store/orders/orders
89
+ const dateTime = new Date().toISOString();
90
+ const orderBody: OrderSet = {
91
+ opened_at: dateTime,
92
+ buyers: [{
93
+ ...customer,
94
+ _id: customerId,
95
+ }],
96
+ items: [],
97
+ amount: {
98
+ total: 0,
99
+ },
100
+ };
101
+ // bypass some order fields
102
+ const fields = [
103
+ 'utm',
104
+ 'affiliate_code',
105
+ 'client_ip',
106
+ 'client_user_agent',
107
+ 'channel_id',
108
+ 'channel_type',
109
+ 'domain',
110
+ 'notes',
111
+ ];
112
+ fields.forEach((field) => {
113
+ if (body[field]) {
114
+ orderBody[field] = body[field];
115
+ }
116
+ });
117
+ if (orderBody.domain) {
118
+ // consider default Storefront app routes
119
+ if (!orderBody.checkout_link) {
120
+ orderBody.checkout_link = `https://${orderBody.domain}/app/#/checkout/(_id)`;
121
+ }
122
+ if (!orderBody.status_link) {
123
+ orderBody.status_link = `https://${orderBody.domain}/app/#/order/(_id)`;
124
+ }
125
+ }
130
126
 
131
- let listShipping = await requestModule(body, modulesBaseURL, 'shipping');
132
- let { msgErr } = listShipping;
133
- if (listShipping && !msgErr) {
134
- listShipping = getValidResults(listShipping, 'shipping_services');
135
- handleShippingServices(body, listShipping, amount, orderBody);
136
- } else {
137
- // problem with shipping response object
138
- return sendError(
139
- res,
140
- msgErr?.status || 400,
141
- msgErr?.code || 'CKT901',
142
- 'Any valid shipping service from /calculate_shipping module',
143
- {
144
- en_us: 'Shipping method not available, please choose another',
145
- pt_br: 'Forma de envio indisponível, por favor escolha outra',
146
- },
147
- msgErr?.moreInfo,
148
- );
127
+ // count subtotal value
128
+ let subtotal = 0;
129
+ newItems.forEach(
130
+ (item: Item) => {
131
+ subtotal += (item.final_price || item.price * item.quantity);
132
+ // pass each item to prevent object overwrite
133
+ if (orderBody.items) {
134
+ orderBody.items.push({ ...item });
149
135
  }
136
+ },
137
+ );
138
+ if (subtotal <= 0 && items.length < countCheckoutItems) {
139
+ return sendError(res, 400, 'CKT801', 'Cannot handle checkout, any valid cart item');
140
+ }
141
+ amount.subtotal = subtotal;
142
+ body.subtotal = subtotal;
143
+ fixAmount(amount, body, orderBody);
150
144
 
151
- let discounts = await requestModule(body, modulesBaseURL, 'discount');
152
- if (discounts) {
153
- discounts = getValidResults(discounts);
154
- handleApplyDiscount(body, discounts, amount, orderBody);
155
- }
145
+ const transactions = Array.isArray(body.transaction) ? body.transaction : [body.transaction];
146
+ transactions.forEach((transaction) => {
147
+ transaction.buyer.customer_id = customerId;
148
+ (['billing_address', 'to'] as const).forEach((field) => {
149
+ const addr = transaction[field];
150
+ if (addr) fixMaskedAddr(addr);
151
+ });
152
+ });
156
153
 
157
- const { transaction, ...bodyPayment } = body;
158
- let paymentsBody: Payment;
159
- if (Array.isArray(transaction)) {
160
- paymentsBody = {
161
- ...bodyPayment,
162
- transaction: transaction[0],
163
- };
164
- } else {
165
- paymentsBody = {
166
- ...bodyPayment,
167
- transaction,
168
- };
169
- }
154
+ let listShipping = await requestModule(body, modulesBaseURL, 'shipping');
155
+ let { msgErr } = listShipping;
156
+ if (listShipping && !msgErr) {
157
+ listShipping = getValidResults(listShipping, 'shipping_services');
158
+ handleShippingServices(body, listShipping, amount, orderBody);
159
+ } else {
160
+ // problem with shipping response object
161
+ return sendError(
162
+ res,
163
+ msgErr?.status || 400,
164
+ msgErr?.code || 'CKT901',
165
+ 'Any valid shipping service from /calculate_shipping module',
166
+ {
167
+ en_us: 'Shipping method not available, please choose another',
168
+ pt_br: 'Forma de envio indisponível, por favor escolha outra',
169
+ },
170
+ msgErr?.moreInfo,
171
+ );
172
+ }
170
173
 
171
- let listPaymentGateways = await requestModule(paymentsBody, modulesBaseURL, 'payment');
172
- msgErr = listPaymentGateways.msgErr;
173
- if (listPaymentGateways && !msgErr) {
174
- listPaymentGateways = getValidResults(listPaymentGateways, 'payment_gateways');
175
- handleListPayments(body, listPaymentGateways, paymentsBody, amount, orderBody);
176
- } else {
177
- return sendError(
178
- res,
179
- msgErr?.status || 409,
180
- msgErr?.code || 'CKT902',
181
- 'Any valid payment gateway from /list_payments module',
182
- {
183
- en_us: 'Payment method not available, please choose another',
184
- pt_br: 'Forma de pagamento indisponível, por favor escolha outra',
185
- },
186
- msgErr?.moreInfo,
187
- );
188
- }
174
+ let discounts = await requestModule(body, modulesBaseURL, 'discount');
175
+ if (discounts) {
176
+ discounts = getValidResults(discounts);
177
+ handleApplyDiscount(body, discounts, amount, orderBody);
178
+ }
189
179
 
190
- return createOrder(
191
- res,
192
- modulesBaseURL,
193
- amount,
194
- checkoutBody,
195
- orderBody,
196
- transactions,
197
- dateTime,
198
- );
199
- }
200
- return sendError(res, 400, 'CKT801', 'Cannot handle checkout, any valid cart item');
180
+ const { transaction, ...bodyPayment } = body;
181
+ let paymentsBody: Payment;
182
+ if (Array.isArray(transaction)) {
183
+ paymentsBody = {
184
+ ...bodyPayment,
185
+ transaction: transaction[0],
186
+ };
187
+ } else {
188
+ paymentsBody = {
189
+ ...bodyPayment,
190
+ transaction,
191
+ };
192
+ }
193
+
194
+ let listPaymentGateways = await requestModule(paymentsBody, modulesBaseURL, 'payment');
195
+ msgErr = listPaymentGateways.msgErr;
196
+ if (listPaymentGateways && !msgErr) {
197
+ listPaymentGateways = getValidResults(listPaymentGateways, 'payment_gateways');
198
+ handleListPayments(body, listPaymentGateways, paymentsBody, amount, orderBody);
199
+ } else {
200
+ return sendError(
201
+ res,
202
+ msgErr?.status || 409,
203
+ msgErr?.code || 'CKT902',
204
+ 'Any valid payment gateway from /list_payments module',
205
+ {
206
+ en_us: 'Payment method not available, please choose another',
207
+ pt_br: 'Forma de pagamento indisponível, por favor escolha outra',
208
+ },
209
+ msgErr?.moreInfo,
210
+ );
201
211
  }
202
- return sendError(
212
+
213
+ return createOrder(
203
214
  res,
204
- 404,
205
- -404,
206
- 'Not found',
207
- {
208
- en_us: 'No customers found with ID or email provided',
209
- pt_br: 'Nenhum cliente encontrado com ID ou e-mail fornecido',
210
- },
215
+ modulesBaseURL,
216
+ amount,
217
+ checkoutBody,
218
+ orderBody,
219
+ transactions,
220
+ dateTime,
211
221
  );
212
222
  };
@@ -0,0 +1,36 @@
1
+ import type { Customers } from '@cloudcommerce/types';
2
+ import type { CheckoutCustomer } from '../../types/index';
3
+ import ecomUtils from '@ecomplus/utils';
4
+ import api from '@cloudcommerce/api';
5
+ import logger from 'firebase-functions/logger';
6
+
7
+ const readOrSaveCustomer = async (customer: CheckoutCustomer) => {
8
+ const customerEndpoint = customer._id?.length === 24
9
+ ? `customers/${customer._id}` as `customers/${Customers['_id']}`
10
+ : `customers/main_email:${customer.main_email}` as `customers/${string}:${string}`;
11
+ try {
12
+ const { data: savedCustomer } = await api.get(customerEndpoint);
13
+ return savedCustomer;
14
+ } catch (err: any) {
15
+ err.checkoutCode = `cantReadCustomer,${customerEndpoint}`;
16
+ logger.error(err);
17
+ }
18
+ const newCustomer = {
19
+ display_name: customer.name.given_name || 'visitor',
20
+ ...customer,
21
+ };
22
+ try {
23
+ const { data: { _id: newCustomerId } } = await api.post('customers', newCustomer);
24
+ newCustomer._id = newCustomerId;
25
+ return newCustomer as Customers;
26
+ } catch (err: any) {
27
+ err.checkoutCode = 'cantSaveNewCustomer';
28
+ logger.error(err);
29
+ if (!newCustomer._id) {
30
+ newCustomer._id = ecomUtils.randomObjectId();
31
+ }
32
+ return newCustomer as Customers;
33
+ }
34
+ };
35
+
36
+ export default readOrSaveCustomer;
@@ -14,6 +14,19 @@ import {
14
14
  } from './ajv';
15
15
  import callAppModule from './call-app-module';
16
16
 
17
+ declare global {
18
+ // eslint-disable-next-line
19
+ var $activeModuleApps: undefined | Array<Partial<Applications> & {
20
+ _id: Applications['_id'],
21
+ state?: 'active',
22
+ app_id: Applications['app_id'],
23
+ version: Applications['version'],
24
+ modules: Exclude<Applications['modules'], undefined>,
25
+ data: Applications['data'],
26
+ hidden_data: Applications['hidden_data'],
27
+ }>;
28
+ }
29
+
17
30
  const ajvAppsResponse = addFormats(new Ajv({ ...ajvOptions, allErrors: true }));
18
31
 
19
32
  // Cache apps list and no params modules results
@@ -59,7 +72,12 @@ async function runModule(
59
72
  }
60
73
 
61
74
  let appsList: Partial<Applications>[];
62
- if (canCache && appsCache[cacheKey]) {
75
+ const mockedModApps = global.$activeModuleApps?.filter(({ modules }) => {
76
+ return modules[modName as 'list_payments']?.enabled;
77
+ });
78
+ if (mockedModApps?.length) {
79
+ appsList = mockedModApps;
80
+ } else if (canCache && appsCache[cacheKey]) {
63
81
  appsList = appsCache[cacheKey];
64
82
  } else {
65
83
  try {
@@ -19,7 +19,7 @@ type CheckoutBodyWithItems = Omit<CheckoutBody, 'items'> & {
19
19
  amount: Amount
20
20
  }
21
21
 
22
- type CustomerCheckout = Exclude<CheckoutBody['customer'], undefined>
22
+ type CheckoutCustomer = Exclude<CheckoutBody['customer'], undefined>
23
23
 
24
24
  type TransactionOrder = Exclude<Orders['transactions'], undefined>[number]
25
25
  type StatusTransactionOrder = Pick<TransactionOrder, 'status'>['status']
@@ -50,7 +50,7 @@ export {
50
50
  Payment,
51
51
  Items,
52
52
  Item,
53
- CustomerCheckout,
53
+ CheckoutCustomer,
54
54
  PaymentMethod,
55
55
  Amount,
56
56
  ShippingSerive,
@@ -1,23 +1,27 @@
1
- // eslint-disable-next-line import/no-unresolved
2
1
  import { getFirestore } from 'firebase-admin/firestore';
3
- // eslint-disable-next-line import/no-unresolved
4
2
  import { getAuth } from 'firebase-admin/auth';
5
3
  import { logger } from 'firebase-functions';
6
4
  import api from '@cloudcommerce/api';
7
5
  import getEnv from '@cloudcommerce/firebase/lib/env';
8
6
 
9
- const findCustomerByEmail = async (email, isOnlyId = true) => {
10
- let params = `main_email=${email}`;
11
- if (isOnlyId) {
12
- params += '&fields=_id';
7
+ export const findCustomerByEmail = async (email, docNumber) => {
8
+ const params = {
9
+ main_email: email,
10
+ };
11
+ if (docNumber) {
12
+ params.doc_number = docNumber;
13
13
  }
14
- const { data } = await api.get(`customers?${params}`);
14
+ const { data } = await api.get('customers', {
15
+ params,
16
+ fields: ['_id', 'login', 'enabled'],
17
+ });
15
18
  if (data.result.length) {
16
19
  return data.result[0];
17
20
  }
18
21
  return null;
19
22
  };
20
- const generateAccessToken = async (customerId) => {
23
+
24
+ export const generateAccessToken = async (customerId, permissions) => {
21
25
  const { apiAuth } = getEnv();
22
26
  const { data } = await api({
23
27
  endpoint: 'authenticate',
@@ -26,6 +30,7 @@ const generateAccessToken = async (customerId) => {
26
30
  _id: apiAuth.authenticationId,
27
31
  api_key: apiAuth.apiKey,
28
32
  customer_id: customerId,
33
+ permissions,
29
34
  },
30
35
  });
31
36
  return {
@@ -34,6 +39,7 @@ const generateAccessToken = async (customerId) => {
34
39
  customer_id: customerId,
35
40
  };
36
41
  };
42
+
37
43
  const checkFirebaseAuth = async (authToken) => {
38
44
  const firebaseAuth = getAuth();
39
45
  try {
@@ -43,20 +49,29 @@ const checkFirebaseAuth = async (authToken) => {
43
49
  return null;
44
50
  }
45
51
  };
46
- const authenticateCustomer = async (firebaseAuthToken) => {
52
+
53
+ export const authenticateCustomer = async (firebaseAuthToken) => {
47
54
  const firebaseAuthUser = await checkFirebaseAuth(firebaseAuthToken);
48
55
  if (firebaseAuthUser) {
49
56
  const { name, email, email_verified: isEmailVerified } = firebaseAuthUser;
50
57
  if (email && isEmailVerified) {
51
- const customerId = (await findCustomerByEmail(email))?._id;
58
+ const customerMatch = await findCustomerByEmail(email);
59
+ const customerId = customerMatch?._id;
52
60
  if (customerId) {
61
+ if (customerMatch.login === false) {
62
+ return null;
63
+ }
53
64
  const docRef = getFirestore().doc(`customerTokens/${customerId}`);
54
65
  const storedToken = (await docRef.get()).data();
55
66
  const expires = storedToken?.expires;
56
67
  if (expires && new Date(expires).getTime() - Date.now() >= 2 * 60 * 1000) {
57
68
  return storedToken;
58
69
  }
59
- const customerToken = await generateAccessToken(customerId);
70
+ const permissions = { '*': ['all'] };
71
+ if (customerMatch.enabled === false) {
72
+ permissions.orders = ['GET', 'PATCH'];
73
+ }
74
+ const customerToken = await generateAccessToken(customerId, permissions);
60
75
  docRef.set(customerToken).catch(logger.error);
61
76
  return customerToken;
62
77
  }
@@ -74,8 +89,4 @@ const authenticateCustomer = async (firebaseAuthToken) => {
74
89
  }
75
90
  return null;
76
91
  };
77
-
78
- export default authenticateCustomer;
79
-
80
- export { findCustomerByEmail, generateAccessToken };
81
92
  // # sourceMappingURL=authenticate-customer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authenticate-customer.js","sourceRoot":"","sources":["../../src/firebase/authenticate-customer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authenticate-customer.js","sourceRoot":"","sources":["../../src/firebase/authenticate-customer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,50 @@
1
1
  import { logger } from 'firebase-functions';
2
- import authenticateCustomer from './authenticate-customer.js';
2
+ import api from '@cloudcommerce/api';
3
+ import { findCustomerByEmail, authenticateCustomer } from './authenticate-customer.js';
4
+
5
+ const maskCustomerFields = (customer) => {
6
+ const safeCustomer = {
7
+ _id: customer._id,
8
+ store_id: customer.store_id,
9
+ created_at: customer.created_at,
10
+ updated_at: customer.updated_at,
11
+ main_email: customer.main_email, // email already used to identify the customer
12
+ display_name: customer.display_name,
13
+ name: customer.name && {
14
+ given_name: customer.name.given_name,
15
+ family_name: '***',
16
+ },
17
+ registry_type: customer.registry_type,
18
+ state: customer.state,
19
+ enabled: customer.enabled,
20
+ login: customer.login,
21
+ locale: customer.locale,
22
+ accepts_marketing: customer.accepts_marketing,
23
+ birth_date: customer.birth_date,
24
+ pronoun: customer.pronoun,
25
+ currency_id: customer.currency_id,
26
+ currency_symbol: customer.currency_symbol,
27
+ favorites: customer.favorites,
28
+ last_searched_terms: customer.last_searched_terms,
29
+ last_visited_products: customer.last_visited_products,
30
+ phones: customer.phones?.map((phone) => ({
31
+ ...phone,
32
+ number: '000' + phone.number.substring(phone.number.length - 2),
33
+ })),
34
+ addresses: customer.addresses?.map((address) => ({
35
+ zip: address.zip,
36
+ province_code: address.province_code,
37
+ line_address: `${(address.street || address.city)} ***`,
38
+ name: '***',
39
+ default: address.default,
40
+ })),
41
+ orders: customer.orders?.map((order) => ({
42
+ _id: order._id,
43
+ number: order.number,
44
+ })),
45
+ };
46
+ return safeCustomer;
47
+ };
3
48
 
4
49
  export default async (req, res) => {
5
50
  let { url } = req;
@@ -7,7 +52,49 @@ export default async (req, res) => {
7
52
  url = url.slice(0, -5);
8
53
  }
9
54
  url = url.replace('/_api/passport', ''); // due to hosting rewrite
10
- const endpoint = url.split('/')[1];
55
+ const endpoint = url.split('/').pop();
56
+ if (endpoint === 'identify') {
57
+ const { body } = req;
58
+ if (body) {
59
+ const email = body.email;
60
+ if (typeof email === 'string' && /^[^@]+@[^@]+\.[^@]+$/.test(email)) {
61
+ const docNumber = body.doc_number ? `${body.doc_number}` : undefined;
62
+ try {
63
+ const customerMatch = await findCustomerByEmail(email, docNumber);
64
+ if (customerMatch) {
65
+ const customerId = customerMatch._id;
66
+ const customer = {
67
+ _id: customerId,
68
+ main_email: email,
69
+ doc_number: docNumber,
70
+ };
71
+ const level = docNumber ? 1 : 0;
72
+ if (level) {
73
+ Object.assign(customer, maskCustomerFields((await api.get(`customers/${customerId}`)).data));
74
+ }
75
+ res.send({
76
+ customer,
77
+ auth: {
78
+ id: customer._id,
79
+ level,
80
+ token: null,
81
+ },
82
+ });
83
+ return;
84
+ }
85
+ res.status(403).json({
86
+ status: 403,
87
+ error: 'Forbidden, no profile found with email provided',
88
+ });
89
+ } catch (err) {
90
+ logger.error(err);
91
+ res.sendStatus(err.statusCode || 500);
92
+ }
93
+ }
94
+ }
95
+ res.sendStatus(400);
96
+ return;
97
+ }
11
98
  if (endpoint !== 'token') {
12
99
  res.sendStatus(404);
13
100
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"serve-passport-api.js","sourceRoot":"","sources":["../../src/firebase/serve-passport-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAE3D,eAAe,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACnD,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAClB,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACzB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KACxB;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB;IAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO;KACR;IACD,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,iBAAiB,EAAE;QACtB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO;KACR;IACD,IAAI;QACF,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QACtE,IAAI,eAAe,KAAK,IAAI,EAAE;YAC5B,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC1B,OAAO;SACR;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,2CAA2C;SACnD,CAAC,CAAC;KACJ;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,UAAU,CAAE,GAAgB,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;KACrD;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"serve-passport-api.js","sourceRoot":"","sources":["../../src/firebase/serve-passport-api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAAC;AAExC,wDAAwD;AACxD,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS;KAC9B,MAAM,CAAC,MAAM,CAAC;KACd,OAAO,CAAC;IACP,GAAG,oBAAoB;IACvB,cAAc,EAAE,EAAE;CACnB,CAAC;KACD,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE;QACtC,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,gCAAgC,CAAC,CAAC;QAChF,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,GAAG,CAAC,SAAS,CACX,8BAA8B,EAC9B,kEAAkE,CACnE,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;YAC5B,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC1B;KACF;IACD,OAAO,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAAC;AAExC,wDAAwD;AACxD,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS;KAC9B,MAAM,CAAC,MAAM,CAAC;KACd,OAAO,CAAC;IACP,GAAG,oBAAoB;IACvB,cAAc,EAAE,EAAE;CACnB,CAAC;KACD,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACvC,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,gCAAgC,CAAC,CAAC;QAChF,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,GAAG,CAAC,SAAS,CACX,8BAA8B,EAC9B,kEAAkE,CACnE,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC"}