cloudcommerce 0.0.59 → 0.0.62
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/.eslintrc.cjs +2 -0
- package/CHANGELOG.md +42 -0
- package/action.yml +6 -1
- package/package.json +9 -8
- package/packages/api/lib/api.d.ts +5036 -0
- package/packages/api/lib/{index.js → api.js} +16 -10
- package/packages/api/lib/api.js.map +1 -0
- package/packages/api/lib/types.d.ts +1 -0
- package/packages/api/package.json +3 -3
- package/packages/api/src/{index.ts → api.ts} +21 -17
- package/packages/api/src/types.ts +1 -0
- package/packages/api/tests/index.test.ts +2 -2
- package/packages/apps/discounts/lib/discounts.js +1 -1
- package/packages/apps/discounts/lib/discounts.js.map +1 -1
- package/packages/apps/discounts/{lib-cjs/apply-discount.cjs → lib-mjs/apply-discount.mjs} +7 -9
- package/packages/apps/discounts/{lib-cjs/helpers.cjs → lib-mjs/helpers.mjs} +2 -2
- package/packages/apps/discounts/package.json +1 -1
- package/packages/apps/discounts/src/discounts.ts +1 -1
- package/packages/apps/tiny-erp/lib/event-to-tiny.js +117 -0
- package/packages/apps/tiny-erp/lib/event-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/index.js +2 -0
- package/packages/apps/tiny-erp/lib/index.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js +79 -0
- package/packages/apps/tiny-erp/lib/integration/after-tiny-queue.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js +81 -0
- package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js +58 -0
- package/packages/apps/tiny-erp/lib/integration/export-product-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js +7 -0
- package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js +92 -0
- package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js +158 -0
- package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js +46 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js +193 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js +199 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js +129 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js +34 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-from-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js +39 -0
- package/packages/apps/tiny-erp/lib/integration/parsers/status-to-tiny.js.map +1 -0
- package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js +47 -0
- package/packages/apps/tiny-erp/lib/integration/post-tiny-erp.js.map +1 -0
- package/packages/apps/tiny-erp/lib/tiny-erp.js +17 -0
- package/packages/apps/tiny-erp/lib/tiny-erp.js.map +1 -0
- package/packages/apps/tiny-erp/lib/tiny-webhook.js +92 -0
- package/packages/apps/tiny-erp/lib/tiny-webhook.js.map +1 -0
- package/packages/apps/tiny-erp/package.json +13 -6
- package/packages/apps/tiny-erp/src/event-to-tiny.ts +136 -0
- package/packages/apps/tiny-erp/src/index.ts +1 -0
- package/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts +80 -0
- package/packages/apps/tiny-erp/src/integration/export-order-to-tiny.ts +86 -0
- package/packages/apps/tiny-erp/src/integration/export-product-to-tiny.ts +60 -0
- package/packages/apps/tiny-erp/src/integration/helpers/format-tiny-date.ts +6 -0
- package/packages/apps/tiny-erp/src/integration/import-order-from-tiny.ts +102 -0
- package/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts +162 -0
- package/packages/apps/tiny-erp/src/integration/parsers/order-from-tiny.ts +49 -0
- package/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts +205 -0
- package/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts +215 -0
- package/packages/apps/tiny-erp/src/integration/parsers/product-to-tiny.ts +138 -0
- package/packages/apps/tiny-erp/src/integration/parsers/status-from-tiny.ts +35 -0
- package/packages/apps/tiny-erp/src/integration/parsers/status-to-tiny.ts +42 -0
- package/packages/apps/tiny-erp/src/integration/post-tiny-erp.ts +52 -0
- package/packages/apps/tiny-erp/src/tiny-erp.ts +23 -0
- package/packages/apps/tiny-erp/src/tiny-webhook.ts +100 -0
- package/packages/cli/package.json +1 -1
- package/packages/events/lib/firebase.js +2 -26
- package/packages/events/lib/firebase.js.map +1 -1
- package/packages/events/lib/index.js +1 -1
- package/packages/events/lib/index.js.map +1 -1
- package/packages/events/package.json +1 -1
- package/packages/events/src/firebase.ts +2 -28
- package/packages/events/src/index.ts +1 -1
- package/packages/firebase/lib/config.d.ts +2 -2
- package/packages/firebase/lib/config.js +7 -5
- package/packages/firebase/lib/config.js.map +1 -1
- package/packages/firebase/lib/const.d.ts +2 -0
- package/packages/firebase/lib/const.js +6 -0
- package/packages/firebase/lib/const.js.map +1 -0
- package/packages/firebase/lib/handlers/check-store-events.js +50 -27
- package/packages/firebase/lib/handlers/check-store-events.js.map +1 -1
- package/packages/firebase/lib/helpers/pubsub.d.ts +9 -0
- package/packages/firebase/lib/helpers/pubsub.js +32 -0
- package/packages/firebase/lib/helpers/pubsub.js.map +1 -0
- package/packages/firebase/lib/helpers/update-app-data.d.ts +9 -0
- package/packages/firebase/lib/helpers/update-app-data.js +45 -0
- package/packages/firebase/lib/helpers/update-app-data.js.map +1 -0
- package/packages/firebase/lib/index.d.ts +1 -2
- package/packages/firebase/lib/index.js +1 -6
- package/packages/firebase/lib/index.js.map +1 -1
- package/packages/firebase/lib/init.d.ts +2 -0
- package/packages/firebase/lib/init.js +9 -0
- package/packages/firebase/lib/init.js.map +1 -0
- package/packages/firebase/package.json +5 -2
- package/packages/firebase/src/config.ts +9 -6
- package/packages/firebase/src/const.ts +5 -0
- package/packages/firebase/src/handlers/check-store-events.ts +56 -33
- package/packages/firebase/src/helpers/pubsub.ts +52 -0
- package/packages/firebase/src/helpers/update-app-data.ts +49 -0
- package/packages/firebase/src/index.ts +1 -7
- package/packages/firebase/src/init.ts +9 -0
- package/packages/modules/lib/firebase/handle-module.js +4 -5
- package/packages/modules/lib/firebase/handle-module.js.map +1 -1
- package/packages/modules/lib/firebase/serve-modules-api.js +2 -2
- package/packages/modules/lib/firebase/serve-modules-api.js.map +1 -1
- package/packages/modules/lib/firebase.js +2 -7
- package/packages/modules/lib/firebase.js.map +1 -1
- package/packages/modules/package.json +1 -1
- package/packages/modules/src/firebase/handle-module.ts +2 -5
- package/packages/modules/src/firebase/serve-modules-api.ts +2 -6
- package/packages/modules/src/firebase.ts +2 -7
- package/packages/passport/lib/firebase/handle-passport.js +12 -10
- package/packages/passport/lib/firebase/handle-passport.js.map +1 -1
- package/packages/passport/lib/firebase/serve-passport-api.js +2 -2
- package/packages/passport/lib/firebase/serve-passport-api.js.map +1 -1
- package/packages/passport/lib/firebase.js +2 -7
- package/packages/passport/lib/firebase.js.map +1 -1
- package/packages/passport/package.json +1 -1
- package/packages/passport/src/firebase/handle-passport.ts +10 -19
- package/packages/passport/src/firebase/serve-passport-api.ts +0 -2
- package/packages/passport/src/firebase.ts +1 -7
- package/packages/ssr/lib/firebase.js +1 -4
- package/packages/ssr/lib/firebase.js.map +1 -1
- package/packages/ssr/package.json +1 -1
- package/packages/ssr/src/firebase.ts +1 -4
- package/packages/storefront/package.json +4 -4
- package/packages/types/index.ts +18 -3
- package/packages/types/package.json +1 -1
- package/packages/api/lib/index.d.ts +0 -9974
- package/packages/api/lib/index.js.map +0 -1
- package/packages/apps/tiny-erp/src/firebase.ts +0 -0
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcommerce/firebase",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.62",
|
|
5
5
|
"description": "E-Com Plus Cloud Commerce on Firebase",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "lib/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": "./lib/index.js",
|
|
10
10
|
"./config": "./config.js",
|
|
11
|
+
"./lib/init": "./lib/init.js",
|
|
11
12
|
"./lib/config": "./lib/config.js",
|
|
12
|
-
"./lib/env": "./lib/env.js"
|
|
13
|
+
"./lib/env": "./lib/env.js",
|
|
14
|
+
"./lib/helpers/pubsub": "./lib/helpers/pubsub.js",
|
|
15
|
+
"./lib/helpers/update-app-data": "./lib/helpers/update-app-data.js"
|
|
13
16
|
},
|
|
14
17
|
"repository": {
|
|
15
18
|
"type": "git",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ApiEventName } from '@cloudcommerce/types';
|
|
2
2
|
import Deepmerge from '@fastify/deepmerge';
|
|
3
3
|
import {
|
|
4
4
|
DEFAULT_LANG,
|
|
@@ -14,6 +14,13 @@ const env: { [key: string]: string } = (typeof process === 'object' && process?.
|
|
|
14
14
|
|
|
15
15
|
const deepmerge = Deepmerge();
|
|
16
16
|
|
|
17
|
+
const tinyErpEvents: ApiEventName[] = [
|
|
18
|
+
'orders-anyStatusSet',
|
|
19
|
+
'products-new',
|
|
20
|
+
'products-priceSet',
|
|
21
|
+
'applications-dataSet',
|
|
22
|
+
];
|
|
23
|
+
|
|
17
24
|
const self = {
|
|
18
25
|
__config: {
|
|
19
26
|
hello: 'from @cloudcommerce/firebase',
|
|
@@ -31,11 +38,7 @@ const self = {
|
|
|
31
38
|
},
|
|
32
39
|
tinyErp: {
|
|
33
40
|
appId: 105922,
|
|
34
|
-
events:
|
|
35
|
-
'orders-anyStatusSet',
|
|
36
|
-
'products-new',
|
|
37
|
-
'products-priceSet',
|
|
38
|
-
] as AppEventsTopic[],
|
|
41
|
+
events: tinyErpEvents,
|
|
39
42
|
},
|
|
40
43
|
},
|
|
41
44
|
},
|
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
import type { Resource,
|
|
1
|
+
import type { Resource, ApiEventName, AppEventsPayload } from '@cloudcommerce/types';
|
|
2
2
|
// eslint-disable-next-line import/no-unresolved
|
|
3
3
|
import { getFirestore } from 'firebase-admin/firestore';
|
|
4
4
|
import logger from 'firebase-functions/lib/logger';
|
|
5
5
|
import { PubSub } from '@google-cloud/pubsub';
|
|
6
6
|
import api, { ApiConfig } from '@cloudcommerce/api';
|
|
7
|
-
import getEnv from '../env';
|
|
8
7
|
import config from '../config';
|
|
8
|
+
import { EVENT_SKIP_FLAG, GET_PUBSUB_TOPIC } from '../const';
|
|
9
9
|
|
|
10
|
-
const
|
|
11
|
-
|
|
10
|
+
const parseEventName = (
|
|
11
|
+
evName: ApiEventName,
|
|
12
12
|
baseApiEventsFilter: Record<string, string>,
|
|
13
13
|
) => {
|
|
14
|
-
const [resource,
|
|
15
|
-
const params: ApiConfig['params'] = {
|
|
14
|
+
const [resource, actionName] = evName.split('-');
|
|
15
|
+
const params: ApiConfig['params'] = {
|
|
16
|
+
'flag!': EVENT_SKIP_FLAG,
|
|
17
|
+
};
|
|
16
18
|
const bodySet: { [key: string]: any } = { ...baseApiEventsFilter };
|
|
17
|
-
if (
|
|
19
|
+
if (actionName === 'new') {
|
|
18
20
|
params.action = 'create';
|
|
19
21
|
} else {
|
|
20
22
|
switch (resource) {
|
|
21
23
|
case 'orders':
|
|
22
|
-
switch (
|
|
24
|
+
switch (actionName) {
|
|
23
25
|
case 'paid':
|
|
24
26
|
bodySet['financial_status.current'] = 'paid';
|
|
25
27
|
break;
|
|
@@ -28,7 +30,7 @@ const parseEventsTopic = (
|
|
|
28
30
|
break;
|
|
29
31
|
case 'shipped':
|
|
30
32
|
case 'delivered':
|
|
31
|
-
bodySet['fulfillment_status.current'] =
|
|
33
|
+
bodySet['fulfillment_status.current'] = actionName;
|
|
32
34
|
break;
|
|
33
35
|
case 'cancelled':
|
|
34
36
|
bodySet.status = 'cancelled';
|
|
@@ -42,13 +44,16 @@ const parseEventsTopic = (
|
|
|
42
44
|
}
|
|
43
45
|
break;
|
|
44
46
|
case 'products':
|
|
45
|
-
params.modified_fields =
|
|
47
|
+
params.modified_fields = actionName === 'priceSet'
|
|
46
48
|
? ['price', 'variations.price']
|
|
47
49
|
: ['quantity']; // quantitySet
|
|
48
50
|
break;
|
|
49
51
|
case 'carts':
|
|
50
52
|
params.modified_fields = ['customers']; // customerSet
|
|
51
53
|
break;
|
|
54
|
+
case 'applications':
|
|
55
|
+
params.modified_fields = ['data', 'hidden_data']; // dataSet
|
|
56
|
+
break;
|
|
52
57
|
default:
|
|
53
58
|
}
|
|
54
59
|
}
|
|
@@ -56,8 +61,8 @@ const parseEventsTopic = (
|
|
|
56
61
|
params[`body.${field}`] = bodySet[field];
|
|
57
62
|
});
|
|
58
63
|
return { resource, params } as {
|
|
59
|
-
resource: Resource
|
|
60
|
-
params: ApiConfig['params']
|
|
64
|
+
resource: Resource,
|
|
65
|
+
params: ApiConfig['params'],
|
|
61
66
|
};
|
|
62
67
|
};
|
|
63
68
|
|
|
@@ -90,35 +95,37 @@ export default async () => {
|
|
|
90
95
|
'timestamp<': new Date(timestamp).toISOString(),
|
|
91
96
|
};
|
|
92
97
|
const { apps } = config.get();
|
|
93
|
-
const {
|
|
94
|
-
const subscribersApps: Array<{ appId: number, events: AppEventsTopic[] }> = [];
|
|
98
|
+
const subscribersApps: Array<{ appId: number, events: ApiEventName[] }> = [];
|
|
95
99
|
Object.keys(apps).forEach((appName) => {
|
|
96
100
|
const appObj = apps[appName];
|
|
97
101
|
if (appObj.events && appObj.events.length) {
|
|
98
102
|
subscribersApps.push(appObj);
|
|
99
103
|
}
|
|
100
104
|
});
|
|
101
|
-
const
|
|
105
|
+
const activeApps = (await api.get('applications', {
|
|
102
106
|
params: {
|
|
103
107
|
state: 'active',
|
|
104
108
|
app_id: subscribersApps.map(({ appId }) => appId),
|
|
105
|
-
fields: 'app_id',
|
|
109
|
+
fields: '_id,app_id,data,hidden_data',
|
|
106
110
|
},
|
|
107
|
-
})).data.result
|
|
108
|
-
const listenedEvents:
|
|
111
|
+
})).data.result as Array<AppEventsPayload['app']>;
|
|
112
|
+
const listenedEvents: ApiEventName[] = [];
|
|
109
113
|
subscribersApps.forEach(({ appId, events }) => {
|
|
110
|
-
if (
|
|
111
|
-
events.forEach((
|
|
112
|
-
if (!listenedEvents.includes(
|
|
113
|
-
listenedEvents.push(
|
|
114
|
+
if (activeApps.find((app) => app.app_id === appId)) {
|
|
115
|
+
events.forEach((evName) => {
|
|
116
|
+
if (!listenedEvents.includes(evName)) {
|
|
117
|
+
listenedEvents.push(evName);
|
|
114
118
|
}
|
|
115
119
|
});
|
|
116
120
|
}
|
|
117
121
|
});
|
|
118
|
-
listenedEvents.forEach(async (
|
|
119
|
-
const { resource, params } =
|
|
122
|
+
listenedEvents.forEach(async (listenedEventName) => {
|
|
123
|
+
const { resource, params } = parseEventName(listenedEventName, baseApiEventsFilter);
|
|
124
|
+
if (resource !== 'orders' && resource !== 'carts' && new Date().getMinutes() % 5) {
|
|
125
|
+
// Other resource events are not listened to every minute
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
120
128
|
let { data: { result } } = await api.get(`events/${resource}`, {
|
|
121
|
-
...apiAuth,
|
|
122
129
|
params,
|
|
123
130
|
});
|
|
124
131
|
/*
|
|
@@ -136,23 +143,39 @@ export default async () => {
|
|
|
136
143
|
if (typeof middleware === 'function') {
|
|
137
144
|
result = await middleware(resource, result);
|
|
138
145
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
146
|
+
const resourceIdsRead: string[] = [];
|
|
147
|
+
result.forEach(async (apiEvent) => {
|
|
148
|
+
const resourceId = apiEvent.resource_id;
|
|
149
|
+
if (resourceIdsRead.includes(resourceId)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
resourceIdsRead.push(resourceId);
|
|
153
|
+
const apiDoc = resource !== 'applications'
|
|
154
|
+
? (await api.get(`${resource}/${resourceId}`)).data
|
|
155
|
+
: null;
|
|
156
|
+
activeApps.forEach((app) => {
|
|
157
|
+
const appConfig = subscribersApps.find(({ appId }) => appId === app.app_id);
|
|
158
|
+
if (appConfig?.events.includes(listenedEventName)) {
|
|
159
|
+
const topicName = GET_PUBSUB_TOPIC(app.app_id);
|
|
160
|
+
const json: AppEventsPayload = {
|
|
161
|
+
evName: listenedEventName,
|
|
162
|
+
apiEvent,
|
|
163
|
+
apiDoc: apiDoc || app,
|
|
164
|
+
app,
|
|
165
|
+
};
|
|
143
166
|
const messageObj = {
|
|
144
|
-
messageId: `${
|
|
145
|
-
json
|
|
167
|
+
messageId: `${resourceId}_${apiEvent.timestamp}`,
|
|
168
|
+
json,
|
|
146
169
|
};
|
|
147
170
|
tryPubSubPublish(topicName, messageObj);
|
|
148
171
|
}
|
|
149
172
|
});
|
|
150
173
|
});
|
|
151
|
-
logger.info(`> '${
|
|
174
|
+
logger.info(`> '${listenedEventName}' events: `, result);
|
|
152
175
|
});
|
|
153
176
|
return documentRef.set({
|
|
154
177
|
timestamp,
|
|
155
|
-
|
|
178
|
+
activeApps,
|
|
156
179
|
listenedEvents,
|
|
157
180
|
});
|
|
158
181
|
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AppEventsPayload } from '@cloudcommerce/types';
|
|
2
|
+
import functions from 'firebase-functions';
|
|
3
|
+
import config from '../config';
|
|
4
|
+
import { GET_PUBSUB_TOPIC } from '../const';
|
|
5
|
+
|
|
6
|
+
const { logger } = functions;
|
|
7
|
+
|
|
8
|
+
/* eslint-disable no-unused-vars */
|
|
9
|
+
type PubSubHandler<TMessage> = (
|
|
10
|
+
json: TMessage,
|
|
11
|
+
context: functions.EventContext,
|
|
12
|
+
message: functions.pubsub.Message,
|
|
13
|
+
) => void;
|
|
14
|
+
type ApiEventHandler = PubSubHandler<AppEventsPayload>;
|
|
15
|
+
/* eslint-enable no-unused-vars */
|
|
16
|
+
|
|
17
|
+
const createPubSubFunction = (
|
|
18
|
+
pubSubTopic: string,
|
|
19
|
+
fn: PubSubHandler<any>,
|
|
20
|
+
eventMaxAgeMs = 60000,
|
|
21
|
+
) => {
|
|
22
|
+
const { httpsFunctionOptions: { region } } = config.get();
|
|
23
|
+
return functions.region(region)
|
|
24
|
+
.runWith({ failurePolicy: true })
|
|
25
|
+
.pubsub.topic(pubSubTopic).onPublish((message, context) => {
|
|
26
|
+
const eventAgeMs = Date.now() - Date.parse(context.timestamp);
|
|
27
|
+
if (eventAgeMs > eventMaxAgeMs) {
|
|
28
|
+
logger.warn(`Dropping event ${context.eventId} with age[ms]: ${eventAgeMs}`);
|
|
29
|
+
}
|
|
30
|
+
fn(message.json, context, message);
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const createAppEventsFunction = (
|
|
35
|
+
appNameOrId: string | number,
|
|
36
|
+
fn: ApiEventHandler,
|
|
37
|
+
eventMaxAgeMs = 60000,
|
|
38
|
+
) => {
|
|
39
|
+
let appId: number;
|
|
40
|
+
if (typeof appNameOrId === 'string') {
|
|
41
|
+
appId = config.get().apps[appNameOrId].appId;
|
|
42
|
+
} else {
|
|
43
|
+
appId = appNameOrId;
|
|
44
|
+
}
|
|
45
|
+
return createPubSubFunction(GET_PUBSUB_TOPIC(appId), fn, eventMaxAgeMs);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export default createPubSubFunction;
|
|
49
|
+
|
|
50
|
+
export { createPubSubFunction, createAppEventsFunction };
|
|
51
|
+
|
|
52
|
+
export type { PubSubHandler, ApiEventHandler };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Applications, AppEventsPayload } from '@cloudcommerce/types';
|
|
2
|
+
import { PubSub } from '@google-cloud/pubsub';
|
|
3
|
+
import logger from 'firebase-functions/lib/logger';
|
|
4
|
+
import api from '@cloudcommerce/api';
|
|
5
|
+
import { EVENT_SKIP_FLAG, GET_PUBSUB_TOPIC } from '../const';
|
|
6
|
+
|
|
7
|
+
export default async (
|
|
8
|
+
application: Applications | Applications['_id'],
|
|
9
|
+
data: Record<string, any>,
|
|
10
|
+
{ isHiddenData = false, canSendPubSub = true } = {},
|
|
11
|
+
) => {
|
|
12
|
+
const applicationId = typeof application === 'string'
|
|
13
|
+
? application : application._id;
|
|
14
|
+
const subresource = isHiddenData ? 'hidden_data' : 'data';
|
|
15
|
+
if (application && typeof application === 'object' && canSendPubSub) {
|
|
16
|
+
// eslint-disable-next-line no-param-reassign
|
|
17
|
+
application[subresource] = data;
|
|
18
|
+
const json: AppEventsPayload = {
|
|
19
|
+
evName: 'applications-dataSet',
|
|
20
|
+
apiEvent: {
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
resource_id: applicationId,
|
|
23
|
+
action: 'update',
|
|
24
|
+
modified_fields: [subresource],
|
|
25
|
+
authentication_id: null,
|
|
26
|
+
},
|
|
27
|
+
apiDoc: application,
|
|
28
|
+
app: {
|
|
29
|
+
_id: applicationId,
|
|
30
|
+
app_id: application.app_id,
|
|
31
|
+
data: application.data,
|
|
32
|
+
hidden_data: application.hidden_data,
|
|
33
|
+
},
|
|
34
|
+
isInternal: true,
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
await new PubSub()
|
|
38
|
+
.topic(GET_PUBSUB_TOPIC(application.app_id))
|
|
39
|
+
.publishMessage({ json });
|
|
40
|
+
} catch (err) {
|
|
41
|
+
logger.error(err);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return api.patch(`applications/${applicationId}/${subresource}`, data, {
|
|
45
|
+
headers: {
|
|
46
|
+
'X-Event-Flag': EVENT_SKIP_FLAG,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
};
|
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
/* eslint-disable import/prefer-default-export */
|
|
2
2
|
|
|
3
|
-
import '
|
|
4
|
-
import '@cloudcommerce/api/fetch-polyfill.js';
|
|
5
|
-
// https://github.com/import-js/eslint-plugin-import/issues/1810
|
|
6
|
-
// eslint-disable-next-line import/no-unresolved
|
|
7
|
-
import { initializeApp } from 'firebase-admin/app';
|
|
3
|
+
import './init';
|
|
8
4
|
import functions from 'firebase-functions';
|
|
9
5
|
import config from './config';
|
|
10
6
|
import checkStoreEvents from './handlers/check-store-events';
|
|
11
7
|
|
|
12
|
-
initializeApp();
|
|
13
|
-
|
|
14
8
|
const { httpsFunctionOptions: { region } } = config.get();
|
|
15
9
|
|
|
16
10
|
const functionBuilder = functions
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* eslint-disable import/first */
|
|
2
|
+
|
|
3
|
+
import 'source-map-support/register.js';
|
|
4
|
+
import '@cloudcommerce/api/fetch-polyfill.js';
|
|
5
|
+
// https://github.com/import-js/eslint-plugin-import/issues/1810
|
|
6
|
+
// eslint-disable-next-line import/no-unresolved
|
|
7
|
+
import { initializeApp } from 'firebase-admin/app';
|
|
8
|
+
|
|
9
|
+
initializeApp();
|
|
@@ -11,7 +11,7 @@ const ajvAppsResponse = new Ajv({ ...ajvOptions, allErrors: true });
|
|
|
11
11
|
// Cache apps list and no params modules results
|
|
12
12
|
const appsCache = {};
|
|
13
13
|
const resultsCache = {};
|
|
14
|
-
async function runModule(
|
|
14
|
+
async function runModule(params, res, modName, validate, responseValidate, appId) {
|
|
15
15
|
const respond = (result) => res.send({
|
|
16
16
|
result,
|
|
17
17
|
meta: params,
|
|
@@ -47,7 +47,6 @@ async function runModule(apiAuth, params, res, modName, validate, responseValida
|
|
|
47
47
|
} else {
|
|
48
48
|
try {
|
|
49
49
|
const { data } = await api.get('applications', {
|
|
50
|
-
...apiAuth,
|
|
51
50
|
params: listAppsParams,
|
|
52
51
|
});
|
|
53
52
|
appsList = data.result;
|
|
@@ -151,15 +150,15 @@ async function runModule(apiAuth, params, res, modName, validate, responseValida
|
|
|
151
150
|
return res.sendStatus(501);
|
|
152
151
|
}
|
|
153
152
|
|
|
154
|
-
export default (modName, schema, responseSchema, req, res
|
|
153
|
+
export default (modName, schema, responseSchema, req, res) => {
|
|
155
154
|
const validate = ajv.compile(schema);
|
|
156
155
|
const responseValidate = ajvAppsResponse.compile(responseSchema);
|
|
157
156
|
return {
|
|
158
157
|
GET() {
|
|
159
|
-
runModule(
|
|
158
|
+
runModule(req.query, res, modName, validate, responseValidate);
|
|
160
159
|
},
|
|
161
160
|
POST() {
|
|
162
|
-
runModule(
|
|
161
|
+
runModule(req.body, res, modName, validate, responseValidate, req.query.app_id);
|
|
163
162
|
},
|
|
164
163
|
};
|
|
165
164
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-module.js","sourceRoot":"","sources":["../../src/firebase/handle-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,GAAyB,MAAM,KAAK,CAAC;AAC5C,OAAO,GAA4B,MAAM,oBAAoB,CAAC;AAC9D,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,EACL,GAAG,EACH,UAAU,EACV,cAAc,EACd,gBAAgB,GACjB,MAAM,OAAO,CAAC;AACf,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAE9C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpE,gDAAgD;AAChD,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,KAAK,UAAU,SAAS,CACtB,
|
|
1
|
+
{"version":3,"file":"handle-module.js","sourceRoot":"","sources":["../../src/firebase/handle-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { schemas } from '../index.js';
|
|
2
2
|
import handleModule from './handle-module.js';
|
|
3
3
|
|
|
4
|
-
export default (req, res
|
|
4
|
+
export default (req, res) => {
|
|
5
5
|
const { method } = req;
|
|
6
6
|
if (method !== 'POST' && method !== 'GET') {
|
|
7
7
|
return res.sendStatus(405);
|
|
@@ -49,7 +49,7 @@ export default (req, res, apiAuth) => {
|
|
|
49
49
|
return sendSchema(true);
|
|
50
50
|
}
|
|
51
51
|
if (url === `/${modName}`) {
|
|
52
|
-
return handleModule(modName, schema, responseSchema, req, res
|
|
52
|
+
return handleModule(modName, schema, responseSchema, req, res);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
return res.sendStatus(404);
|
|
@@ -1 +1 @@
|
|
|
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;AAE3C,eAAe,
|
|
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;AAE3C,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,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,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,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;SACJ;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;SAChE;KACF;IACD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
/* eslint-disable import/prefer-default-export */
|
|
2
|
-
import '
|
|
3
|
-
// eslint-disable-next-line import/no-unresolved
|
|
4
|
-
import { initializeApp } from 'firebase-admin/app';
|
|
2
|
+
import '@cloudcommerce/firebase/lib/init';
|
|
5
3
|
// eslint-disable-next-line import/no-unresolved
|
|
6
4
|
import { onRequest } from 'firebase-functions/v2/https';
|
|
7
5
|
import config from '@cloudcommerce/firebase/lib/config';
|
|
8
|
-
import getEnv from '@cloudcommerce/firebase/lib/env';
|
|
9
6
|
import serveModulesApi from './firebase/serve-modules-api.js';
|
|
10
7
|
|
|
11
|
-
initializeApp();
|
|
12
8
|
const { httpsFunctionOptions } = config.get();
|
|
13
9
|
|
|
14
10
|
export const modules = onRequest(httpsFunctionOptions, (req, res) => {
|
|
15
|
-
|
|
16
|
-
serveModulesApi(req, res, apiAuth);
|
|
11
|
+
serveModulesApi(req, res);
|
|
17
12
|
});
|
|
18
13
|
// # sourceMappingURL=firebase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,
|
|
1
|
+
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,kCAAkC,CAAC;AAC1C,gDAAgD;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,MAAM,MAAM,oCAAoC,CAAC;AACxD,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAE3D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE9C,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAClE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
|
@@ -19,7 +19,6 @@ const appsCache = {};
|
|
|
19
19
|
const resultsCache = {};
|
|
20
20
|
|
|
21
21
|
async function runModule(
|
|
22
|
-
apiAuth: { authenticationId: string, apiKey: string },
|
|
23
22
|
params: { [key: string]: any },
|
|
24
23
|
res: Response,
|
|
25
24
|
modName: string,
|
|
@@ -65,7 +64,6 @@ async function runModule(
|
|
|
65
64
|
} else {
|
|
66
65
|
try {
|
|
67
66
|
const { data } = await api.get('applications', {
|
|
68
|
-
...apiAuth,
|
|
69
67
|
params: listAppsParams,
|
|
70
68
|
});
|
|
71
69
|
appsList = data.result;
|
|
@@ -187,16 +185,15 @@ export default (
|
|
|
187
185
|
responseSchema: { [key: string]: any },
|
|
188
186
|
req: Request,
|
|
189
187
|
res: Response,
|
|
190
|
-
apiAuth: { authenticationId: string, apiKey: string },
|
|
191
188
|
) => {
|
|
192
189
|
const validate = ajv.compile(schema);
|
|
193
190
|
const responseValidate = ajvAppsResponse.compile(responseSchema);
|
|
194
191
|
return {
|
|
195
192
|
GET() {
|
|
196
|
-
runModule(
|
|
193
|
+
runModule(req.query, res, modName, validate, responseValidate);
|
|
197
194
|
},
|
|
198
195
|
POST() {
|
|
199
|
-
runModule(
|
|
196
|
+
runModule(req.body, res, modName, validate, responseValidate, req.query.app_id);
|
|
200
197
|
},
|
|
201
198
|
};
|
|
202
199
|
};
|
|
@@ -2,11 +2,7 @@ import type { Request, Response } from 'firebase-functions';
|
|
|
2
2
|
import { schemas } from '../index';
|
|
3
3
|
import handleModule from './handle-module';
|
|
4
4
|
|
|
5
|
-
export default (
|
|
6
|
-
req: Request,
|
|
7
|
-
res: Response,
|
|
8
|
-
apiAuth: { authenticationId: string, apiKey: string },
|
|
9
|
-
) => {
|
|
5
|
+
export default (req: Request, res: Response) => {
|
|
10
6
|
const { method } = req;
|
|
11
7
|
if (method !== 'POST' && method !== 'GET') {
|
|
12
8
|
return res.sendStatus(405);
|
|
@@ -59,7 +55,7 @@ export default (
|
|
|
59
55
|
return sendSchema(true);
|
|
60
56
|
}
|
|
61
57
|
if (url === `/${modName}`) {
|
|
62
|
-
return handleModule(modName, schema, responseSchema, req, res
|
|
58
|
+
return handleModule(modName, schema, responseSchema, req, res);
|
|
63
59
|
}
|
|
64
60
|
}
|
|
65
61
|
return res.sendStatus(404);
|
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
/* eslint-disable import/prefer-default-export */
|
|
2
2
|
|
|
3
|
-
import '
|
|
4
|
-
// eslint-disable-next-line import/no-unresolved
|
|
5
|
-
import { initializeApp } from 'firebase-admin/app';
|
|
3
|
+
import '@cloudcommerce/firebase/lib/init';
|
|
6
4
|
// eslint-disable-next-line import/no-unresolved
|
|
7
5
|
import { onRequest } from 'firebase-functions/v2/https';
|
|
8
6
|
import config from '@cloudcommerce/firebase/lib/config';
|
|
9
|
-
import getEnv from '@cloudcommerce/firebase/lib/env';
|
|
10
7
|
import serveModulesApi from './firebase/serve-modules-api';
|
|
11
8
|
|
|
12
|
-
initializeApp();
|
|
13
9
|
const { httpsFunctionOptions } = config.get();
|
|
14
10
|
|
|
15
11
|
export const modules = onRequest(httpsFunctionOptions, (req, res) => {
|
|
16
|
-
|
|
17
|
-
serveModulesApi(req, res, apiAuth);
|
|
12
|
+
serveModulesApi(req, res);
|
|
18
13
|
});
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { logger } from 'firebase-functions';
|
|
2
2
|
import api from '@cloudcommerce/api';
|
|
3
|
+
import getEnv from '@cloudcommerce/firebase/lib/env';
|
|
3
4
|
|
|
4
|
-
const findCustomerByEmail = async (email
|
|
5
|
+
const findCustomerByEmail = async (email) => {
|
|
5
6
|
try {
|
|
6
|
-
const { data } = await api.get(`customers?main_email=${email}
|
|
7
|
+
const { data } = await api.get(`customers?main_email=${email}`);
|
|
7
8
|
if (data.result.length) {
|
|
8
9
|
return data.result[0];
|
|
9
10
|
}
|
|
@@ -25,16 +26,17 @@ const checkFirebaseAuth = async (auth, authToken) => {
|
|
|
25
26
|
return null;
|
|
26
27
|
}
|
|
27
28
|
};
|
|
28
|
-
const createCustomer = async (customer
|
|
29
|
+
const createCustomer = async (customer) => {
|
|
29
30
|
try {
|
|
30
|
-
const { data } = await api.post('customers', customer
|
|
31
|
+
const { data } = await api.post('customers', customer);
|
|
31
32
|
return data._id;
|
|
32
33
|
} catch (e) {
|
|
33
34
|
logger.error(e);
|
|
34
35
|
return null;
|
|
35
36
|
}
|
|
36
37
|
};
|
|
37
|
-
const generateAccessToken = async (firestore, customerId
|
|
38
|
+
const generateAccessToken = async (firestore, customerId) => {
|
|
39
|
+
const { apiAuth } = getEnv();
|
|
38
40
|
const docRef = firestore.doc(`customerTokens/${customerId}`);
|
|
39
41
|
const doc = await docRef.get();
|
|
40
42
|
const expires = doc.data()?.expires;
|
|
@@ -63,12 +65,12 @@ const generateAccessToken = async (firestore, customerId, apiAuth) => {
|
|
|
63
65
|
return null;
|
|
64
66
|
}
|
|
65
67
|
};
|
|
66
|
-
const getAuthCustomerApi = async (firestore,
|
|
68
|
+
const getAuthCustomerApi = async (firestore, authtoken, authFirebase) => {
|
|
67
69
|
const customerFirebaseAuth = await checkFirebaseAuth(authFirebase, authtoken);
|
|
68
70
|
if (customerFirebaseAuth !== null && customerFirebaseAuth.email) {
|
|
69
|
-
const customer = await findCustomerByEmail(customerFirebaseAuth.email
|
|
71
|
+
const customer = await findCustomerByEmail(customerFirebaseAuth.email);
|
|
70
72
|
if (customer !== null) {
|
|
71
|
-
return generateAccessToken(firestore, customer._id
|
|
73
|
+
return generateAccessToken(firestore, customer._id);
|
|
72
74
|
}
|
|
73
75
|
const newCustomer = {
|
|
74
76
|
display_name: customerFirebaseAuth.name || '',
|
|
@@ -82,9 +84,9 @@ const getAuthCustomerApi = async (firestore, apiAuth, authtoken, authFirebase) =
|
|
|
82
84
|
user_id: customerFirebaseAuth.user_id,
|
|
83
85
|
}],
|
|
84
86
|
};
|
|
85
|
-
const customerId = await createCustomer(newCustomer
|
|
87
|
+
const customerId = await createCustomer(newCustomer);
|
|
86
88
|
if (customerId) {
|
|
87
|
-
return generateAccessToken(firestore, customerId
|
|
89
|
+
return generateAccessToken(firestore, customerId);
|
|
88
90
|
}
|
|
89
91
|
}
|
|
90
92
|
// TODO: Find customer by phone number, generate token if found, otherwise unauthorize
|