Skip to content

Commit 47c1fbf

Browse files
committed
feat: extract api factory and add RequestClient
1 parent 9323c8d commit 47c1fbf

32 files changed

+602
-777
lines changed

.prettierignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
CHANGELOG.md
2-
*.test.js
2+
*.test.js

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@
7070
"semantic-release": "^17.0.4"
7171
},
7272
"dependencies": {
73-
"@tencent-sdk/capi": "^0.2.17",
73+
"@tencent-sdk/capi": "^0.3.0",
7474
"@ygkit/request": "^0.1.1",
75+
"cos-nodejs-sdk-v5": "^2.6.2",
7576
"moment": "^2.25.3",
7677
"tencent-cloud-sdk": "^1.0.3"
7778
}

src/modules/apigw/apis.js

Lines changed: 22 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,6 @@
1+
const { ApiFactory } = require('../../utils/api');
12
const { ApiError } = require('../../utils/error');
23

3-
function isEmpty(val) {
4-
return val === undefined || val === null || (typeof val === 'number' && isNaN(val));
5-
}
6-
7-
function cleanEmptyValue(obj) {
8-
const newObj = {};
9-
for (const key in obj) {
10-
const val = obj[key];
11-
if (!isEmpty(val)) {
12-
newObj[key] = val;
13-
}
14-
}
15-
return newObj;
16-
}
17-
18-
function apiFactory(actions) {
19-
const apis = {};
20-
actions.forEach((action) => {
21-
apis[action] = async (capi, inputs) => {
22-
inputs = cleanEmptyValue(inputs);
23-
try {
24-
const { Response } = await capi.request(
25-
{
26-
Action: action,
27-
Version: '2018-08-08',
28-
// RequestClient: 'ServerlessComponent',
29-
Token: capi.options.Token || null,
30-
...inputs,
31-
},
32-
{
33-
debug: false,
34-
ServiceType: 'apigateway',
35-
host: 'apigateway.tencentcloudapi.com',
36-
},
37-
false,
38-
);
39-
40-
if (Response && Response.Error && Response.Error.Code) {
41-
if (Response.Error.Code.indexOf('ResourceNotFound') === -1) {
42-
throw new ApiError({
43-
type: `API_APIGW_${action}`,
44-
message: `${Response.Error.Message} (reqId: ${Response.RequestId})`,
45-
reqId: Response.RequestId,
46-
code: Response.Error.Code,
47-
});
48-
}
49-
return null;
50-
}
51-
return Response.Result || Response;
52-
} catch (e) {
53-
throw new ApiError({
54-
type: `API_APIGW_${action}`,
55-
message: e.message,
56-
stack: e.stack,
57-
reqId: e.reqId,
58-
code: e.code,
59-
});
60-
}
61-
};
62-
});
63-
64-
return apis;
65-
}
66-
674
const ACTIONS = [
685
'CreateService',
696
'DeleteService',
@@ -95,6 +32,26 @@ const ACTIONS = [
9532
'BindSubDomain',
9633
'UnBindSubDomain',
9734
];
98-
const APIS = apiFactory(ACTIONS);
35+
36+
const APIS = ApiFactory({
37+
debug: true,
38+
serviceType: 'apigateway',
39+
version: '2018-08-08',
40+
actions: ACTIONS,
41+
responseHandler(Response) {
42+
return Response.Result || Response;
43+
},
44+
errorHandler(action, Response) {
45+
if (Response.Error.Code.indexOf('ResourceNotFound') === -1) {
46+
throw new ApiError({
47+
type: `API_APIGW_${action}`,
48+
message: `${Response.Error.Message} (reqId: ${Response.RequestId})`,
49+
reqId: Response.RequestId,
50+
code: Response.Error.Code,
51+
});
52+
}
53+
return null;
54+
},
55+
});
9956

10057
module.exports = APIS;

src/modules/apigw/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class Apigw {
5656
Action: 'DescribeService',
5757
ServiceId: serviceId,
5858
});
59+
console.log('detail', detail);
5960
if (detail) {
6061
detail.InnerSubDomain = detail.InternalSubDomain;
6162
exist = true;
@@ -537,7 +538,6 @@ class Apigw {
537538
if (e.code === 'FailedOperation.DomainResolveError') {
538539
customDomainOutput.push({
539540
isBinded: false,
540-
created: '创建失败',
541541
subDomain: domainItem.domain,
542542
cname: subDomain,
543543
message: `您的自定义域名还未生效,请给域名 ${domainItem.domain} 添加 CNAME 记录 ${subDomain},等待解析生效后,再次运行 'sls deploy' 完成自定义域名的配置`,

src/modules/apigw/index.test.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ async function runTest() {
1818
domain: 'test.yugasun.com',
1919
// TODO: change to your certId
2020
certificateId: 'cWOJJjax',
21-
isDefaultMapping: 'true',
21+
isDefaultMapping: false,
2222
pathMappingSet: [
2323
{
2424
path: '/',
@@ -46,10 +46,9 @@ async function runTest() {
4646
},
4747
auth: {
4848
serviceTimeout: 15,
49-
secretName: 'secret',
49+
secretName: 'authName',
5050
secretIds: ['xxx'],
5151
},
52-
5352
},
5453
{
5554
path: '/mo',
@@ -102,7 +101,6 @@ async function runTest() {
102101
const outputs = await apigw.deploy(inputs);
103102
console.log('outputs', JSON.stringify(outputs));
104103

105-
106104
await apigw.remove(outputs);
107105
}
108106

src/modules/cam/apis.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const { ApiFactory } = require('../../utils/api');
2+
3+
const ACTIONS = [
4+
'DescribeRoleList',
5+
'ListAttachedRolePolicies',
6+
'AttachRolePolicy',
7+
'CreateRole',
8+
'GetRole',
9+
'DeleteRole',
10+
];
11+
12+
const APIS = ApiFactory({
13+
// debug: true,
14+
serviceType: 'cam',
15+
version: '2019-01-16',
16+
actions: ACTIONS,
17+
});
18+
19+
module.exports = APIS;

src/modules/cam/index.js

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,27 @@
1-
const { cam } = require('tencent-cloud-sdk');
2-
const { ApiError } = require('../../utils/error');
1+
const { Capi } = require('@tencent-sdk/capi');
2+
const Apis = require('./apis');
33

44
class Cam {
55
constructor(credentials = {}, region) {
66
this.region = region || 'ap-guangzhou';
77
this.credentials = credentials;
8-
this.camClient = new cam(this.credentials);
8+
this.capi = new Capi({
9+
Region: this.region,
10+
AppId: this.credentials.AppId,
11+
SecretId: this.credentials.SecretId,
12+
SecretKey: this.credentials.SecretKey,
13+
Token: this.credentials.Token,
14+
});
915
}
1016

11-
async request(data) {
12-
try {
13-
const res = await this.camClient.request(data);
14-
15-
if (res.Response && res.Response.Error) {
16-
throw new ApiError({
17-
type: `API_CAM_${data.action}`,
18-
message: `${res.Response.Error.Message} (reqId: ${res.Response.RequestId})`,
19-
reqId: res.Response.RequestId,
20-
code: res.Response.Error.Code,
21-
});
22-
}
23-
return res;
24-
} catch (e) {
25-
throw new ApiError({
26-
type: `API_CAM_${data.action}`,
27-
message: e.message,
28-
stack: e.stack,
29-
reqId: e.reqId,
30-
code: e.code,
31-
});
32-
}
17+
async request({ Action, ...data }) {
18+
const result = await Apis[Action](this.capi, data);
19+
return result;
3320
}
3421

3522
async DescribeRoleList(page, limit) {
3623
const reqParams = {
3724
Action: 'DescribeRoleList',
38-
Version: '2019-01-16',
3925
Page: page,
4026
Rp: limit,
4127
};
@@ -45,7 +31,6 @@ class Cam {
4531
async ListRolePoliciesByRoleId(roleId, page, limit) {
4632
const reqParams = {
4733
Action: 'ListAttachedRolePolicies',
48-
Version: '2019-01-16',
4934
Page: page,
5035
Rp: limit,
5136
RoleId: roleId,
@@ -56,40 +41,53 @@ class Cam {
5641
async CreateRole(roleName, policiesDocument) {
5742
const reqParams = {
5843
Action: 'CreateRole',
59-
Version: '2019-01-16',
6044
RoleName: roleName,
6145
PolicyDocument: policiesDocument,
62-
Description: 'Serverless Framework',
46+
Description: 'Created By Serverless Framework',
6347
};
6448
return this.request(reqParams);
6549
}
6650

51+
async GetRole(roleName) {
52+
return this.request({
53+
Action: 'GetRole',
54+
RoleName: roleName,
55+
});
56+
}
57+
58+
async DeleteRole(roleName) {
59+
return this.request({
60+
Action: 'DeleteRole',
61+
RoleName: roleName,
62+
});
63+
}
64+
6765
// api limit qps 3/s
6866
async AttachRolePolicyByName(roleId, policyName) {
6967
const reqParams = {
7068
Action: 'AttachRolePolicy',
71-
Version: '2019-01-16',
7269
AttachRoleId: roleId,
7370
PolicyName: policyName,
7471
};
7572
return this.request(reqParams);
7673
}
7774

78-
async CheckSCFExcuteRole() {
79-
const ScfExcuteRoleName = 'QCS_SCFExcuteRole';
80-
81-
const roles = await this.DescribeRoleList(1, 200);
75+
async isRoleExist(roleName) {
76+
const { List = [] } = await this.DescribeRoleList(1, 200);
8277

83-
const len = roles.Response.List.length;
84-
for (var i = 0; i < len; i++) {
85-
const roleItem = roles.Response.List[i];
78+
for (var i = 0; i < List.length; i++) {
79+
const roleItem = List[i];
8680

87-
if (roleItem.RoleName == ScfExcuteRoleName) {
81+
if (roleItem.RoleName === roleName) {
8882
return true;
8983
}
9084
}
9185
return false;
9286
}
87+
88+
async CheckSCFExcuteRole() {
89+
return this.isRoleExist('QCS_SCFExcuteRole');
90+
}
9391
}
9492

9593
module.exports = Cam;

src/modules/cam/index.test.js

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,50 @@
1-
const CamUtils = require('./index');
1+
const Client = require('./index');
22

33
class ClientTest {
4-
async camTest() {
5-
const cam = new CamUtils({
6-
SecretId: '',
7-
SecretKey: '',
8-
});
9-
const ret = await cam.CheckSCFExcuteRole();
10-
console.log(ret);
11-
}
4+
async run() {
5+
const client = new Client({
6+
SecretId: '',
7+
SecretKey: '',
8+
});
9+
const roleName = 'role-test';
10+
// 1. create role
11+
const res1 = await client.CreateRole(
12+
roleName,
13+
JSON.stringify({
14+
version: '2.0',
15+
statement: [
16+
{
17+
action: 'name/sts:AssumeRole',
18+
effect: 'allow',
19+
principal: {
20+
service: ['cloudaudit.cloud.tencent.com', 'cls.cloud.tencent.com'],
21+
},
22+
},
23+
],
24+
}),
25+
);
26+
console.log('create result: ', JSON.stringify(res1));
27+
console.log('++++++++');
28+
29+
// 2. get role
30+
const res2 = await client.GetRole(roleName);
31+
console.log('get result: ', res2);
32+
console.log('++++++++');
33+
34+
const res3 = await client.isRoleExist(roleName, {});
35+
console.log('isRoleExist result: ', res3);
36+
console.log('++++++++');
37+
38+
const res4 = await client.DeleteRole(roleName, {});
39+
console.log('delete result: ', res4);
40+
console.log('++++++++');
41+
42+
const res5 = await client.CheckSCFExcuteRole();
43+
console.log('check SCFExcuteRole exist: ', res5);
44+
}
1245
}
1346

14-
new ClientTest().camTest();
47+
new ClientTest().run();
1548

1649
process.on('unhandledRejection', (e) => {
1750
throw e;

0 commit comments

Comments
 (0)