Skip to content

Commit

Permalink
Merge branch 'feature/sts-support' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
guotingchao committed May 10, 2024
2 parents 24126b4 + aa2a562 commit 6828140
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/clean-starfishes-applaud.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@cardbrother/nestjs-tencent-cloud-sdk": patch
---

Add STS support
5 changes: 5 additions & 0 deletions src/@cardbrother/tencent-cloud-sdk/client-factory.provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Injectable } from '@nestjs/common';
import { CosProvider } from './cos/cos.provider';
import { OcrProvider } from './ocr/ocr.provider';
import { SmsProvider } from './sms/sms.provider';
import { StsProvider } from './sts/sts.provider';
// assuming these imports are available
import {
ClientTypeToClassMap,
Expand All @@ -15,6 +16,7 @@ export class ClientFactoryProvider {
private readonly smsProvider: SmsProvider,
private readonly ocrProvider: OcrProvider,
private readonly cosProvider: CosProvider,
private readonly stsProvider: StsProvider,
) {}

public async createClient<
Expand All @@ -30,6 +32,9 @@ export class ClientFactoryProvider {
case 'COS':
case TencentCloudClientType.COS:
return this.cosProvider as ClientTypeToClassMap[T];
case 'STS':
case TencentCloudClientType.STS:
return this.stsProvider as ClientTypeToClassMap[T];
default:
throw new Error('Unknown client type: ' + clientType);
}
Expand Down
26 changes: 26 additions & 0 deletions src/@cardbrother/tencent-cloud-sdk/sts/sts.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import {
GetFederationTokenRequest,
GetFederationTokenResponse,
QueryApiKeyRequest,
QueryApiKeyResponse,
} from 'tencentcloud-sdk-nodejs/tencentcloud/services/sts/v20180813/sts_models';

export interface IStsProvider {
/**
* @name 获取临时凭证签名
* @description 获取临时访问凭证 具体文档参考 https://cloud.tencent.com/document/product/1312/48195
* @param params GetFederationTokenRequest - 生成临时访问凭证参数
* @returns GetFederationTokenResponse - 返回临时访问凭证结果
*/
createTemporary: (
params: GetFederationTokenRequest,
) => Promise<GetFederationTokenResponse>;

/**
* @name 查询API密钥
* @description 查询API密钥 具体文档参考 https://cloud.tencent.com/document/product/1312/48194
* @param params QueryApiKeyRequest - 查询API密钥参数
* @returns UploadFileResult - 返回查询API密钥结果
*/
queryApiKey: (params: QueryApiKeyRequest) => Promise<QueryApiKeyResponse>;
}
42 changes: 42 additions & 0 deletions src/@cardbrother/tencent-cloud-sdk/sts/sts.provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { Inject, Injectable } from '@nestjs/common';
import { Client as StsClient } from 'tencentcloud-sdk-nodejs/tencentcloud/services/sts/v20180813/sts_client';
import {
GetFederationTokenRequest,
GetFederationTokenResponse,
QueryApiKeyRequest,
QueryApiKeyResponse,
} from 'tencentcloud-sdk-nodejs/tencentcloud/services/sts/v20180813/sts_models';

import {
TENCENT_CLOUD_MODULE_OPTIONS_TOKEN,
TencentCloudAbstructClient,
TencentCloudModuleOptions,
} from '../tencent-cloud.interface';
import { IStsProvider } from './sts.interface';

@Injectable()
export class StsProvider
extends TencentCloudAbstructClient
implements IStsProvider
{
private stsClient: StsClient;
constructor(
@Inject(TENCENT_CLOUD_MODULE_OPTIONS_TOKEN)
private readonly options: TencentCloudModuleOptions,
) {
super('sts.tencentcloudapi.com', '2018-08-13', options);
this.stsClient = new StsClient(this);
}

public async createTemporary(
params: GetFederationTokenRequest,
): Promise<GetFederationTokenResponse> {
return await this.stsClient.GetFederationToken(params);
}

public async queryApiKey(
params: QueryApiKeyRequest,
): Promise<QueryApiKeyResponse> {
return await this.stsClient.QueryApiKey(params);
}
}
3 changes: 3 additions & 0 deletions src/@cardbrother/tencent-cloud-sdk/tencent-cloud.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ClientProfile } from 'tencentcloud-sdk-nodejs/tencentcloud/common/inter
import { CosProvider } from './cos/cos.provider';
import { OcrProvider } from './ocr/ocr.provider';
import { SmsProvider } from './sms/sms.provider';
import { StsProvider } from './sts/sts.provider';

// TencentCloudClient interface
export class TencentCloudAbstructClient extends AbstractClient {
Expand Down Expand Up @@ -66,6 +67,7 @@ export enum TencentCloudClientType {
SMS = 'SMS', // 短信
OCR = 'OCR', // OCR 图像识别
COS = 'COS', // 对象存储
STS = 'STS', // 临时凭证
}

/**
Expand All @@ -76,6 +78,7 @@ export interface ClientTypeToClassMap {
SMS: SmsProvider;
OCR: OcrProvider;
COS: CosProvider;
STS: StsProvider;
}

export type TencentCloudCosOptions = {
Expand Down
9 changes: 8 additions & 1 deletion src/@cardbrother/tencent-cloud-sdk/tencent-cloud.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { ClientFactoryProvider } from './client-factory.provider';
import { CosProvider } from './cos/cos.provider';
import { OcrProvider } from './ocr/ocr.provider';
import { SmsProvider } from './sms/sms.provider';
import { StsProvider } from './sts/sts.provider';
import {
TENCENT_CLOUD_MODULE_OPTIONS_TOKEN,
TencentCloudAsyncModuleOptions,
Expand All @@ -18,7 +19,13 @@ import { TencentCloudService } from './tencent-cloud.service';
* @returns {DynamicModule}
*/
@Module({
providers: [TencentCloudService, OcrProvider, SmsProvider, CosProvider],
providers: [
TencentCloudService,
OcrProvider,
SmsProvider,
CosProvider,
StsProvider,
],
exports: [TencentCloudService],
})
export class TencentCloudModule {
Expand Down
85 changes: 85 additions & 0 deletions src/@cardbrother/tencent-cloud-sdk/tests/sts-client.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { ConfigModule, ConfigService } from '@nestjs/config';
import { Test, TestingModule } from '@nestjs/testing';

import { StsProvider } from '../sts/sts.provider';
import { TencentCloudClientType } from '../tencent-cloud.interface';
import { TencentCloudModule } from '../tencent-cloud.module';
import { TencentCloudService } from '../tencent-cloud.service';

/**
* @name @cardbrother/tencentCloudModule OCR Test
* @description This test is end to end for the tencent ocr service
*/
describe('@cardbrother/tencentCloudModule STS Test', () => {
let tencentCloudService: TencentCloudService;

beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [
TencentCloudModule.forRootAsync({
useFactory: (config: ConfigService) => {
const tencentSecretId =
config.get<string>('TENCENT_API_ID') ||
'XXXXXXXXXXXXXXXXXXXXXXXXX';
const tencentSecretKey =
config.get<string>('TENCENT_API_SECRET') ||
'XXXXXXXXXXXXXXXXXXXXXXXXX';
return {
apiId: tencentSecretId,
apiSecret: tencentSecretKey,
region: 'ap-guangzhou',
global: true,
};
},
imports: [
ConfigModule.forRoot({
envFilePath: ['.env'],
}),
],
inject: [ConfigService],
}),
],
}).compile();

tencentCloudService =
moduleFixture.get<TencentCloudService>(TencentCloudService);
});

it('should be defined', () => {
expect(tencentCloudService).toBeDefined();
});

it('should have the correct config', () => {
const options = tencentCloudService.getOptions();
expect(options).toBeDefined();
});

it('should have useClient STS Type', async () => {
const sts_client = await tencentCloudService.useClient(
TencentCloudClientType.STS,
);
expect(sts_client).toBeDefined();
expect(sts_client).toBeInstanceOf(StsProvider);

// const tempSignature = await sts_client.createTemporary({
// Name: 'CardBrother-App',
// Policy: encodeURI(
// JSON.stringify({
// version: '2.0',
// statement: [
// {
// effect: 'allow',
// action: ['cos:PutObject'],
// resource: ['*'],
// },
// ],
// }),
// ),
// DurationSeconds: 1800,
// });

// console.debug('🐛🐛🐛 --------------------------------------------🐛🐛🐛');
// console.debug('🐛🐛🐛 ::: tempSignature:::', tempSignature);
// console.debug('🐛🐛🐛 --------------------------------------------🐛🐛🐛');
});
});

0 comments on commit 6828140

Please sign in to comment.