cloudcommerce 0.0.117 → 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.
- package/CHANGELOG.md +4 -0
- package/ecomplus-stores/monocard/functions/core/package.json +1 -1
- package/ecomplus-stores/monocard/functions/events/package.json +2 -2
- package/ecomplus-stores/monocard/functions/modules/package.json +2 -2
- package/ecomplus-stores/monocard/functions/passport/package.json +2 -2
- package/ecomplus-stores/monocard/functions/ssr/package.json +5 -5
- package/ecomplus-stores/monocard/functions/ssr/src/pages/fallback.astro +1 -1
- package/ecomplus-stores/monocard/package.json +1 -1
- package/package.json +1 -1
- package/packages/api/package.json +1 -1
- package/packages/apps/correios/package.json +1 -1
- package/packages/apps/custom-shipping/package.json +1 -1
- package/packages/apps/discounts/package.json +1 -1
- package/packages/apps/frenet/package.json +1 -1
- package/packages/apps/mercadopago/lib/index.d.ts +1 -0
- package/packages/apps/mercadopago/lib/index.js +3 -0
- package/packages/apps/mercadopago/lib/index.js.map +1 -0
- package/packages/apps/mercadopago/lib/mercadopago.d.ts +86 -0
- package/packages/apps/mercadopago/lib/mercadopago.js +15 -0
- package/packages/apps/mercadopago/lib/mercadopago.js.map +1 -0
- package/packages/apps/mercadopago/lib/mp-create-transaction.d.ts +85 -0
- package/packages/apps/mercadopago/lib/mp-create-transaction.js +270 -0
- package/packages/apps/mercadopago/lib/mp-create-transaction.js.map +1 -0
- package/packages/apps/mercadopago/lib/mp-list-payments.d.ts +7 -0
- package/packages/apps/mercadopago/lib/mp-list-payments.js +175 -0
- package/packages/apps/mercadopago/lib/mp-list-payments.js.map +1 -0
- package/packages/apps/mercadopago/lib/mp-webhook.d.ts +5 -0
- package/packages/apps/mercadopago/lib/mp-webhook.js +119 -0
- package/packages/apps/mercadopago/lib/mp-webhook.js.map +1 -0
- package/packages/apps/mercadopago/package.json +1 -1
- package/packages/apps/tiny-erp/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/config/package.json +1 -1
- package/packages/events/package.json +1 -1
- package/packages/firebase/lib/config.js +38 -34
- package/packages/firebase/lib/const.js +3 -2
- package/packages/firebase/lib/env.js +2 -1
- package/packages/firebase/lib/handlers/check-store-events.js +146 -145
- package/packages/firebase/lib/helpers/pubsub.js +20 -18
- package/packages/firebase/lib/helpers/update-app-data.js +38 -38
- package/packages/firebase/lib/index.js +9 -7
- package/packages/firebase/lib/init.js +2 -1
- package/packages/firebase/package.json +1 -1
- package/packages/i18n/package.json +1 -1
- package/packages/modules/lib/firebase/serve-modules-api.js +1 -0
- package/packages/modules/lib/firebase/serve-modules-api.js.map +1 -1
- package/packages/modules/package.json +1 -1
- package/packages/passport/lib/firebase/authenticate-customer.js +81 -0
- package/packages/passport/lib/firebase/authenticate-customer.js.map +1 -0
- package/packages/passport/lib/firebase/serve-passport-api.js +32 -0
- package/packages/passport/lib/firebase/serve-passport-api.js.map +1 -0
- package/packages/passport/lib/firebase.js +16 -0
- package/packages/passport/lib/firebase.js.map +1 -0
- package/packages/passport/lib/index.js +2 -0
- package/packages/passport/lib/index.js.map +1 -0
- package/packages/passport/package.json +1 -1
- package/packages/ssr/lib/firebase/serve-feeds.js +8 -0
- package/packages/ssr/lib/firebase/serve-feeds.js.map +1 -0
- package/packages/ssr/lib/firebase/serve-storefront.js +50 -0
- package/packages/ssr/lib/firebase/serve-storefront.js.map +1 -0
- package/packages/ssr/lib/firebase.js +23 -0
- package/packages/ssr/lib/firebase.js.map +1 -0
- package/packages/ssr/lib/index.js +4 -0
- package/packages/ssr/lib/index.js.map +1 -0
- package/packages/ssr/package.json +1 -1
- package/packages/storefront/astro.config.mjs +2 -1
- package/packages/storefront/dist/client/HeaderButtons.75084c8f.js +1 -0
- package/packages/storefront/dist/client/admin/config.json +1 -0
- package/packages/storefront/dist/client/assets/_...slug_.5d8e6131.css +4 -0
- package/packages/storefront/dist/client/assets/cms-preview.css +274 -0
- package/packages/storefront/dist/client/assets/cms.css +114 -0
- package/packages/storefront/dist/client/assets/cvv.png +0 -0
- package/packages/storefront/dist/client/assets/icons/bootstrap-icons/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/dist/client/assets/icons/feather-icons/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/dist/client/assets/icons/font-awesome/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/dist/client/assets/icons/line-awesome/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/dist/client/assets/icons/tabler-icons/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/dist/client/assets/img-placeholder.png +0 -0
- package/packages/storefront/dist/client/assets/payments.png +0 -0
- package/packages/storefront/dist/client/assets/ssl-safe.png +0 -0
- package/packages/storefront/dist/client/chunks/HeaderButtons.d1f8a21f.js +1 -0
- package/packages/storefront/dist/client/chunks/LoginForm.e02dee3d.js +1441 -0
- package/packages/storefront/dist/client/chunks/preload-helper.f15ab524.js +1 -0
- package/packages/storefront/dist/client/chunks/runtime-dom.esm-bundler.9119f0ff.js +1 -0
- package/packages/storefront/dist/client/chunks/workbox-window.prod.es5.10f2e5ac.js +2 -0
- package/packages/storefront/dist/client/client.671d7334.js +1 -0
- package/packages/storefront/dist/client/hoisted.3f1cf839.js +1 -0
- package/packages/storefront/dist/client/img/icon.png +0 -0
- package/packages/storefront/dist/client/img/large-icon.png +0 -0
- package/packages/storefront/dist/client/img/uploads/banner1.png +0 -0
- package/packages/storefront/dist/client/img/uploads/banner2.png +0 -0
- package/packages/storefront/dist/client/img/uploads/banner2.webp +0 -0
- package/packages/storefront/dist/client/img/uploads/favicon.png +0 -0
- package/packages/storefront/dist/client/img/uploads/headless.png +0 -0
- package/packages/storefront/dist/client/img/uploads/headphone.png +0 -0
- package/packages/storefront/dist/client/img/uploads/headphone.webp +0 -0
- package/packages/storefront/dist/client/img/uploads/icon.png +0 -0
- package/packages/storefront/dist/client/img/uploads/large-icon.png +0 -0
- package/packages/storefront/dist/client/img/uploads/logo.png +0 -0
- package/packages/storefront/dist/client/img/uploads/logo.webp +0 -0
- package/packages/storefront/dist/client/img/uploads/og-image.png +0 -0
- package/packages/storefront/dist/client/img/uploads/passion.png +0 -0
- package/packages/storefront/dist/client/img/uploads/passion.webp +0 -0
- package/packages/storefront/dist/client/img/uploads/pwa-reliable.png +0 -0
- package/packages/storefront/dist/client/img/uploads/rect8589.png +0 -0
- package/packages/storefront/dist/client/img/uploads/rect859.png +0 -0
- package/packages/storefront/dist/client/img/uploads/rect89.png +0 -0
- package/packages/storefront/dist/client/img/uploads/rect89.webp +0 -0
- package/packages/storefront/dist/client/img/uploads/ssl-safe.png +0 -0
- package/packages/storefront/dist/client/manifest.webmanifest +1 -0
- package/packages/storefront/dist/client/page.b906f867.js +1 -0
- package/packages/storefront/dist/client/robots.txt +8 -0
- package/packages/storefront/dist/client/sw.js +1 -0
- package/packages/storefront/dist/client/workbox-abdc68aa.js +1 -0
- package/packages/storefront/dist/client/~partytown/partytown-atomics.js +2 -0
- package/packages/storefront/dist/client/~partytown/partytown-media.js +2 -0
- package/packages/storefront/dist/client/~partytown/partytown-sw.js +2 -0
- package/packages/storefront/dist/client/~partytown/partytown.js +2 -0
- package/packages/storefront/dist/server/avif/avif_node_dec.wasm +0 -0
- package/packages/storefront/dist/server/avif/avif_node_enc.wasm +0 -0
- package/packages/storefront/dist/server/entry.mjs +17062 -0
- package/packages/storefront/dist/server/manifest.webmanifest +1 -0
- package/packages/storefront/dist/server/mozjpeg/mozjpeg_node_dec.wasm +0 -0
- package/packages/storefront/dist/server/mozjpeg/mozjpeg_node_enc.wasm +0 -0
- package/packages/storefront/dist/server/png/squoosh_oxipng_bg.wasm +0 -0
- package/packages/storefront/dist/server/png/squoosh_png_bg.wasm +0 -0
- package/packages/storefront/dist/server/registerSW.js +1 -0
- package/packages/storefront/dist/server/resize/squoosh_resize_bg.wasm +0 -0
- package/packages/storefront/dist/server/rotate/rotate.wasm +0 -0
- package/packages/storefront/dist/server/webp/webp_node_dec.wasm +0 -0
- package/packages/storefront/dist/server/webp/webp_node_enc.wasm +0 -0
- package/packages/storefront/package.json +1 -1
- package/packages/types/package.json +1 -1
|
@@ -5,125 +5,126 @@ import { PubSub } from '@google-cloud/pubsub';
|
|
|
5
5
|
import api from '@cloudcommerce/api';
|
|
6
6
|
import config from '../config.js';
|
|
7
7
|
import { EVENT_SKIP_FLAG, GET_PUBSUB_TOPIC } from '../const.js';
|
|
8
|
+
|
|
8
9
|
const parseEventName = (evName, baseApiEventsFilter) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
];
|
|
38
|
-
}
|
|
39
|
-
break;
|
|
40
|
-
case 'products':
|
|
41
|
-
params.modified_fields = actionName === 'priceSet'
|
|
42
|
-
? ['price', 'variations.price']
|
|
43
|
-
: ['quantity']; // quantitySet
|
|
44
|
-
break;
|
|
45
|
-
case 'carts':
|
|
46
|
-
params.modified_fields = ['customers']; // customerSet
|
|
47
|
-
break;
|
|
48
|
-
case 'applications':
|
|
49
|
-
params.modified_fields = ['data', 'hidden_data']; // dataSet
|
|
50
|
-
break;
|
|
51
|
-
default:
|
|
10
|
+
const [resource, actionName] = evName.split('-');
|
|
11
|
+
const params = { ...baseApiEventsFilter };
|
|
12
|
+
const bodySet = {};
|
|
13
|
+
if (actionName === 'new') {
|
|
14
|
+
params.action = 'create';
|
|
15
|
+
} else {
|
|
16
|
+
switch (resource) {
|
|
17
|
+
case 'orders':
|
|
18
|
+
switch (actionName) {
|
|
19
|
+
case 'paid':
|
|
20
|
+
bodySet['financial_status.current'] = 'paid';
|
|
21
|
+
break;
|
|
22
|
+
case 'readyForShipping':
|
|
23
|
+
bodySet['fulfillment_status.current'] = 'ready_for_shipping';
|
|
24
|
+
break;
|
|
25
|
+
case 'shipped':
|
|
26
|
+
case 'delivered':
|
|
27
|
+
bodySet['fulfillment_status.current'] = actionName;
|
|
28
|
+
break;
|
|
29
|
+
case 'cancelled':
|
|
30
|
+
bodySet.status = 'cancelled';
|
|
31
|
+
break;
|
|
32
|
+
default: // anyStatusSet
|
|
33
|
+
params.modified_fields = [
|
|
34
|
+
'financial_status',
|
|
35
|
+
'fulfillment_status',
|
|
36
|
+
'status',
|
|
37
|
+
];
|
|
52
38
|
}
|
|
39
|
+
break;
|
|
40
|
+
case 'products':
|
|
41
|
+
params.modified_fields = actionName === 'priceSet'
|
|
42
|
+
? ['price', 'variations.price']
|
|
43
|
+
: ['quantity']; // quantitySet
|
|
44
|
+
break;
|
|
45
|
+
case 'carts':
|
|
46
|
+
params.modified_fields = ['customers']; // customerSet
|
|
47
|
+
break;
|
|
48
|
+
case 'applications':
|
|
49
|
+
params.modified_fields = ['data', 'hidden_data']; // dataSet
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
53
52
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
53
|
+
}
|
|
54
|
+
Object.keys(bodySet).forEach((field) => {
|
|
55
|
+
params[`body.${field}`] = bodySet[field];
|
|
56
|
+
});
|
|
57
|
+
return { resource, params };
|
|
58
58
|
};
|
|
59
59
|
const pubSubClient = new PubSub();
|
|
60
60
|
const tryPubSubPublish = (topicName, messageObj, retries = 0) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
61
|
+
pubSubClient.topic(topicName).publishMessage(messageObj)
|
|
62
|
+
.catch((err) => {
|
|
63
|
+
// eslint-disable-next-line no-param-reassign
|
|
64
|
+
err.retries = retries;
|
|
65
|
+
logger.error(err);
|
|
66
|
+
if (retries <= 3) {
|
|
67
|
+
setTimeout(() => {
|
|
68
|
+
tryPubSubPublish(topicName, messageObj, retries + 1);
|
|
69
|
+
}, 1000 * (2 ** retries));
|
|
70
|
+
}
|
|
71
71
|
});
|
|
72
72
|
};
|
|
73
|
+
|
|
73
74
|
export default async () => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
const timestamp = Date.now();
|
|
76
|
+
const documentRef = getFirestore().doc('storeEvents/last');
|
|
77
|
+
const documentSnapshot = await documentRef.get();
|
|
78
|
+
const lastRunTimestamp = documentSnapshot.get('timestamp')
|
|
78
79
|
|| Date.now() - 1000 * 60 * 5;
|
|
79
|
-
|
|
80
|
+
const lastNonOrdersTimestamp = documentSnapshot.get('nonOrdersTimestamp')
|
|
80
81
|
|| 0;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
});
|
|
82
|
+
const baseApiEventsFilter = {
|
|
83
|
+
'flag!': EVENT_SKIP_FLAG,
|
|
84
|
+
'timestamp>': new Date(lastRunTimestamp - 1).toISOString(),
|
|
85
|
+
'timestamp<': new Date(timestamp).toISOString(),
|
|
86
|
+
};
|
|
87
|
+
const { apps } = config.get();
|
|
88
|
+
const subscribersApps = [];
|
|
89
|
+
Object.keys(apps).forEach((appName) => {
|
|
90
|
+
const appObj = apps[appName];
|
|
91
|
+
if (appObj.events && appObj.events.length) {
|
|
92
|
+
subscribersApps.push(appObj);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
const activeApps = (await api.get('applications', {
|
|
96
|
+
params: {
|
|
97
|
+
state: 'active',
|
|
98
|
+
app_id: subscribersApps.map(({ appId }) => appId),
|
|
99
|
+
fields: '_id,app_id,data,hidden_data',
|
|
100
|
+
},
|
|
101
|
+
})).data.result;
|
|
102
|
+
const listenedEvents = [];
|
|
103
|
+
subscribersApps.forEach(({ appId, events }) => {
|
|
104
|
+
if (activeApps.find((app) => app.app_id === appId)) {
|
|
105
|
+
events.forEach((evName) => {
|
|
106
|
+
if (!listenedEvents.includes(evName)) {
|
|
107
|
+
listenedEvents.push(evName);
|
|
109
108
|
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// Some resource events are not listened to every minute
|
|
113
|
+
const isOrdersOnly = Boolean(new Date().getMinutes() % 5);
|
|
114
|
+
listenedEvents.forEach(async (listenedEventName) => {
|
|
115
|
+
const { resource, params } = parseEventName(listenedEventName, baseApiEventsFilter);
|
|
116
|
+
if (resource !== 'orders') {
|
|
117
|
+
if (isOrdersOnly) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (lastNonOrdersTimestamp) {
|
|
121
|
+
params['timestamp>'] = new Date(lastNonOrdersTimestamp).toISOString();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
let { data: { result } } = await api.get(`events/${resource}`, {
|
|
125
|
+
params,
|
|
110
126
|
});
|
|
111
|
-
|
|
112
|
-
const isOrdersOnly = Boolean(new Date().getMinutes() % 5);
|
|
113
|
-
listenedEvents.forEach(async (listenedEventName) => {
|
|
114
|
-
const { resource, params } = parseEventName(listenedEventName, baseApiEventsFilter);
|
|
115
|
-
if (resource !== 'orders') {
|
|
116
|
-
if (isOrdersOnly) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (lastNonOrdersTimestamp) {
|
|
120
|
-
params['timestamp>'] = new Date(lastNonOrdersTimestamp).toISOString();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
let { data: { result } } = await api.get(`events/${resource}`, {
|
|
124
|
-
params,
|
|
125
|
-
});
|
|
126
|
-
/*
|
|
127
|
+
/*
|
|
127
128
|
global.api_events_middleware = async (
|
|
128
129
|
resource: string,
|
|
129
130
|
result: EventsResult,
|
|
@@ -134,45 +135,45 @@ export default async () => {
|
|
|
134
135
|
return result;
|
|
135
136
|
};
|
|
136
137
|
*/
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
const middleware = global.api_events_middleware;
|
|
139
|
+
if (typeof middleware === 'function') {
|
|
140
|
+
result = await middleware(resource, result);
|
|
141
|
+
}
|
|
142
|
+
const resourceIdsRead = [];
|
|
143
|
+
result.forEach(async (apiEvent) => {
|
|
144
|
+
const resourceId = apiEvent.resource_id;
|
|
145
|
+
if (resourceIdsRead.includes(resourceId)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
resourceIdsRead.push(resourceId);
|
|
149
|
+
const apiDoc = resource !== 'applications'
|
|
150
|
+
? (await api.get(`${resource}/${resourceId}`)).data
|
|
151
|
+
: null;
|
|
152
|
+
activeApps.forEach((app) => {
|
|
153
|
+
const appConfig = subscribersApps.find(({ appId }) => appId === app.app_id);
|
|
154
|
+
if (appConfig?.events.includes(listenedEventName)) {
|
|
155
|
+
const topicName = GET_PUBSUB_TOPIC(app.app_id);
|
|
156
|
+
const json = {
|
|
157
|
+
evName: listenedEventName,
|
|
158
|
+
apiEvent,
|
|
159
|
+
apiDoc: apiDoc || app,
|
|
160
|
+
app,
|
|
161
|
+
};
|
|
162
|
+
const messageObj = {
|
|
163
|
+
messageId: `${resourceId}_${apiEvent.timestamp}`,
|
|
164
|
+
json,
|
|
165
|
+
};
|
|
166
|
+
tryPubSubPublish(topicName, messageObj);
|
|
140
167
|
}
|
|
141
|
-
|
|
142
|
-
result.forEach(async (apiEvent) => {
|
|
143
|
-
const resourceId = apiEvent.resource_id;
|
|
144
|
-
if (resourceIdsRead.includes(resourceId)) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
resourceIdsRead.push(resourceId);
|
|
148
|
-
const apiDoc = resource !== 'applications'
|
|
149
|
-
? (await api.get(`${resource}/${resourceId}`)).data
|
|
150
|
-
: null;
|
|
151
|
-
activeApps.forEach((app) => {
|
|
152
|
-
const appConfig = subscribersApps.find(({ appId }) => appId === app.app_id);
|
|
153
|
-
if (appConfig?.events.includes(listenedEventName)) {
|
|
154
|
-
const topicName = GET_PUBSUB_TOPIC(app.app_id);
|
|
155
|
-
const json = {
|
|
156
|
-
evName: listenedEventName,
|
|
157
|
-
apiEvent,
|
|
158
|
-
apiDoc: apiDoc || app,
|
|
159
|
-
app,
|
|
160
|
-
};
|
|
161
|
-
const messageObj = {
|
|
162
|
-
messageId: `${resourceId}_${apiEvent.timestamp}`,
|
|
163
|
-
json,
|
|
164
|
-
};
|
|
165
|
-
tryPubSubPublish(topicName, messageObj);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
logger.info(`> '${listenedEventName}' events: `, result);
|
|
170
|
-
});
|
|
171
|
-
return documentRef.set({
|
|
172
|
-
timestamp,
|
|
173
|
-
nonOrdersTimestamp: isOrdersOnly ? lastNonOrdersTimestamp : timestamp,
|
|
174
|
-
activeApps,
|
|
175
|
-
listenedEvents,
|
|
168
|
+
});
|
|
176
169
|
});
|
|
170
|
+
logger.info(`> '${listenedEventName}' events: `, result);
|
|
171
|
+
});
|
|
172
|
+
return documentRef.set({
|
|
173
|
+
timestamp,
|
|
174
|
+
nonOrdersTimestamp: isOrdersOnly ? lastNonOrdersTimestamp : timestamp,
|
|
175
|
+
activeApps,
|
|
176
|
+
listenedEvents,
|
|
177
|
+
});
|
|
177
178
|
};
|
|
178
|
-
|
|
179
|
+
// # sourceMappingURL=check-store-events.js.map
|
|
@@ -1,30 +1,32 @@
|
|
|
1
1
|
import functions from 'firebase-functions';
|
|
2
2
|
import config from '../config.js';
|
|
3
3
|
import { GET_PUBSUB_TOPIC } from '../const.js';
|
|
4
|
+
|
|
4
5
|
const { logger } = functions;
|
|
5
6
|
/* eslint-enable no-unused-vars */
|
|
6
7
|
const createPubSubFunction = (pubSubTopic, fn, eventMaxAgeMs = 60000) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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);
|
|
16
17
|
});
|
|
17
18
|
};
|
|
18
19
|
const createAppEventsFunction = (appNameOrId, fn, eventMaxAgeMs = 60000) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return createPubSubFunction(GET_PUBSUB_TOPIC(appId), fn, eventMaxAgeMs);
|
|
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
27
|
};
|
|
28
|
+
|
|
28
29
|
export default createPubSubFunction;
|
|
30
|
+
|
|
29
31
|
export { createPubSubFunction, createAppEventsFunction };
|
|
30
|
-
|
|
32
|
+
// # sourceMappingURL=pubsub.js.map
|
|
@@ -2,44 +2,44 @@ import { PubSub } from '@google-cloud/pubsub';
|
|
|
2
2
|
import logger from 'firebase-functions/lib/logger';
|
|
3
3
|
import api from '@cloudcommerce/api';
|
|
4
4
|
import { EVENT_SKIP_FLAG, GET_PUBSUB_TOPIC } from '../const.js';
|
|
5
|
+
|
|
5
6
|
export default async (application, data, { isHiddenData = false, canSendPubSub = true } = {}) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
logger.error(err);
|
|
37
|
-
}
|
|
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);
|
|
38
37
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
38
|
+
}
|
|
39
|
+
return api.patch(`applications/${applicationId}/${subresource}`, data, {
|
|
40
|
+
headers: {
|
|
41
|
+
'X-Event-Flag': EVENT_SKIP_FLAG,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
44
|
};
|
|
45
|
-
|
|
45
|
+
// # sourceMappingURL=update-app-data.js.map
|
|
@@ -3,16 +3,18 @@ import './init.js';
|
|
|
3
3
|
import functions from 'firebase-functions';
|
|
4
4
|
import config from './config.js';
|
|
5
5
|
import checkStoreEvents from './handlers/check-store-events.js';
|
|
6
|
+
|
|
6
7
|
const { httpsFunctionOptions: { region } } = config.get();
|
|
7
8
|
const functionBuilder = functions
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
.region(region)
|
|
10
|
+
.runWith({
|
|
10
11
|
timeoutSeconds: 300,
|
|
11
12
|
memory: '128MB',
|
|
12
|
-
});
|
|
13
|
+
});
|
|
14
|
+
|
|
13
15
|
export const cronStoreEvents = functionBuilder.pubsub
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
.schedule('* * * * *')
|
|
17
|
+
.onRun(() => {
|
|
16
18
|
return checkStoreEvents();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
+
});
|
|
20
|
+
// # sourceMappingURL=index.js.map
|
|
@@ -4,5 +4,6 @@ import '@cloudcommerce/api/fetch-polyfill';
|
|
|
4
4
|
// https://github.com/import-js/eslint-plugin-import/issues/1810
|
|
5
5
|
// eslint-disable-next-line import/no-unresolved
|
|
6
6
|
import { initializeApp } from 'firebase-admin/app';
|
|
7
|
+
|
|
7
8
|
initializeApp();
|
|
8
|
-
|
|
9
|
+
// # sourceMappingURL=init.js.map
|
|
@@ -16,6 +16,7 @@ export default (req, res) => {
|
|
|
16
16
|
url = url.slice(0, -5);
|
|
17
17
|
}
|
|
18
18
|
[url] = url.split('?');
|
|
19
|
+
url = url.replace('/api/modules', ''); // due to hosting rewrite
|
|
19
20
|
const modName = url.split('/')[1];
|
|
20
21
|
const sendSchema = (isResponseSchema = false) => {
|
|
21
22
|
return res.status(200)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-modules-api.js","sourceRoot":"","sources":["../../src/firebase/serve-modules-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serve-modules-api.js","sourceRoot":"","sources":["../../src/firebase/serve-modules-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAC3C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE;QACzC,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;KAC5B;IACD,IACE,MAAM,KAAK,MAAM;WACd,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EACzE;QACA,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;KAC5B;IAED,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,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,yBAAyB;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,MAAM,UAAU,GAAG,CAAC,gBAAgB,GAAG,KAAK,EAAE,EAAE;QAC9C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;aACnB,SAAS,CAAC,eAAe,EAAE,sBAAsB,CAAC;aAClD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,IAAI,OAAO,KAAK,WAAW,EAAE;QAC3B,IAAI,GAAG,KAAK,YAAY,EAAE;YACxB,IAAI,MAAM,KAAK,KAAK,EAAE;gBACpB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;qBACnB,IAAI,CAAC;oBACJ,UAAU,EAAE,QAAQ;oBACpB,OAAO,EAAE,6DAA6D;iBACvE,CAAC,CAAC;aACN;YACD,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SAC3B;QACD,IAAI,GAAG,KAAK,mBAAmB,EAAE;YAC/B,OAAO,UAAU,EAAE,CAAC;SACrB;QACD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;KAC5B;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACpB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,MAAM,CAAC,OAAO,GAAG,yCAAyC,CAAC;YAC3D,MAAM,CAAC,KAAK,GAAG,YAAY,OAAO,kBAAkB,CAAC;SACtD;QACD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YAC3B,cAAc,CAAC,OAAO,GAAG,yCAAyC,CAAC;YACnE,cAAc,CAAC,KAAK,GAAG,YAAY,OAAO,wBAAwB,CAAC;SACpE;QACD,IAAI,GAAG,KAAK,IAAI,OAAO,SAAS,EAAE;YAChC,OAAO,UAAU,EAAE,CAAC;SACrB;QACD,IAAI,GAAG,KAAK,IAAI,OAAO,kBAAkB,EAAE;YACzC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;SACzB;QACD,IAAI,GAAG,KAAK,IAAI,OAAO,EAAE,EAAE;YACzB,OAAO,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;SAC1E;KACF;IACD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-unresolved
|
|
2
|
+
import { getFirestore } from 'firebase-admin/firestore';
|
|
3
|
+
// eslint-disable-next-line import/no-unresolved
|
|
4
|
+
import { getAuth } from 'firebase-admin/auth';
|
|
5
|
+
import { logger } from 'firebase-functions';
|
|
6
|
+
import api from '@cloudcommerce/api';
|
|
7
|
+
import getEnv from '@cloudcommerce/firebase/lib/env';
|
|
8
|
+
|
|
9
|
+
const findCustomerByEmail = async (email, isOnlyId = true) => {
|
|
10
|
+
let params = `main_email=${email}`;
|
|
11
|
+
if (isOnlyId) {
|
|
12
|
+
params += '&fields=_id';
|
|
13
|
+
}
|
|
14
|
+
const { data } = await api.get(`customers?${params}`);
|
|
15
|
+
if (data.result.length) {
|
|
16
|
+
return data.result[0];
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
};
|
|
20
|
+
const generateAccessToken = async (customerId) => {
|
|
21
|
+
const { apiAuth } = getEnv();
|
|
22
|
+
const { data } = await api({
|
|
23
|
+
endpoint: 'authenticate',
|
|
24
|
+
method: 'post',
|
|
25
|
+
body: {
|
|
26
|
+
_id: apiAuth.authenticationId,
|
|
27
|
+
api_key: apiAuth.apiKey,
|
|
28
|
+
customer_id: customerId,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
access_token: data.access_token,
|
|
33
|
+
expires: data.expires,
|
|
34
|
+
customer_id: customerId,
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
const checkFirebaseAuth = async (authToken) => {
|
|
38
|
+
const firebaseAuth = getAuth();
|
|
39
|
+
try {
|
|
40
|
+
const firebaseAuthUser = await firebaseAuth.verifyIdToken(authToken);
|
|
41
|
+
return firebaseAuthUser;
|
|
42
|
+
} catch (err) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const authenticateCustomer = async (firebaseAuthToken) => {
|
|
47
|
+
const firebaseAuthUser = await checkFirebaseAuth(firebaseAuthToken);
|
|
48
|
+
if (firebaseAuthUser) {
|
|
49
|
+
const { name, email, email_verified: isEmailVerified } = firebaseAuthUser;
|
|
50
|
+
if (email && isEmailVerified) {
|
|
51
|
+
const customerId = (await findCustomerByEmail(email))?._id;
|
|
52
|
+
if (customerId) {
|
|
53
|
+
const docRef = getFirestore().doc(`customerTokens/${customerId}`);
|
|
54
|
+
const storedToken = (await docRef.get()).data();
|
|
55
|
+
const expires = storedToken?.expires;
|
|
56
|
+
if (expires && new Date(expires).getTime() - Date.now() >= 2 * 60 * 1000) {
|
|
57
|
+
return storedToken;
|
|
58
|
+
}
|
|
59
|
+
const customerToken = generateAccessToken(customerId);
|
|
60
|
+
docRef.set(customerToken).catch(logger.error);
|
|
61
|
+
return customerToken;
|
|
62
|
+
}
|
|
63
|
+
const { data: newCustomer } = await api.post('customers', {
|
|
64
|
+
display_name: name || '',
|
|
65
|
+
main_email: email,
|
|
66
|
+
emails: [{
|
|
67
|
+
address: email,
|
|
68
|
+
verified: isEmailVerified,
|
|
69
|
+
}],
|
|
70
|
+
});
|
|
71
|
+
return generateAccessToken(newCustomer._id);
|
|
72
|
+
}
|
|
73
|
+
// TODO: Find customer by phone number, generate token if found, otherwise unauthorize
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export default authenticateCustomer;
|
|
79
|
+
|
|
80
|
+
export { findCustomerByEmail, generateAccessToken };
|
|
81
|
+
// # sourceMappingURL=authenticate-customer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authenticate-customer.js","sourceRoot":"","sources":["../../src/firebase/authenticate-customer.ts"],"names":[],"mappings":"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"}
|