cloudcommerce 0.0.48 → 0.0.51
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 +34 -0
- package/package.json +9 -9
- package/packages/api/lib/index.d.ts +40 -104
- package/packages/api/lib/types/applications.d.ts +10 -62
- package/packages/api/package.json +1 -1
- package/packages/api/src/types/applications.d.ts +10 -62
- package/packages/apps/_app.config.js +80 -0
- package/packages/apps/discounts/lib/discounts.config.d.ts +14 -0
- package/packages/apps/discounts/lib/discounts.config.js +19 -0
- package/packages/apps/discounts/lib/discounts.config.js.map +1 -0
- package/packages/apps/discounts/lib/discounts.d.ts +2 -0
- package/packages/apps/discounts/lib/discounts.js +7 -0
- package/packages/apps/discounts/lib/discounts.js.map +1 -0
- package/packages/apps/discounts/lib/index.d.ts +1 -3
- package/packages/apps/discounts/lib/index.js +1 -8
- package/packages/apps/discounts/lib/index.js.map +1 -1
- package/packages/apps/discounts/package.json +3 -2
- package/packages/apps/discounts/src/discounts.config.ts +25 -0
- package/packages/apps/discounts/src/discounts.ts +8 -0
- package/packages/apps/discounts/src/index.ts +1 -9
- package/packages/cli/config/firebase.json +5 -0
- package/packages/cli/lib/config-gcloud.js +79 -0
- package/packages/cli/lib/create-auth.js +7 -7
- package/packages/cli/lib/index.js +12 -1
- package/packages/cli/package.json +2 -2
- package/packages/cli/src/config-gcloud.ts +93 -0
- package/packages/cli/src/create-auth.ts +7 -7
- package/packages/cli/src/index.ts +13 -2
- package/packages/events/lib/firebase.js +0 -2
- package/packages/events/lib/firebase.js.map +1 -1
- package/packages/events/package.json +1 -1
- package/packages/events/src/firebase.ts +0 -2
- package/packages/firebase/lib/config.js +12 -8
- package/packages/firebase/lib/config.js.map +1 -1
- package/packages/firebase/lib/index.d.ts +0 -1
- package/packages/firebase/lib/index.js +0 -4
- package/packages/firebase/lib/index.js.map +1 -1
- package/packages/firebase/package.json +1 -1
- package/packages/firebase/src/config.ts +13 -8
- package/packages/firebase/src/index.ts +0 -4
- package/packages/modules/lib/firebase/call-app-module.js +1 -1
- package/packages/modules/lib/firebase/call-app-module.js.map +1 -1
- package/packages/modules/lib/firebase/handle-module.js.map +1 -1
- package/packages/modules/lib/firebase.js +0 -2
- package/packages/modules/lib/firebase.js.map +1 -1
- package/packages/modules/package.json +2 -2
- package/packages/modules/src/firebase/call-app-module.ts +1 -1
- package/packages/modules/src/firebase/handle-module.ts +3 -3
- package/packages/modules/src/firebase.ts +0 -2
- package/packages/passport/lib/firebase/handle-passport.js +108 -0
- package/packages/passport/lib/firebase/handle-passport.js.map +1 -0
- package/packages/passport/lib/firebase/serve-passport-api.js +41 -0
- package/packages/passport/lib/firebase/serve-passport-api.js.map +1 -0
- package/packages/passport/lib/firebase.js +22 -5
- package/packages/passport/lib/firebase.js.map +1 -1
- package/packages/passport/package.json +1 -1
- package/packages/passport/src/firebase/handle-passport.ts +149 -0
- package/packages/passport/src/firebase/serve-passport-api.ts +62 -0
- package/packages/passport/src/firebase.ts +32 -7
- package/packages/ssr/package.json +1 -1
- package/packages/storefront/package.json +12 -2
- package/packages/types/index.ts +9 -0
- package/packages/types/package.json +1 -1
- package/pnpm-lock.yaml +1278 -614
- package/packages/firebase/lib/handlers/auth-callback.d.ts +0 -3
- package/packages/firebase/lib/handlers/auth-callback.js +0 -45
- package/packages/firebase/lib/handlers/auth-callback.js.map +0 -1
- package/packages/firebase/src/handlers/auth-callback.ts +0 -49
- package/packages/passport/src/firebase/.gitkeep +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import config from '@cloudcommerce/firebase/lib/config';
|
|
2
|
+
|
|
3
|
+
export default () => {
|
|
4
|
+
const { lang, apps: { discounts: { appId } } } = config.get();
|
|
5
|
+
return {
|
|
6
|
+
app_id: appId,
|
|
7
|
+
title: lang.startsWith('en') ? 'Campaigns and discounts' : 'Campanhas e descontos',
|
|
8
|
+
slug: 'discounts',
|
|
9
|
+
type: 'external',
|
|
10
|
+
state: 'active',
|
|
11
|
+
modules: {
|
|
12
|
+
apply_discount: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
admin_settings: {},
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
// # sourceMappingURL=discounts.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discounts.config.js","sourceRoot":"","sources":["../src/discounts.config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oCAAoC,CAAC;AAExD,eAAe,GAAG,EAAE;IAClB,MAAM,EACJ,IAAI,EACJ,IAAI,EAAE,EACJ,SAAS,EAAE,EAAE,KAAK,EAAE,GACrB,GACF,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAEjB,OAAO;QACL,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,uBAAuB;QAClF,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE;YACP,cAAc,EAAE;gBACd,OAAO,EAAE,IAAI;aACd;SACF;QACD,cAAc,EAAE,EACf;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discounts.js","sourceRoot":"","sources":["../src/discounts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,OAAsB,EAAE,EAAE;IAC5D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcommerce/app-discounts",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.51",
|
|
5
5
|
"description": "E-Com Plus Cloud Commerce app for complex discount rules",
|
|
6
|
-
"main": "lib/
|
|
6
|
+
"main": "lib/discounts.js",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "git+https://github.com/ecomplus/cloud-commerce.git",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@cloudcommerce/api": "workspace:*",
|
|
23
|
+
"@cloudcommerce/firebase": "workspace:*",
|
|
23
24
|
"firebase-admin": "^11.0.1",
|
|
24
25
|
"firebase-functions": "^3.22.0"
|
|
25
26
|
},
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import config from '@cloudcommerce/firebase/lib/config';
|
|
2
|
+
|
|
3
|
+
export default () => {
|
|
4
|
+
const {
|
|
5
|
+
lang,
|
|
6
|
+
apps: {
|
|
7
|
+
discounts: { appId },
|
|
8
|
+
},
|
|
9
|
+
} = config.get();
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
app_id: appId,
|
|
13
|
+
title: lang.startsWith('en') ? 'Campaigns and discounts' : 'Campanhas e descontos',
|
|
14
|
+
slug: 'discounts',
|
|
15
|
+
type: 'external',
|
|
16
|
+
state: 'active',
|
|
17
|
+
modules: {
|
|
18
|
+
apply_discount: {
|
|
19
|
+
enabled: true,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
admin_settings: {
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/* eslint-disable import/prefer-default-export */
|
|
2
|
+
import type { AppModuleBody } from '@cloudcommerce/types';
|
|
3
|
+
import { logger } from 'firebase-functions';
|
|
4
|
+
|
|
5
|
+
export const applyDiscount = async (modBody: AppModuleBody) => {
|
|
6
|
+
logger.info(modBody);
|
|
7
|
+
return {};
|
|
8
|
+
};
|
|
@@ -1,9 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { logger } from 'firebase-functions';
|
|
3
|
-
|
|
4
|
-
export const events: AppEventsTopic[] = [];
|
|
5
|
-
|
|
6
|
-
export const applyDiscount = async () => {
|
|
7
|
-
logger.info('Hello discounts app');
|
|
8
|
-
return {};
|
|
9
|
-
};
|
|
1
|
+
export * from './discounts';
|
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
"source": "functions/core",
|
|
10
10
|
"codebase": "core"
|
|
11
11
|
},
|
|
12
|
+
{
|
|
13
|
+
"predeploy": "npm run build -- --codebase events --dir \"$RESOURCE_DIR\"",
|
|
14
|
+
"source": "functions/events",
|
|
15
|
+
"codebase": "events"
|
|
16
|
+
},
|
|
12
17
|
{
|
|
13
18
|
"predeploy": "npm run build -- --codebase modules --dir \"$RESOURCE_DIR\"",
|
|
14
19
|
"source": "functions/modules",
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { $, echo, fs } from 'zx';
|
|
3
|
+
|
|
4
|
+
const serviceAccountId = 'cloud-commerce-gh-actions';
|
|
5
|
+
const serviceAccountEmail = (projectId) => {
|
|
6
|
+
return `${serviceAccountId}@${projectId}.iam.gserviceaccount.com`;
|
|
7
|
+
};
|
|
8
|
+
const checkServiceAccountExists = async (projectId) => {
|
|
9
|
+
try {
|
|
10
|
+
return $`gcloud iam service-accounts describe ${serviceAccountEmail(projectId)}`;
|
|
11
|
+
} catch (e) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const siginGcloudAndSetIAM = async (projectId, pwd) => {
|
|
16
|
+
await $`gcloud auth login`;
|
|
17
|
+
await $`gcloud config set project ${projectId} `;
|
|
18
|
+
const roles = [
|
|
19
|
+
'roles/cloudconfig.admin',
|
|
20
|
+
'roles/appengine.appAdmin',
|
|
21
|
+
'roles/appengine.appCreator',
|
|
22
|
+
'roles/artifactregistry.admin',
|
|
23
|
+
'roles/cloudfunctions.admin',
|
|
24
|
+
'roles/cloudscheduler.admin',
|
|
25
|
+
'roles/iam.serviceAccountUser',
|
|
26
|
+
'roles/run.viewer',
|
|
27
|
+
'roles/serviceusage.apiKeysViewer',
|
|
28
|
+
];
|
|
29
|
+
const serviceAccount = await checkServiceAccountExists(projectId);
|
|
30
|
+
if (!serviceAccount) {
|
|
31
|
+
await $`gcloud iam service-accounts create ${serviceAccountId} \
|
|
32
|
+
--description="A service account with permission to deploy Cloud Commerce from the GitHub repository to Firebase" \
|
|
33
|
+
--display-name="Cloud Commerce GH Actions"`;
|
|
34
|
+
}
|
|
35
|
+
const pathPolicyIAM = path.join(pwd, 'policyIAM.json');
|
|
36
|
+
await $`gcloud projects get-iam-policy ${projectId} --format json > ${pathPolicyIAM}`;
|
|
37
|
+
const policyIAM = fs.readJSONSync(pathPolicyIAM);
|
|
38
|
+
const { bindings } = policyIAM;
|
|
39
|
+
let updatePolicy = false;
|
|
40
|
+
roles.forEach((role) => {
|
|
41
|
+
const roleFound = bindings.find((binding) => binding.role === role);
|
|
42
|
+
const memberServiceAccount = `serviceAccount:${serviceAccountEmail(projectId)}`;
|
|
43
|
+
if (!roleFound) {
|
|
44
|
+
const newBinding = {
|
|
45
|
+
members: [
|
|
46
|
+
memberServiceAccount,
|
|
47
|
+
],
|
|
48
|
+
role,
|
|
49
|
+
};
|
|
50
|
+
bindings.push(newBinding);
|
|
51
|
+
updatePolicy = true;
|
|
52
|
+
} else {
|
|
53
|
+
const serviceAccountHavePermission = roleFound.members.find((account) => account === memberServiceAccount);
|
|
54
|
+
if (!serviceAccountHavePermission) {
|
|
55
|
+
roleFound.members.push(memberServiceAccount);
|
|
56
|
+
updatePolicy = true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (updatePolicy) {
|
|
61
|
+
fs.writeJSONSync(pathPolicyIAM, policyIAM);
|
|
62
|
+
return $`gcloud projects set-iam-policy ${projectId} ${pathPolicyIAM}`;
|
|
63
|
+
}
|
|
64
|
+
return echo``;
|
|
65
|
+
};
|
|
66
|
+
const createKeyServiceAccount = async (projectId, pwd) => {
|
|
67
|
+
try {
|
|
68
|
+
const pathFileKey = path.join(pwd, 'serviceAccountKey.json');
|
|
69
|
+
await $`gcloud iam service-accounts keys create ${pathFileKey} \
|
|
70
|
+
--iam-account=${serviceAccountEmail(projectId)}`;
|
|
71
|
+
return JSON.stringify(fs.readJSONSync(pathFileKey));
|
|
72
|
+
} catch (e) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export default siginGcloudAndSetIAM;
|
|
78
|
+
|
|
79
|
+
export { siginGcloudAndSetIAM, createKeyServiceAccount };
|
|
@@ -26,15 +26,15 @@ export default async (storeId, accessToken) => {
|
|
|
26
26
|
username: `cloudcomm${Date.now()}`,
|
|
27
27
|
permissions: {
|
|
28
28
|
applications: ['all'],
|
|
29
|
-
brands: ['
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
brands: ['all'],
|
|
30
|
+
categories: ['all'],
|
|
31
|
+
collections: ['all'],
|
|
32
|
+
grids: ['all'],
|
|
33
|
+
products: ['all'],
|
|
33
34
|
customers: ['all'],
|
|
34
|
-
|
|
35
|
+
carts: ['all'],
|
|
35
36
|
orders: ['GET', 'POST', 'PATCH'],
|
|
36
|
-
|
|
37
|
-
stores: ['GET'],
|
|
37
|
+
stores: ['GET', 'PATCH'],
|
|
38
38
|
},
|
|
39
39
|
}, apiConfig);
|
|
40
40
|
authenticationId = _id;
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
} from 'zx';
|
|
6
6
|
import login from './login.js';
|
|
7
7
|
import build from './build.js';
|
|
8
|
+
import { siginGcloudAndSetIAM, createKeyServiceAccount } from './config-gcloud.js';
|
|
8
9
|
|
|
9
10
|
const { FIREBASE_PROJECT_ID, GOOGLE_APPLICATION_CREDENTIALS } = process.env;
|
|
10
11
|
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
@@ -43,6 +44,9 @@ export default async () => {
|
|
|
43
44
|
return opts;
|
|
44
45
|
}, '');
|
|
45
46
|
const $firebase = (cmd) => {
|
|
47
|
+
if (cmd === 'deploy') {
|
|
48
|
+
return $`firebase --project=${projectId} ${cmd}${options} --force`;
|
|
49
|
+
}
|
|
46
50
|
return $`firebase --project=${projectId} ${cmd}${options}`;
|
|
47
51
|
};
|
|
48
52
|
if (argv._.includes('serve')) {
|
|
@@ -94,6 +98,13 @@ ECOM_STORE_ID=${storeId}
|
|
|
94
98
|
//
|
|
95
99
|
}
|
|
96
100
|
}
|
|
101
|
+
let serviceAccountJSON = null;
|
|
102
|
+
try {
|
|
103
|
+
await siginGcloudAndSetIAM(projectId, pwd);
|
|
104
|
+
serviceAccountJSON = await createKeyServiceAccount(projectId, pwd);
|
|
105
|
+
} catch (e) {
|
|
106
|
+
//
|
|
107
|
+
}
|
|
97
108
|
return echo`
|
|
98
109
|
****
|
|
99
110
|
|
|
@@ -103,7 +114,7 @@ Finish by saving the following secrets to your GitHub repository:
|
|
|
103
114
|
|
|
104
115
|
${chalk.bold('ECOM_API_KEY')} = ${chalk.bgMagenta(apiKey)}
|
|
105
116
|
|
|
106
|
-
${chalk.bold('FIREBASE_SERVICE_ACCOUNT')} = {YOUR_SERVICE_ACCOUNT_JSON}
|
|
117
|
+
${chalk.bold('FIREBASE_SERVICE_ACCOUNT')} = ${chalk.bgMagenta(serviceAccountJSON || '{YOUR_SERVICE_ACCOUNT_JSON}')}
|
|
107
118
|
|
|
108
119
|
-- More info at https://github.com/ecomplus/store#getting-started
|
|
109
120
|
`;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcommerce/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.51",
|
|
5
5
|
"description": "E-Com Plus Cloud Commerce CLI tools",
|
|
6
6
|
"bin": {
|
|
7
7
|
"cloudcommerce": "./bin/run.mjs"
|
|
@@ -28,6 +28,6 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@cloudcommerce/api": "workspace:*",
|
|
30
30
|
"md5": "^2.3.0",
|
|
31
|
-
"zx": "^7.0.
|
|
31
|
+
"zx": "^7.0.8"
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { $, echo, fs } from 'zx';
|
|
3
|
+
|
|
4
|
+
const serviceAccountId = 'cloud-commerce-gh-actions';
|
|
5
|
+
const serviceAccountEmail = (projectId: string) => {
|
|
6
|
+
return `${serviceAccountId}@${projectId}.iam.gserviceaccount.com`;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const checkServiceAccountExists = async (projectId: string) => {
|
|
10
|
+
try {
|
|
11
|
+
return $`gcloud iam service-accounts describe ${serviceAccountEmail(projectId)}`;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const siginGcloudAndSetIAM = async (
|
|
18
|
+
projectId: string,
|
|
19
|
+
pwd: string,
|
|
20
|
+
) => {
|
|
21
|
+
await $`gcloud auth login`;
|
|
22
|
+
await $`gcloud config set project ${projectId} `;
|
|
23
|
+
const roles = [
|
|
24
|
+
'roles/cloudconfig.admin',
|
|
25
|
+
'roles/appengine.appAdmin',
|
|
26
|
+
'roles/appengine.appCreator',
|
|
27
|
+
'roles/artifactregistry.admin',
|
|
28
|
+
'roles/cloudfunctions.admin',
|
|
29
|
+
'roles/cloudscheduler.admin',
|
|
30
|
+
'roles/iam.serviceAccountUser',
|
|
31
|
+
'roles/run.viewer',
|
|
32
|
+
'roles/serviceusage.apiKeysViewer',
|
|
33
|
+
];
|
|
34
|
+
const serviceAccount = await checkServiceAccountExists(projectId);
|
|
35
|
+
if (!serviceAccount) {
|
|
36
|
+
await $`gcloud iam service-accounts create ${serviceAccountId} \
|
|
37
|
+
--description="A service account with permission to deploy Cloud Commerce from the GitHub repository to Firebase" \
|
|
38
|
+
--display-name="Cloud Commerce GH Actions"`;
|
|
39
|
+
}
|
|
40
|
+
const pathPolicyIAM = path.join(pwd, 'policyIAM.json');
|
|
41
|
+
await $`gcloud projects get-iam-policy ${projectId} --format json > ${pathPolicyIAM}`;
|
|
42
|
+
const policyIAM = fs.readJSONSync(pathPolicyIAM);
|
|
43
|
+
const { bindings } = policyIAM;
|
|
44
|
+
let updatePolicy = false;
|
|
45
|
+
|
|
46
|
+
roles.forEach((role) => {
|
|
47
|
+
const roleFound = bindings.find(
|
|
48
|
+
(binding: { [key: string]: string | string[] }) => binding.role === role,
|
|
49
|
+
);
|
|
50
|
+
const memberServiceAccount = `serviceAccount:${serviceAccountEmail(projectId)}`;
|
|
51
|
+
if (!roleFound) {
|
|
52
|
+
const newBinding = {
|
|
53
|
+
members: [
|
|
54
|
+
memberServiceAccount,
|
|
55
|
+
],
|
|
56
|
+
role,
|
|
57
|
+
};
|
|
58
|
+
bindings.push(newBinding);
|
|
59
|
+
updatePolicy = true;
|
|
60
|
+
} else {
|
|
61
|
+
const serviceAccountHavePermission = roleFound.members.find(
|
|
62
|
+
(account: string) => account === memberServiceAccount,
|
|
63
|
+
);
|
|
64
|
+
if (!serviceAccountHavePermission) {
|
|
65
|
+
roleFound.members.push(memberServiceAccount);
|
|
66
|
+
updatePolicy = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
if (updatePolicy) {
|
|
71
|
+
fs.writeJSONSync(pathPolicyIAM, policyIAM);
|
|
72
|
+
return $`gcloud projects set-iam-policy ${projectId} ${pathPolicyIAM}`;
|
|
73
|
+
}
|
|
74
|
+
return echo``;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const createKeyServiceAccount = async (projectId: string, pwd: string) => {
|
|
78
|
+
try {
|
|
79
|
+
const pathFileKey = path.join(pwd, 'serviceAccountKey.json');
|
|
80
|
+
await $`gcloud iam service-accounts keys create ${pathFileKey} \
|
|
81
|
+
--iam-account=${serviceAccountEmail(projectId)}`;
|
|
82
|
+
return JSON.stringify(fs.readJSONSync(pathFileKey));
|
|
83
|
+
} catch (e) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export default siginGcloudAndSetIAM;
|
|
89
|
+
|
|
90
|
+
export {
|
|
91
|
+
siginGcloudAndSetIAM,
|
|
92
|
+
createKeyServiceAccount,
|
|
93
|
+
};
|
|
@@ -27,15 +27,15 @@ export default async (storeId: number, accessToken: string) => {
|
|
|
27
27
|
username: `cloudcomm${Date.now()}`,
|
|
28
28
|
permissions: {
|
|
29
29
|
applications: ['all'],
|
|
30
|
-
brands: ['
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
brands: ['all'],
|
|
31
|
+
categories: ['all'],
|
|
32
|
+
collections: ['all'],
|
|
33
|
+
grids: ['all'],
|
|
34
|
+
products: ['all'],
|
|
34
35
|
customers: ['all'],
|
|
35
|
-
|
|
36
|
+
carts: ['all'],
|
|
36
37
|
orders: ['GET', 'POST', 'PATCH'],
|
|
37
|
-
|
|
38
|
-
stores: ['GET'],
|
|
38
|
+
stores: ['GET', 'PATCH'],
|
|
39
39
|
},
|
|
40
40
|
}, apiConfig);
|
|
41
41
|
authenticationId = _id;
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
} from 'zx';
|
|
10
10
|
import login from './login';
|
|
11
11
|
import build from './build';
|
|
12
|
+
import { siginGcloudAndSetIAM, createKeyServiceAccount } from './config-gcloud';
|
|
12
13
|
|
|
13
14
|
const {
|
|
14
15
|
FIREBASE_PROJECT_ID,
|
|
@@ -56,6 +57,9 @@ export default async () => {
|
|
|
56
57
|
return opts;
|
|
57
58
|
}, '');
|
|
58
59
|
const $firebase = (cmd: string) => {
|
|
60
|
+
if (cmd === 'deploy') {
|
|
61
|
+
return $`firebase --project=${projectId} ${cmd}${options} --force`;
|
|
62
|
+
}
|
|
59
63
|
return $`firebase --project=${projectId} ${cmd}${options}`;
|
|
60
64
|
};
|
|
61
65
|
|
|
@@ -116,6 +120,14 @@ ECOM_STORE_ID=${storeId}
|
|
|
116
120
|
//
|
|
117
121
|
}
|
|
118
122
|
}
|
|
123
|
+
let serviceAccountJSON : string | null = null;
|
|
124
|
+
try {
|
|
125
|
+
await siginGcloudAndSetIAM(projectId as string, pwd);
|
|
126
|
+
serviceAccountJSON = await createKeyServiceAccount(projectId as string, pwd);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
//
|
|
129
|
+
}
|
|
130
|
+
|
|
119
131
|
return echo`
|
|
120
132
|
****
|
|
121
133
|
|
|
@@ -125,11 +137,10 @@ Finish by saving the following secrets to your GitHub repository:
|
|
|
125
137
|
|
|
126
138
|
${chalk.bold('ECOM_API_KEY')} = ${chalk.bgMagenta(apiKey)}
|
|
127
139
|
|
|
128
|
-
${chalk.bold('FIREBASE_SERVICE_ACCOUNT')} = {YOUR_SERVICE_ACCOUNT_JSON}
|
|
140
|
+
${chalk.bold('FIREBASE_SERVICE_ACCOUNT')} = ${chalk.bgMagenta(serviceAccountJSON || '{YOUR_SERVICE_ACCOUNT_JSON}')}
|
|
129
141
|
|
|
130
142
|
-- More info at https://github.com/ecomplus/store#getting-started
|
|
131
143
|
`;
|
|
132
144
|
}
|
|
133
|
-
|
|
134
145
|
return $`echo 'Hello from @cloudcommerce/cli'`;
|
|
135
146
|
};
|
|
@@ -19,8 +19,6 @@ export const onNewOrder = functions.region(region)
|
|
|
19
19
|
logger.warn(`Dropping event ${context.eventId} with age[ms]: ${eventAgeMs}`);
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
|
-
// Hide API key for security
|
|
23
|
-
process.env.ECOM_API_KEY = '***';
|
|
24
22
|
const { json } = message;
|
|
25
23
|
logger.info({
|
|
26
24
|
topic: newOrderTopic,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAGjD,OAAO,gCAAgC,CAAC;AACxC,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,oCAAoC,CAAC;AAExD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AAC7B,aAAa,EAAE,CAAC;AAEhB,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,aAAa,GAAmB,YAAY,CAAC;AACnD,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;KAC/C,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;KAChC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,UAAU,GAAG,aAAa,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,OAAO,kBAAkB,UAAU,EAAE,CAAC,CAAC;QAC7E,OAAO;KACR;IACD,
|
|
1
|
+
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAGjD,OAAO,gCAAgC,CAAC;AACxC,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,oCAAoC,CAAC;AAExD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AAC7B,aAAa,EAAE,CAAC;AAEhB,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,aAAa,GAAmB,YAAY,CAAC;AACnD,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;KAC/C,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;KAChC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,UAAU,GAAG,aAAa,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,OAAO,kBAAkB,UAAU,EAAE,CAAC,CAAC;QAC7E,OAAO;KACR;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,IAAI,CAAC;QACV,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI;KACL,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -22,8 +22,6 @@ export const onNewOrder = functions.region(region)
|
|
|
22
22
|
logger.warn(`Dropping event ${context.eventId} with age[ms]: ${eventAgeMs}`);
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
|
-
// Hide API key for security
|
|
26
|
-
process.env.ECOM_API_KEY = '***';
|
|
27
25
|
const { json } = message;
|
|
28
26
|
logger.info({
|
|
29
27
|
topic: newOrderTopic,
|
|
@@ -3,21 +3,25 @@ import {
|
|
|
3
3
|
DEFAULT_LANG, DEFAULT_CURRENCY, DEFAULT_CURRENCY_SYMBOL, DEFAULT_COUNTRY_CODE,
|
|
4
4
|
} from './defaults.js';
|
|
5
5
|
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
const env = (typeof process === 'object' && process?.env)
|
|
8
|
+
|| (typeof window === 'object' && window)
|
|
9
|
+
|| {};
|
|
6
10
|
const deepmerge = Deepmerge();
|
|
7
11
|
const self = {
|
|
8
12
|
__config: {
|
|
9
13
|
hello: 'from @cloudcommerce/firebase',
|
|
10
|
-
lang:
|
|
11
|
-
currency:
|
|
12
|
-
currencySymbol:
|
|
13
|
-
countryCode:
|
|
14
|
-
storeId: Number(
|
|
14
|
+
lang: env.ECOM_LANG || DEFAULT_LANG,
|
|
15
|
+
currency: env.ECOM_CURRENCY || DEFAULT_CURRENCY,
|
|
16
|
+
currencySymbol: env.ECOM_CURRENCY_SYMBOL || DEFAULT_CURRENCY_SYMBOL,
|
|
17
|
+
countryCode: env.ECOM_COUNTRY_CODE || DEFAULT_COUNTRY_CODE,
|
|
18
|
+
storeId: Number(env.ECOM_STORE_ID),
|
|
15
19
|
httpsFunctionOptions: {
|
|
16
|
-
region:
|
|
20
|
+
region: env.DEPLOY_REGION || 'us-east1',
|
|
17
21
|
},
|
|
18
22
|
apps: {
|
|
19
23
|
discounts: {
|
|
20
|
-
appId:
|
|
24
|
+
appId: 1252,
|
|
21
25
|
},
|
|
22
26
|
},
|
|
23
27
|
},
|
|
@@ -30,7 +34,7 @@ export default {
|
|
|
30
34
|
set(config) {
|
|
31
35
|
self.__config = deepmerge(self.__config, config);
|
|
32
36
|
if (config.storeId) {
|
|
33
|
-
|
|
37
|
+
env.ECOM_STORE_ID = config.storeId;
|
|
34
38
|
}
|
|
35
39
|
},
|
|
36
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AAE9B,MAAM,IAAI,GAAG;IACX,QAAQ,EAAE;QACR,KAAK,EAAE,8BAA8B;QACrC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,aAAa;AACb,MAAM,GAAG,GAA8B,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG,CAAC;OAC/E,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC;OACtC,EAAE,CAAC;AAER,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AAE9B,MAAM,IAAI,GAAG;IACX,QAAQ,EAAE;QACR,KAAK,EAAE,8BAA8B;QACrC,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,YAAY;QACnC,QAAQ,EAAE,GAAG,CAAC,aAAa,IAAI,gBAAgB;QAC/C,cAAc,EAAE,GAAG,CAAC,oBAAoB,IAAI,uBAAuB;QACnE,WAAW,EAAE,GAAG,CAAC,iBAAiB,IAAI,oBAAoB;QAC1D,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QAClC,oBAAoB,EAAE;YACpB,MAAM,EAAE,GAAG,CAAC,aAAa,IAAI,UAAU;SACxC;QACD,IAAI,EAAE;YACJ,SAAS,EAAE;gBACT,KAAK,EAAE,IAAI;aACZ;SACF;KACF;CACF,CAAC;AAEF,eAAe;IACb,GAAG;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,MAAM;QACR,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;SACpC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -7,7 +7,6 @@ import { initializeApp } from 'firebase-admin/app';
|
|
|
7
7
|
import functions from 'firebase-functions';
|
|
8
8
|
import config from './config.js';
|
|
9
9
|
import checkStoreEvents from './handlers/check-store-events.js';
|
|
10
|
-
import handleAuthCallback from './handlers/auth-callback.js';
|
|
11
10
|
|
|
12
11
|
initializeApp();
|
|
13
12
|
const { httpsFunctionOptions: { region } } = config.get();
|
|
@@ -23,7 +22,4 @@ export const cronStoreEvents = functionBuilder.pubsub
|
|
|
23
22
|
.onRun(() => {
|
|
24
23
|
return checkStoreEvents();
|
|
25
24
|
});
|
|
26
|
-
|
|
27
|
-
export const appAuthCallback = functionBuilder.https
|
|
28
|
-
.onRequest(handleAuthCallback);
|
|
29
25
|
// # sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,gCAAgC,CAAC;AACxC,OAAO,sCAAsC,CAAC;AAC9C,gEAAgE;AAChE,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,gCAAgC,CAAC;AACxC,OAAO,sCAAsC,CAAC;AAC9C,gEAAgE;AAChE,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,aAAa,EAAE,CAAC;AAEhB,MAAM,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;AAE1D,MAAM,eAAe,GAAG,SAAS;KAC9B,MAAM,CAAC,MAAM,CAAC;KACd,OAAO,CAAC;IACP,cAAc,EAAE,GAAG;IACnB,MAAM,EAAE,OAAO;CAChB,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM;KAClD,QAAQ,CAAC,WAAW,CAAC;KACrB,KAAK,CAAC,GAAG,EAAE;IACV,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
|
@@ -6,22 +6,27 @@ import {
|
|
|
6
6
|
DEFAULT_COUNTRY_CODE,
|
|
7
7
|
} from './defaults';
|
|
8
8
|
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
const env: { [key: string]: string } = (typeof process === 'object' && process?.env)
|
|
11
|
+
|| (typeof window === 'object' && window)
|
|
12
|
+
|| {};
|
|
13
|
+
|
|
9
14
|
const deepmerge = Deepmerge();
|
|
10
15
|
|
|
11
16
|
const self = {
|
|
12
17
|
__config: {
|
|
13
18
|
hello: 'from @cloudcommerce/firebase',
|
|
14
|
-
lang:
|
|
15
|
-
currency:
|
|
16
|
-
currencySymbol:
|
|
17
|
-
countryCode:
|
|
18
|
-
storeId: Number(
|
|
19
|
+
lang: env.ECOM_LANG || DEFAULT_LANG,
|
|
20
|
+
currency: env.ECOM_CURRENCY || DEFAULT_CURRENCY,
|
|
21
|
+
currencySymbol: env.ECOM_CURRENCY_SYMBOL || DEFAULT_CURRENCY_SYMBOL,
|
|
22
|
+
countryCode: env.ECOM_COUNTRY_CODE || DEFAULT_COUNTRY_CODE,
|
|
23
|
+
storeId: Number(env.ECOM_STORE_ID),
|
|
19
24
|
httpsFunctionOptions: {
|
|
20
|
-
region:
|
|
25
|
+
region: env.DEPLOY_REGION || 'us-east1',
|
|
21
26
|
},
|
|
22
27
|
apps: {
|
|
23
28
|
discounts: {
|
|
24
|
-
appId:
|
|
29
|
+
appId: 1252,
|
|
25
30
|
},
|
|
26
31
|
},
|
|
27
32
|
},
|
|
@@ -34,7 +39,7 @@ export default {
|
|
|
34
39
|
set(config) {
|
|
35
40
|
self.__config = deepmerge(self.__config, config);
|
|
36
41
|
if (config.storeId) {
|
|
37
|
-
|
|
42
|
+
env.ECOM_STORE_ID = config.storeId;
|
|
38
43
|
}
|
|
39
44
|
},
|
|
40
45
|
};
|