cloudcommerce 2.11.2 → 2.12.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 (91) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/ecomplus-stores/barradoce/functions/many/package.json +3 -3
  3. package/ecomplus-stores/barradoce/functions/ssr/content/pages/home.json +50 -86
  4. package/ecomplus-stores/barradoce/functions/ssr/package.json +6 -6
  5. package/ecomplus-stores/barradoce/functions/ssr/public/img/uploads/banner-pistache.jpg +0 -0
  6. package/ecomplus-stores/barradoce/functions/ssr/src/components/Banner.vue +7 -8
  7. package/ecomplus-stores/barradoce/functions/with-apps/package.json +3 -3
  8. package/ecomplus-stores/barradoce/package.json +2 -2
  9. package/package.json +2 -2
  10. package/packages/__skeleton/package.json +2 -1
  11. package/packages/api/package.json +2 -2
  12. package/packages/apps/affiliate-program/package.json +2 -2
  13. package/packages/apps/correios/package.json +2 -2
  14. package/packages/apps/custom-payment/package.json +2 -2
  15. package/packages/apps/custom-shipping/package.json +2 -2
  16. package/packages/apps/datafrete/package.json +2 -2
  17. package/packages/apps/discounts/package.json +2 -2
  18. package/packages/apps/emails/package.json +2 -2
  19. package/packages/apps/fb-conversions/package.json +2 -2
  20. package/packages/apps/flash-courier/package.json +2 -2
  21. package/packages/apps/frenet/package.json +2 -2
  22. package/packages/apps/galaxpay/package.json +3 -2
  23. package/packages/apps/google-analytics/package.json +2 -2
  24. package/packages/apps/jadlog/package.json +2 -2
  25. package/packages/apps/loyalty-points/package.json +2 -2
  26. package/packages/apps/mandae/package.json +2 -2
  27. package/packages/apps/melhor-envio/package.json +2 -2
  28. package/packages/apps/mercadopago/package.json +3 -2
  29. package/packages/apps/pagaleve/CHANGELOG.md +1 -0
  30. package/packages/apps/pagaleve/README.md +1 -0
  31. package/packages/apps/pagaleve/lib/index.d.ts +1 -0
  32. package/packages/apps/pagaleve/lib/index.js +3 -0
  33. package/packages/apps/pagaleve/lib/index.js.map +1 -0
  34. package/packages/apps/pagaleve/lib/pagaleve-constructor.d.ts +7 -0
  35. package/packages/apps/pagaleve/lib/pagaleve-constructor.js +78 -0
  36. package/packages/apps/pagaleve/lib/pagaleve-constructor.js.map +1 -0
  37. package/packages/apps/pagaleve/lib/pagaleve-create-transaction.d.ts +7 -0
  38. package/packages/apps/pagaleve/lib/pagaleve-create-transaction.js +148 -0
  39. package/packages/apps/pagaleve/lib/pagaleve-create-transaction.js.map +1 -0
  40. package/packages/apps/pagaleve/lib/pagaleve-list-payments.d.ts +7 -0
  41. package/packages/apps/pagaleve/lib/pagaleve-list-payments.js +113 -0
  42. package/packages/apps/pagaleve/lib/pagaleve-list-payments.js.map +1 -0
  43. package/packages/apps/pagaleve/lib/pagaleve-webhook.d.ts +4 -0
  44. package/packages/apps/pagaleve/lib/pagaleve-webhook.js +135 -0
  45. package/packages/apps/pagaleve/lib/pagaleve-webhook.js.map +1 -0
  46. package/packages/apps/pagaleve/lib/pagaleve.d.ts +12 -0
  47. package/packages/apps/pagaleve/lib/pagaleve.js +12 -0
  48. package/packages/apps/pagaleve/lib/pagaleve.js.map +1 -0
  49. package/packages/apps/pagaleve/package.json +43 -0
  50. package/packages/apps/pagaleve/src/index.ts +2 -0
  51. package/packages/apps/pagaleve/src/pagaleve-constructor.ts +85 -0
  52. package/packages/apps/pagaleve/src/pagaleve-create-transaction.ts +161 -0
  53. package/packages/apps/pagaleve/src/pagaleve-list-payments.ts +122 -0
  54. package/packages/apps/pagaleve/src/pagaleve-webhook.ts +150 -0
  55. package/packages/apps/pagaleve/src/pagaleve.ts +12 -0
  56. package/packages/apps/pagaleve/tsconfig.json +6 -0
  57. package/packages/apps/pagaleve/webhook.js +1 -0
  58. package/packages/apps/pagarme/package.json +3 -2
  59. package/packages/apps/pagarme-v5/package.json +3 -2
  60. package/packages/apps/paghiper/package.json +2 -2
  61. package/packages/apps/pix/package.json +2 -2
  62. package/packages/apps/tiny-erp/package.json +2 -2
  63. package/packages/apps/webhooks/package.json +2 -2
  64. package/packages/cli/package.json +2 -2
  65. package/packages/config/package.json +2 -2
  66. package/packages/emails/package.json +2 -2
  67. package/packages/eslint/package.json +2 -2
  68. package/packages/events/lib/firebase.js +2 -0
  69. package/packages/events/lib/firebase.js.map +1 -1
  70. package/packages/events/package.json +3 -2
  71. package/packages/events/src/firebase.ts +2 -0
  72. package/packages/feeds/package.json +2 -2
  73. package/packages/firebase/lib/config.d.ts +3 -0
  74. package/packages/firebase/lib/config.js +3 -0
  75. package/packages/firebase/lib/config.js.map +1 -1
  76. package/packages/firebase/package.json +2 -2
  77. package/packages/firebase/src/config.ts +3 -0
  78. package/packages/i18n/package.json +2 -2
  79. package/packages/modules/lib/firebase/call-app-module.js +12 -0
  80. package/packages/modules/lib/firebase/call-app-module.js.map +1 -1
  81. package/packages/modules/package.json +3 -2
  82. package/packages/modules/src/firebase/call-app-module.ts +12 -0
  83. package/packages/passport/lib/firebase.js +20 -22
  84. package/packages/passport/lib/firebase.js.map +1 -1
  85. package/packages/passport/package.json +2 -2
  86. package/packages/passport/src/firebase.ts +25 -25
  87. package/packages/ssr/package.json +2 -2
  88. package/packages/storefront/package.json +2 -2
  89. package/packages/test-base/package.json +2 -2
  90. package/packages/types/package.json +2 -2
  91. package/ecomplus-stores/barradoce/functions/ssr/public/img/uploads/banner-forma-decora.jpg +0 -0
@@ -0,0 +1,78 @@
1
+ import axios from 'axios';
2
+ import { getFirestore, Timestamp } from 'firebase-admin/firestore';
3
+ import logger from 'firebase-functions/logger';
4
+
5
+ const createAxios = (token, isSandbox = false) => {
6
+ const headers = {
7
+ 'Content-Type': 'application/json',
8
+ 'Idempotency-Key': `${Date.now() + Math.random()}`,
9
+ Authorization: token,
10
+ };
11
+ const baseURL = isSandbox
12
+ ? 'https://sandbox-api.pagaleve.io'
13
+ : 'https://api.pagaleve.com.br';
14
+ return axios.create({
15
+ baseURL,
16
+ headers,
17
+ validateStatus(status) {
18
+ return status >= 200 && status <= 301;
19
+ },
20
+ });
21
+ };
22
+ const createToken = (username, password, isSandbox = false) => {
23
+ return new Promise((resolve, reject) => {
24
+ // https://api-docs.addi-staging-br.com/#/Authentication/createAuthToken
25
+ const pagaleveAxios = createAxios(null, isSandbox);
26
+ const request = (isRetry = false) => {
27
+ pagaleveAxios.post('/v1/authentication', { username, password })
28
+ .then(({ data }) => resolve(data))
29
+ .catch((err) => {
30
+ if (!isRetry && err.response && err.response.status >= 429) {
31
+ setTimeout(() => request(true), 7000);
32
+ }
33
+ reject(err);
34
+ });
35
+ };
36
+ request();
37
+ });
38
+ };
39
+ const Pagaleve = function newPagaleve(username, password, isSandbox = false) {
40
+ const self = this;
41
+ const documentRef = getFirestore().doc('pagaleve/token');
42
+ this.preparing = new Promise((resolve, reject) => {
43
+ const authenticate = (token) => {
44
+ self.axios = createAxios(token, isSandbox);
45
+ resolve();
46
+ };
47
+ const handleAuth = () => {
48
+ createToken(username, password, isSandbox)
49
+ .then((data) => {
50
+ authenticate(data.token);
51
+ if (documentRef) {
52
+ documentRef.set({
53
+ ...data,
54
+ isSandbox,
55
+ updatedAt: Timestamp.now(),
56
+ }).catch(logger.error);
57
+ }
58
+ })
59
+ .catch(reject);
60
+ };
61
+ documentRef.get()
62
+ .then((documentSnapshot) => {
63
+ const data = documentSnapshot.data();
64
+ if (data) {
65
+ const updatedAt = data.updatedAt.toMillis();
66
+ if (updatedAt && Date.now() - updatedAt <= 50 * 60 * 1000) {
67
+ authenticate(data.token);
68
+ return;
69
+ }
70
+ }
71
+ handleAuth();
72
+ })
73
+ .catch(logger.error);
74
+ });
75
+ };
76
+
77
+ export default Pagaleve;
78
+ // # sourceMappingURL=pagaleve-constructor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagaleve-constructor.js","sourceRoot":"","sources":["../src/pagaleve-constructor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AppModuleBody, CreateTransactionResponse } from '@cloudcommerce/types';
2
+ declare const pagaleveCreateTransaction: (body: AppModuleBody<'create_transaction'>) => Promise<CreateTransactionResponse | {
3
+ status: number;
4
+ error: string;
5
+ message: any;
6
+ }>;
7
+ export default pagaleveCreateTransaction;
@@ -0,0 +1,148 @@
1
+ import { createHmac } from 'node:crypto';
2
+ import logger from 'firebase-functions/logger';
3
+ import { img as getImg } from '@ecomplus/utils';
4
+ import config from '@cloudcommerce/firebase/lib/config';
5
+ import Pagaleve from './pagaleve-constructor.js';
6
+
7
+ const { region } = config.get().httpsFunctionOptions;
8
+ const baseUri = `https://${region}-${process.env.GCLOUD_PROJECT}.cloudfunctions.net`;
9
+ const pagaleveCreateTransaction = async (body) => {
10
+ const { params, application } = body;
11
+ const appData = { ...application.data, ...application.hidden_data };
12
+ const { PAGALEVE_USERNAME, PAGALEVE_PASSWORD, PAGALEVE_SANDBOX } = process.env;
13
+ if (PAGALEVE_USERNAME) appData.username = PAGALEVE_USERNAME;
14
+ if (PAGALEVE_PASSWORD) appData.password = PAGALEVE_PASSWORD;
15
+ const isSandbox = !!PAGALEVE_SANDBOX;
16
+ const pagaleve = new Pagaleve(appData.username, appData.password, isSandbox);
17
+ const orderId = params.order_id || '';
18
+ const orderNumber = params.order_number;
19
+ const { amount, buyer, items } = params;
20
+ const isPix = params.payment_method.code === 'account_deposit';
21
+ const transaction = {
22
+ intermediator: {
23
+ payment_method: params.payment_method,
24
+ },
25
+ currency_id: params.currency_id,
26
+ currency_symbol: params.currency_symbol,
27
+ amount: amount.total,
28
+ status: {
29
+ current: 'pending',
30
+ },
31
+ };
32
+ const finalAmount = Math.floor(amount.total * 100);
33
+ const finalFreight = amount.freight ? Math.floor(amount.freight * 100) : 0;
34
+ const parseAddress = (_to) => ({
35
+ name: _to.name,
36
+ city: _to.city,
37
+ state: _to.province_code,
38
+ street: _to.street,
39
+ zip_code: _to.zip,
40
+ neighborhood: _to.borough,
41
+ number: String(_to.number) || 's/n',
42
+ complement: _to.complement || undefined,
43
+ });
44
+ const shippingAddr = params.to && parseAddress(params.to);
45
+ const billingAddr = params.billing_address
46
+ ? parseAddress(params.billing_address)
47
+ : shippingAddr;
48
+ const hash = createHmac('sha256', appData.password)
49
+ .update(orderId).digest('hex');
50
+ const pagaleveTransaction = {
51
+ cancel_url: `https://${params.domain}/app/#/order/${orderNumber}/${orderId}`,
52
+ approve_url: `https://${params.domain}/app/#/order/${orderNumber}/${orderId}`,
53
+ webhook_url: `${baseUri}/pagaleve-webhook?order_id=${orderId}&hash=${hash}`,
54
+ is_pix_upfront: !!isPix,
55
+ order: {
56
+ reference: orderId,
57
+ description: `Order from e-com.plus ${orderNumber}`,
58
+ shipping: {
59
+ amount: finalFreight || 0,
60
+ address: shippingAddr,
61
+ },
62
+ amount: finalAmount,
63
+ items: [],
64
+ timestamp: new Date().toISOString(),
65
+ type: 'ORDINARY',
66
+ },
67
+ shopper: {
68
+ cpf: String(buyer.doc_number),
69
+ first_name: buyer.fullname.replace(/\s.*/, ''),
70
+ last_name: buyer.fullname.replace(/[^\s]+\s/, ''),
71
+ email: buyer.email,
72
+ phone: buyer.phone.number,
73
+ billing_address: billingAddr,
74
+ },
75
+ };
76
+ let totalQuantity = 0;
77
+ items.forEach((item) => {
78
+ if (item.quantity > 0) {
79
+ totalQuantity += item.quantity;
80
+ const objImg = getImg(item);
81
+ pagaleveTransaction.order.items.push({
82
+ name: item.name || item.sku,
83
+ sku: item.sku,
84
+ quantity: item.quantity,
85
+ price: Math.floor((item.final_price || item.price) * 100),
86
+ url: `https://${params.domain}`,
87
+ reference: item.product_id,
88
+ image: objImg && objImg.url ? objImg.url : `https://${params.domain}`,
89
+ });
90
+ }
91
+ });
92
+ const birthDate = buyer.birth_date;
93
+ if (birthDate && birthDate.year && birthDate.month && birthDate.day) {
94
+ pagaleveTransaction.birth_date = `${birthDate.year}-`
95
+ + `${birthDate.month.toString().padStart(2, '0')}-`
96
+ + birthDate.day.toString().padStart(2, '0');
97
+ }
98
+ if (totalQuantity > 0) {
99
+ try {
100
+ await pagaleve.preparing;
101
+ const { data } = pagaleve.axios.post('/v1/checkouts', pagaleveTransaction, {
102
+ maxRedirects: 0,
103
+ });
104
+ transaction.payment_link = data.redirect_url || data.checkout_url;
105
+ if (isPix && data.timestamp) {
106
+ transaction.account_deposit = {
107
+ valid_thru: data.timestamp,
108
+ };
109
+ }
110
+ return {
111
+ redirect_to_payment: true,
112
+ transaction,
113
+ };
114
+ } catch (error) {
115
+ const errCode = 'PAGALEVE_TRANSACTION_ERR';
116
+ let { message } = error;
117
+ const err = new Error(`${errCode} #${orderId} => ${message}`);
118
+ if (error.response) {
119
+ const { status, data } = error.response;
120
+ if (status !== 401 && status !== 403) {
121
+ err.transaction = transaction;
122
+ err.status = status;
123
+ if (typeof data === 'object' && data) {
124
+ err.response = JSON.stringify(data);
125
+ } else {
126
+ err.response = data;
127
+ }
128
+ } else if (Array.isArray(data?.errors) && data.errors[0]?.message) {
129
+ message = data.errors[0].message;
130
+ }
131
+ }
132
+ logger.error(err);
133
+ return {
134
+ status: 409,
135
+ error: errCode,
136
+ message,
137
+ };
138
+ }
139
+ }
140
+ return {
141
+ status: 400,
142
+ error: 'PAGALEVE_TRANSACTION_INVALID',
143
+ message: 'Não há itens disponíveis no pedido',
144
+ };
145
+ };
146
+
147
+ export default pagaleveCreateTransaction;
148
+ // # sourceMappingURL=pagaleve-create-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagaleve-create-transaction.js","sourceRoot":"","sources":["../src/pagaleve-create-transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AppModuleBody, ListPaymentsResponse } from '@cloudcommerce/types';
2
+ declare const pagaleveListPayments: (body: AppModuleBody<'list_payments'>) => ListPaymentsResponse | {
3
+ status: number;
4
+ error: string;
5
+ message: string;
6
+ };
7
+ export default pagaleveListPayments;
@@ -0,0 +1,113 @@
1
+ import logger from 'firebase-functions/logger';
2
+
3
+ const pagaleveListPayments = (body) => {
4
+ const { application } = body;
5
+ const params = body.params;
6
+ const response = {
7
+ payment_gateways: [],
8
+ };
9
+ const appData = { ...application.data, ...application.hidden_data };
10
+ const { PAGALEVE_USERNAME, PAGALEVE_PASSWORD } = process.env;
11
+ if (PAGALEVE_USERNAME) appData.username = PAGALEVE_USERNAME;
12
+ if (PAGALEVE_PASSWORD) appData.password = PAGALEVE_PASSWORD;
13
+ if (!appData.username || !appData.password) {
14
+ logger.warn('Missign Pagaleve username/password');
15
+ return {
16
+ status: 409,
17
+ error: 'NO_PAGALEVE_KEYS',
18
+ message: 'Usuário e/ou senha não configurados pelo lojista',
19
+ };
20
+ }
21
+ const amount = params.amount || {};
22
+ const intermediator = {
23
+ name: 'Pagaleve',
24
+ link: 'https://api.pagaleve.com.br',
25
+ code: 'pagaleve',
26
+ };
27
+ const { discount } = appData;
28
+ if (discount && discount.value) {
29
+ if (discount.apply_at !== 'freight') {
30
+ const { value } = discount;
31
+ response.discount_option = {
32
+ label: 'Pix',
33
+ value,
34
+ };
35
+ ['type', 'min_amount'].forEach((prop) => {
36
+ if (discount[prop]) {
37
+ response.discount_option[prop] = discount[prop];
38
+ }
39
+ });
40
+ }
41
+ if (amount.total) {
42
+ if (amount.total < discount.min_amount) {
43
+ discount.value = 0;
44
+ } else {
45
+ delete discount.min_amount;
46
+ const maxDiscount = amount[discount.apply_at || 'subtotal'];
47
+ let discountValue;
48
+ if (discount.type === 'percentage') {
49
+ discountValue = maxDiscount * (discount.value / 100);
50
+ } else {
51
+ discountValue = discount.value;
52
+ if (discountValue > maxDiscount) {
53
+ discountValue = maxDiscount;
54
+ }
55
+ }
56
+ if (discountValue) {
57
+ amount.discount = (amount.discount || 0) + discountValue;
58
+ amount.total -= discountValue;
59
+ if (amount.total < 0) {
60
+ amount.total = 0;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ const listPaymentMethods = ['payment_link', 'account_deposit'];
67
+ listPaymentMethods.forEach((paymentMethod) => {
68
+ const isLinkPayment = paymentMethod === 'payment_link';
69
+ const methodConfig = (appData[paymentMethod] || {});
70
+ const minAmount = Number(methodConfig.min_amount || 1);
71
+ let validateAmount = false;
72
+ if (amount.total && minAmount >= 0) {
73
+ validateAmount = amount.total >= minAmount;
74
+ }
75
+ // Workaround for showcase
76
+ const validatePayment = amount.total ? validateAmount : true;
77
+ const methodEnable = !methodConfig.disable;
78
+ if (validatePayment && methodEnable) {
79
+ const label = methodConfig.label || (isLinkPayment ? 'Pix Parcelado' : 'Pagar com Pix');
80
+ const gateway = {
81
+ label,
82
+ icon: methodConfig.icon,
83
+ text: methodConfig.text,
84
+ payment_method: {
85
+ code: isLinkPayment ? 'balance_on_intermediary' : paymentMethod,
86
+ name: `${label} - ${intermediator.name} `,
87
+ },
88
+ intermediator,
89
+ };
90
+ if (!gateway.icon) {
91
+ if (isLinkPayment) {
92
+ gateway.icon = 'https://ecom-pagaleve.web.app/pagaleve-parcelado.png';
93
+ } else {
94
+ gateway.icon = 'https://ecom-pagaleve.web.app/pagaleve-pix.png';
95
+ }
96
+ }
97
+ if ((discount && discount.value && discount[paymentMethod] !== false)) {
98
+ gateway.discount = {};
99
+ ['apply_at', 'type', 'value'].forEach((field) => {
100
+ gateway.discount[field] = discount[field];
101
+ });
102
+ if (response.discount_option && !response.discount_option.label) {
103
+ response.discount_option.label = label;
104
+ }
105
+ }
106
+ response.payment_gateways.push(gateway);
107
+ }
108
+ });
109
+ return response;
110
+ };
111
+
112
+ export default pagaleveListPayments;
113
+ // # sourceMappingURL=pagaleve-list-payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagaleve-list-payments.js","sourceRoot":"","sources":["../src/pagaleve-list-payments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import functions from 'firebase-functions/v1';
2
+ export declare const pagarme: {
3
+ webhook: functions.HttpsFunction;
4
+ };
@@ -0,0 +1,135 @@
1
+ /* eslint-disable import/prefer-default-export */
2
+ import { createHmac, timingSafeEqual } from 'node:crypto';
3
+ import functions from 'firebase-functions/v1';
4
+ import logger from 'firebase-functions/logger';
5
+ import api from '@cloudcommerce/api';
6
+ import config from '@cloudcommerce/firebase/lib/config';
7
+ import Pagaleve from './pagaleve-constructor.js';
8
+
9
+ const { httpsFunctionOptions } = config.get();
10
+ const getAppHiddenData = async () => {
11
+ const { appId } = config.get().apps.pagaleve;
12
+ const { data } = await api.get(`applications?app_id=${appId}&fields=hidden_data`);
13
+ return data.result[0]?.hidden_data;
14
+ };
15
+ const parseStatusToEcom = (pagaleveTransactionStatus) => {
16
+ switch (pagaleveTransactionStatus.toLowerCase()) {
17
+ case 'pending':
18
+ case 'new':
19
+ case 'accepted':
20
+ return 'pending';
21
+ case 'authorized':
22
+ case 'completed':
23
+ return 'paid';
24
+ case 'expired':
25
+ case 'DECLINED':
26
+ case 'ABANDONED':
27
+ case 'canceled':
28
+ return 'voided';
29
+ default:
30
+ }
31
+ return 'unknown';
32
+ };
33
+
34
+ export const pagarme = {
35
+ webhook: functions
36
+ .region(httpsFunctionOptions.region)
37
+ .runWith(httpsFunctionOptions)
38
+ .https.onRequest(async (req, res) => {
39
+ const { body, query: { hash } } = req;
40
+ if (typeof hash !== 'string') {
41
+ res.sendStatus(403);
42
+ return;
43
+ }
44
+ const {
45
+ id, orderReference, state, amount,
46
+ } = (body || {});
47
+ if (typeof orderReference !== 'string' || orderReference.length !== 24) {
48
+ res.sendStatus(400);
49
+ return;
50
+ }
51
+ let appData;
52
+ try {
53
+ appData = await getAppHiddenData();
54
+ } catch (err) {
55
+ logger.error(err);
56
+ res.sendStatus(500);
57
+ return;
58
+ }
59
+ if (!appData?.password) {
60
+ res.sendStatus(409);
61
+ return;
62
+ }
63
+ const { PAGALEVE_USERNAME, PAGALEVE_PASSWORD, PAGALEVE_SANDBOX } = process.env;
64
+ if (PAGALEVE_USERNAME) appData.username = PAGALEVE_USERNAME;
65
+ if (PAGALEVE_PASSWORD) appData.password = PAGALEVE_PASSWORD;
66
+ const isSandbox = !!PAGALEVE_SANDBOX;
67
+ const validHash = createHmac('sha256', appData.password)
68
+ .update(orderReference).digest('hex');
69
+ if (validHash.length !== hash.length
70
+ || !timingSafeEqual(Buffer.from(hash), Buffer.from(validHash))) {
71
+ res.sendStatus(401);
72
+ return;
73
+ }
74
+ const orderEndpoint = `orders/${orderReference}`;
75
+ try {
76
+ const { data: order } = await api.get(orderEndpoint);
77
+ if (order?.transactions) {
78
+ const transactionIndex = order.transactions.findIndex(({ app }) => {
79
+ return app?.intermediator?.code === 'pagaleve';
80
+ });
81
+ const transactionId = order.transactions[transactionIndex]?._id;
82
+ if (!transactionId) {
83
+ res.sendStatus(404);
84
+ return;
85
+ }
86
+ await api.post(`${orderEndpoint}/payments_history`, {
87
+ date_time: new Date().toISOString(),
88
+ status: parseStatusToEcom(state),
89
+ transaction_id: transactionId,
90
+ flags: ['pagaleve'],
91
+ });
92
+ await api.patch(`${orderEndpoint}/transactions/${transactionId}`, {
93
+ intermediator: {
94
+ transaction_id: id || '',
95
+ transaction_code: id || '',
96
+ },
97
+ });
98
+ if (state.toLowerCase() === 'authorized') {
99
+ const pagaleve = new Pagaleve(appData.username, appData.password, isSandbox);
100
+ await pagaleve.preparing;
101
+ const pagalevePayment = {
102
+ checkout_id: id,
103
+ currency: 'BRL',
104
+ amount,
105
+ intent: 'CAPTURE',
106
+ };
107
+ await pagaleve.axios.post('/v1/payments', pagalevePayment, {
108
+ maxRedirects: 0,
109
+ });
110
+ }
111
+ }
112
+ } catch (error) {
113
+ const { response } = error;
114
+ let status;
115
+ if (response) {
116
+ status = response.status;
117
+ const err = new Error(`Webhook failed with ${status} for #${orderReference}`);
118
+ err.url = error.config?.url;
119
+ err.body = error.config?.body;
120
+ err.status = status;
121
+ err.response = JSON.stringify(response.data);
122
+ logger.error(err);
123
+ } else {
124
+ logger.error(error);
125
+ }
126
+ if (!res.headersSent) {
127
+ res.send({
128
+ status: status || 500,
129
+ msg: `Pagaleve webhook error for ${orderReference}`,
130
+ });
131
+ }
132
+ }
133
+ }),
134
+ };
135
+ // # sourceMappingURL=pagaleve-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagaleve-webhook.js","sourceRoot":"","sources":["../src/pagaleve-webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import '@cloudcommerce/firebase/lib/init';
2
+ import type { AppModuleBody } from '@cloudcommerce/types';
3
+ export declare const listPayments: (modBody: AppModuleBody<'list_payments'>) => Promise<import("@cloudcommerce/types").ListPaymentsResponse | {
4
+ status: number;
5
+ error: string;
6
+ message: string;
7
+ }>;
8
+ export declare const createTransaction: (modBody: AppModuleBody<'create_transaction'>) => Promise<import("@cloudcommerce/types").CreateTransactionResponse | {
9
+ status: number;
10
+ error: string;
11
+ message: any;
12
+ }>;
@@ -0,0 +1,12 @@
1
+ import '@cloudcommerce/firebase/lib/init';
2
+ import handleListPayments from './pagaleve-list-payments.js';
3
+ import handleCreateTransaction from './pagaleve-create-transaction.js';
4
+
5
+ export const listPayments = async (modBody) => {
6
+ return handleListPayments(modBody);
7
+ };
8
+
9
+ export const createTransaction = async (modBody) => {
10
+ return handleCreateTransaction(modBody);
11
+ };
12
+ // # sourceMappingURL=pagaleve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagaleve.js","sourceRoot":"","sources":["../src/pagaleve.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAE1C,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,uBAAuB,MAAM,+BAA+B,CAAC;AAEpE,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,OAAuC,EAAE,EAAE;IAC5E,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAA4C,EAAE,EAAE;IACtF,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@cloudcommerce/app-pagaleve",
3
+ "type": "module",
4
+ "version": "2.12.0",
5
+ "description": "e-com.plus Cloud Commerce app to integrate Pagaleve",
6
+ "main": "lib/pagaleve.js",
7
+ "exports": {
8
+ ".": "./lib/pagaleve.js",
9
+ "./webhook": "./lib/pagaleve-webhook.js"
10
+ },
11
+ "files": [
12
+ "/lib",
13
+ "/lib-mjs",
14
+ "/assets",
15
+ "/types",
16
+ "/*.{js,mjs,ts}"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/ecomplus/cloud-commerce.git",
21
+ "directory": "packages/apps/pagaleve"
22
+ },
23
+ "author": "E-Com Club Softwares para E-commerce <ti@e-com.club>",
24
+ "license": "MIT",
25
+ "bugs": {
26
+ "url": "https://github.com/ecomplus/cloud-commerce/issues"
27
+ },
28
+ "homepage": "https://github.com/ecomplus/cloud-commerce/tree/main/packages/apps/pagaleve#readme",
29
+ "scripts": {
30
+ "build": "bash ../../../scripts/build-lib.sh"
31
+ },
32
+ "dependencies": {
33
+ "@cloudcommerce/api": "workspace:*",
34
+ "@cloudcommerce/firebase": "workspace:*",
35
+ "@ecomplus/utils": "1.5.0-rc.6",
36
+ "axios": "^1.6.8",
37
+ "firebase-admin": "^12.0.0",
38
+ "firebase-functions": "^4.8.2"
39
+ },
40
+ "devDependencies": {
41
+ "@cloudcommerce/types": "workspace:*"
42
+ }
43
+ }
@@ -0,0 +1,2 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export * from './pagaleve';