prime-sdk 1.0.0 → 1.1.2
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/README.md +106 -12
- package/dist/app.module.js +36 -0
- package/dist/app.module.js.map +1 -1
- package/dist/app.service.d.ts +5 -1
- package/dist/app.service.js +20 -2
- package/dist/app.service.js.map +1 -1
- package/dist/external/aws/kms/kms.provider.d.ts +12 -0
- package/dist/external/aws/kms/kms.provider.js +31 -0
- package/dist/external/aws/kms/kms.provider.js.map +1 -0
- package/dist/external/aws/kms/kms.service.d.ts +9 -0
- package/dist/external/aws/{sqs.service.js → kms/kms.service.js} +20 -30
- package/dist/external/aws/kms/kms.service.js.map +1 -0
- package/dist/external/aws/{sqs.provider.d.ts → s3/s3.provider.d.ts} +4 -4
- package/dist/external/aws/s3/s3.provider.js +31 -0
- package/dist/external/aws/s3/s3.provider.js.map +1 -0
- package/dist/external/aws/s3/s3.service.d.ts +12 -0
- package/dist/external/aws/s3/s3.service.js +73 -0
- package/dist/external/aws/s3/s3.service.js.map +1 -0
- package/dist/external/aws/ses/ses.provider.d.ts +12 -0
- package/dist/external/aws/ses/ses.provider.js +31 -0
- package/dist/external/aws/ses/ses.provider.js.map +1 -0
- package/dist/external/aws/ses/ses.service.d.ts +9 -0
- package/dist/external/aws/ses/ses.service.js +60 -0
- package/dist/external/aws/ses/ses.service.js.map +1 -0
- package/dist/external/aws/sns/sns.provider.d.ts +12 -0
- package/dist/external/aws/sns/sns.provider.js +31 -0
- package/dist/external/aws/sns/sns.provider.js.map +1 -0
- package/dist/external/aws/sns/sns.service.d.ts +9 -0
- package/dist/external/aws/sns/sns.service.js +43 -0
- package/dist/external/aws/sns/sns.service.js.map +1 -0
- package/dist/lib/crypto/crypto.d.ts +9 -0
- package/dist/lib/crypto/crypto.js +35 -0
- package/dist/lib/crypto/crypto.js.map +1 -0
- package/dist/lib/crypto/crypto.module.d.ts +5 -0
- package/dist/lib/crypto/crypto.module.js +30 -0
- package/dist/lib/crypto/crypto.module.js.map +1 -0
- package/dist/lib/crypto/interfaces/crypto.interface.d.ts +7 -0
- package/dist/lib/crypto/interfaces/crypto.interface.js +5 -0
- package/dist/lib/crypto/interfaces/crypto.interface.js.map +1 -0
- package/dist/lib/crypto/types/crypto.type.d.ts +9 -0
- package/dist/lib/crypto/types/crypto.type.js +3 -0
- package/dist/lib/crypto/types/crypto.type.js.map +1 -0
- package/dist/lib/email/email.d.ts +9 -0
- package/dist/lib/email/email.js +35 -0
- package/dist/lib/email/email.js.map +1 -0
- package/dist/lib/email/email.module.d.ts +5 -0
- package/dist/lib/email/email.module.js +30 -0
- package/dist/lib/email/email.module.js.map +1 -0
- package/dist/lib/email/interfaces/email.interface.d.ts +7 -0
- package/dist/lib/email/interfaces/email.interface.js +5 -0
- package/dist/lib/email/interfaces/email.interface.js.map +1 -0
- package/dist/lib/email/types/email.type.d.ts +11 -0
- package/dist/lib/email/types/email.type.js +3 -0
- package/dist/lib/email/types/email.type.js.map +1 -0
- package/dist/lib/events/event.module.d.ts +5 -0
- package/dist/lib/events/event.module.js +30 -0
- package/dist/lib/events/event.module.js.map +1 -0
- package/dist/lib/events/events.d.ts +7 -0
- package/dist/lib/events/events.js +19 -1
- package/dist/lib/events/events.js.map +1 -1
- package/dist/lib/events/interfaces/event.interface.d.ts +7 -0
- package/dist/lib/events/interfaces/event.interface.js +5 -0
- package/dist/lib/events/interfaces/event.interface.js.map +1 -0
- package/dist/lib/events/types/event.type.d.ts +8 -0
- package/dist/lib/events/types/event.type.js +3 -0
- package/dist/lib/events/types/event.type.js.map +1 -0
- package/dist/lib/storage/interfaces/storage.interface.d.ts +10 -0
- package/dist/lib/storage/interfaces/storage.interface.js +5 -0
- package/dist/lib/storage/interfaces/storage.interface.js.map +1 -0
- package/dist/lib/storage/storage.d.ts +10 -0
- package/dist/lib/storage/storage.js +28 -1
- package/dist/lib/storage/storage.js.map +1 -1
- package/dist/lib/storage/storage.module.d.ts +5 -0
- package/dist/lib/storage/storage.module.js +30 -0
- package/dist/lib/storage/storage.module.js.map +1 -0
- package/dist/lib/storage/types/storage.type.d.ts +22 -0
- package/dist/lib/storage/types/storage.type.js +3 -0
- package/dist/lib/storage/types/storage.type.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +7 -2
- package/queue.bash +3 -3
- package/src/app.module.ts +37 -0
- package/src/app.service.ts +24 -1
- package/src/external/aws/kms/kms.provider.ts +39 -0
- package/src/external/aws/kms/kms.service.ts +33 -0
- package/src/external/aws/s3/s3.provider.ts +39 -0
- package/src/external/aws/s3/s3.service.ts +86 -0
- package/src/external/aws/ses/ses.provider.ts +39 -0
- package/src/external/aws/ses/ses.service.ts +52 -0
- package/src/external/aws/sns/sns.provider.ts +39 -0
- package/src/external/aws/sns/sns.service.ts +31 -0
- package/src/lib/crypto/crypto.module.ts +17 -0
- package/src/lib/crypto/crypto.ts +20 -0
- package/src/lib/crypto/interfaces/crypto.interface.ts +12 -0
- package/src/lib/crypto/types/crypto.type.ts +3 -0
- package/src/lib/email/email.module.ts +17 -0
- package/src/lib/email/email.ts +20 -0
- package/src/lib/email/interfaces/email.interface.ts +12 -0
- package/src/lib/email/types/email.type.ts +12 -0
- package/src/lib/events/event.module.ts +17 -0
- package/src/lib/events/events.ts +15 -2
- package/src/lib/events/interfaces/event.interface.ts +9 -0
- package/src/lib/events/types/event.type.ts +9 -0
- package/src/lib/storage/interfaces/storage.interface.ts +22 -0
- package/src/lib/storage/storage.module.ts +17 -0
- package/src/lib/storage/storage.ts +37 -2
- package/src/lib/storage/types/storage.type.ts +24 -0
- package/dist/external/aws/sqs.provider.js +0 -31
- package/dist/external/aws/sqs.provider.js.map +0 -1
- package/dist/external/aws/sqs.service.d.ts +0 -17
- package/dist/external/aws/sqs.service.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prime-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "swiss army knife",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"author": "",
|
|
8
8
|
"private": false,
|
|
9
|
-
"license": "
|
|
9
|
+
"license": "MIT",
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "nest build",
|
|
12
12
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
@@ -22,7 +22,12 @@
|
|
|
22
22
|
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
+
"@aws-sdk/client-kms": "^3.572.0",
|
|
26
|
+
"@aws-sdk/client-s3": "^3.572.0",
|
|
27
|
+
"@aws-sdk/client-ses": "^3.572.0",
|
|
28
|
+
"@aws-sdk/client-sns": "^3.572.0",
|
|
25
29
|
"@aws-sdk/client-sqs": "^3.569.0",
|
|
30
|
+
"@aws-sdk/s3-request-presigner": "^3.572.0",
|
|
26
31
|
"@nestjs/common": "^10.0.0",
|
|
27
32
|
"@nestjs/config": "^3.2.2",
|
|
28
33
|
"@nestjs/core": "^10.0.0",
|
package/queue.bash
CHANGED
|
@@ -2,6 +2,6 @@ awslocal sqs delete-queue --queue-url=http://localhost:4566/000000000000/teste
|
|
|
2
2
|
awslocal sqs create-queue --queue-name teste
|
|
3
3
|
awslocal sqs purge-queue --queue-url=http://localhost:4566/000000000000/teste
|
|
4
4
|
|
|
5
|
-
awslocal sns delete-topic --topic-arn arn:aws:sns:us-east-1:000000000000:
|
|
6
|
-
awslocal sns create-topic --name
|
|
7
|
-
awslocal sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:
|
|
5
|
+
awslocal sns delete-topic --topic-arn arn:aws:sns:us-east-1:000000000000:teste-topic
|
|
6
|
+
awslocal sns create-topic --name teste-topic
|
|
7
|
+
awslocal sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:teste-topic --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:000000000000:teste --attributes RawMessageDelivery=true
|
package/src/app.module.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { Module } from '@nestjs/common';
|
|
2
2
|
import { AppService } from './app.service';
|
|
3
3
|
import { QueueModule } from './lib/queue/queue.module';
|
|
4
|
+
import { StorageModule } from './lib/storage/storage.module';
|
|
5
|
+
import { EventModule } from './lib/events/event.module';
|
|
6
|
+
import { CryptoModule } from './lib/crypto/crypto.module';
|
|
7
|
+
import { EmailModule } from './lib/email/email.module';
|
|
4
8
|
|
|
9
|
+
//Example
|
|
5
10
|
@Module({
|
|
6
11
|
imports: [
|
|
7
12
|
QueueModule.forRoot({
|
|
@@ -12,6 +17,38 @@ import { QueueModule } from './lib/queue/queue.module';
|
|
|
12
17
|
endpoint: 'http://localhost:4566/',
|
|
13
18
|
region: 'us-east-1',
|
|
14
19
|
}),
|
|
20
|
+
StorageModule.forRoot({
|
|
21
|
+
credentials: {
|
|
22
|
+
accessKeyId: '000000000',
|
|
23
|
+
secretAccessKey: '000000000',
|
|
24
|
+
},
|
|
25
|
+
endpoint: 'http://localhost:4566/sample-bucket',
|
|
26
|
+
region: 'us-east-1',
|
|
27
|
+
}),
|
|
28
|
+
EventModule.forRoot({
|
|
29
|
+
credentials: {
|
|
30
|
+
accessKeyId: '000000000',
|
|
31
|
+
secretAccessKey: '000000000',
|
|
32
|
+
},
|
|
33
|
+
endpoint: 'http://localhost:4566/',
|
|
34
|
+
region: 'us-east-1',
|
|
35
|
+
}),
|
|
36
|
+
CryptoModule.forRoot({
|
|
37
|
+
credentials: {
|
|
38
|
+
accessKeyId: '000000000',
|
|
39
|
+
secretAccessKey: '000000000',
|
|
40
|
+
},
|
|
41
|
+
endpoint: 'http://localhost:4566/',
|
|
42
|
+
region: 'us-east-1',
|
|
43
|
+
}),
|
|
44
|
+
EmailModule.forRoot({
|
|
45
|
+
credentials: {
|
|
46
|
+
accessKeyId: '000000000',
|
|
47
|
+
secretAccessKey: '000000000',
|
|
48
|
+
},
|
|
49
|
+
endpoint: 'http://localhost:4566/',
|
|
50
|
+
region: 'us-east-1',
|
|
51
|
+
}),
|
|
15
52
|
],
|
|
16
53
|
providers: [AppService],
|
|
17
54
|
exports: [],
|
package/src/app.service.ts
CHANGED
|
@@ -2,10 +2,16 @@ import { Injectable } from '@nestjs/common';
|
|
|
2
2
|
import { IConsumer } from './lib/queue/interfaces/consumer.interface';
|
|
3
3
|
import { Message } from '@aws-sdk/client-sqs';
|
|
4
4
|
import { Queue } from './lib/queue/queue';
|
|
5
|
+
import { Storage } from './lib/storage/storage';
|
|
6
|
+
import { Events } from './lib/events/events';
|
|
5
7
|
|
|
6
8
|
@Injectable()
|
|
7
9
|
export class AppService implements IConsumer {
|
|
8
|
-
constructor(
|
|
10
|
+
constructor(
|
|
11
|
+
private readonly queueHandler: Queue,
|
|
12
|
+
private readonly storage: Storage,
|
|
13
|
+
private readonly event: Events,
|
|
14
|
+
) {
|
|
9
15
|
this.queueHandler.handler({
|
|
10
16
|
QueueUrl: `${'teste'}`,
|
|
11
17
|
context: this,
|
|
@@ -16,6 +22,23 @@ export class AppService implements IConsumer {
|
|
|
16
22
|
|
|
17
23
|
handleMessage(message: Message | Message[]): Promise<void> {
|
|
18
24
|
console.log(message);
|
|
25
|
+
|
|
26
|
+
const data = JSON.stringify({ teste: new Date().toISOString() });
|
|
27
|
+
|
|
28
|
+
this.event.triggerEvent({
|
|
29
|
+
topic: 'arn:aws:sns:us-east-1:000000000000:teste-topic',
|
|
30
|
+
message: data,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const file = Buffer.from(data, 'utf-8');
|
|
34
|
+
|
|
35
|
+
this.storage.uploadFile({
|
|
36
|
+
bucket: 'sample-bucket',
|
|
37
|
+
file: file,
|
|
38
|
+
nameFile: 'teste.txt',
|
|
39
|
+
path: 'prime-sdk',
|
|
40
|
+
});
|
|
41
|
+
|
|
19
42
|
return;
|
|
20
43
|
}
|
|
21
44
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { KMSClient } from '@aws-sdk/client-kms';
|
|
2
|
+
import { DynamicModule } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
export type KMSSetup = {
|
|
5
|
+
region: string;
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
credentials: {
|
|
8
|
+
accessKeyId: string;
|
|
9
|
+
secretAccessKey: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const KMSProvider = (params: KMSSetup) => {
|
|
14
|
+
return {
|
|
15
|
+
provide: 'CONNECTION_KMS',
|
|
16
|
+
useFactory: () => {
|
|
17
|
+
return new KMSClient({
|
|
18
|
+
credentials: {
|
|
19
|
+
accessKeyId: params.credentials.accessKeyId,
|
|
20
|
+
secretAccessKey: params.credentials.secretAccessKey,
|
|
21
|
+
},
|
|
22
|
+
...(params.endpoint && { endpoint: params.endpoint }),
|
|
23
|
+
region: params.region,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export class KMSModule {
|
|
30
|
+
static forRoot(params: KMSSetup): DynamicModule {
|
|
31
|
+
const kmsProvider = KMSProvider(params);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
module: KMSModule,
|
|
35
|
+
providers: [kmsProvider],
|
|
36
|
+
exports: [kmsProvider],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import {
|
|
3
|
+
DecryptCommand,
|
|
4
|
+
DecryptCommandOutput,
|
|
5
|
+
EncryptCommand,
|
|
6
|
+
EncryptCommandOutput,
|
|
7
|
+
KMSClient,
|
|
8
|
+
} from '@aws-sdk/client-kms';
|
|
9
|
+
import { ICrypto } from 'src/lib/crypto/interfaces/crypto.interface';
|
|
10
|
+
import { DecryptData, EncryptData } from 'src/lib/crypto/types/crypto.type';
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class KMS implements ICrypto {
|
|
14
|
+
constructor(@Inject('CONNECTION_KMS') private readonly client: KMSClient) {}
|
|
15
|
+
|
|
16
|
+
async encrypt(data: EncryptData): Promise<EncryptCommandOutput> {
|
|
17
|
+
const command = new EncryptCommand({
|
|
18
|
+
KeyId: data.keyId,
|
|
19
|
+
Plaintext: data.value,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
return await this.client.send(command);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async decrypt(data: DecryptData): Promise<DecryptCommandOutput> {
|
|
26
|
+
const command = new DecryptCommand({
|
|
27
|
+
CiphertextBlob: data.value,
|
|
28
|
+
KeyId: data.keyId,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
return await this.client.send(command);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
2
|
+
import { DynamicModule } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
export type S3Setup = {
|
|
5
|
+
region: string;
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
credentials: {
|
|
8
|
+
accessKeyId: string;
|
|
9
|
+
secretAccessKey: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const S3Provider = (params: S3Setup) => {
|
|
14
|
+
return {
|
|
15
|
+
provide: 'CONNECTION_S3',
|
|
16
|
+
useFactory: () => {
|
|
17
|
+
return new S3Client({
|
|
18
|
+
credentials: {
|
|
19
|
+
accessKeyId: params.credentials.accessKeyId,
|
|
20
|
+
secretAccessKey: params.credentials.secretAccessKey,
|
|
21
|
+
},
|
|
22
|
+
...(params.endpoint && { endpoint: params.endpoint }),
|
|
23
|
+
region: params.region,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export class S3Module {
|
|
30
|
+
static forRoot(params: S3Setup): DynamicModule {
|
|
31
|
+
const s3Provider = S3Provider(params);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
module: S3Module,
|
|
35
|
+
providers: [s3Provider],
|
|
36
|
+
exports: [s3Provider],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DeleteObjectCommand,
|
|
3
|
+
DeleteObjectCommandOutput,
|
|
4
|
+
GetObjectCommand,
|
|
5
|
+
GetObjectCommandOutput,
|
|
6
|
+
ListObjectsV2Command,
|
|
7
|
+
ListObjectsV2CommandOutput,
|
|
8
|
+
PutObjectCommand,
|
|
9
|
+
PutObjectCommandOutput,
|
|
10
|
+
S3Client,
|
|
11
|
+
} from '@aws-sdk/client-s3';
|
|
12
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
13
|
+
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
|
14
|
+
import { IStorage } from '../../../lib/storage/interfaces/storage.interface';
|
|
15
|
+
import {
|
|
16
|
+
DeleteFile,
|
|
17
|
+
GetFile,
|
|
18
|
+
ListFiles,
|
|
19
|
+
UploadFile,
|
|
20
|
+
} from '../../../lib/storage/types/storage.type';
|
|
21
|
+
|
|
22
|
+
@Injectable()
|
|
23
|
+
export class S3 implements IStorage {
|
|
24
|
+
constructor(@Inject('CONNECTION_S3') private readonly client: S3Client) {}
|
|
25
|
+
|
|
26
|
+
async uploadFile(file: UploadFile): Promise<PutObjectCommandOutput> {
|
|
27
|
+
const command = new PutObjectCommand({
|
|
28
|
+
Bucket: file.bucket,
|
|
29
|
+
Key: `${file.path}/${file.nameFile}`,
|
|
30
|
+
Body: file.file,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const response = await this.client.send(command);
|
|
34
|
+
|
|
35
|
+
return response;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async generateSignUrlFile(file: GetFile): Promise<string> {
|
|
39
|
+
const params = {
|
|
40
|
+
Bucket: file.bucket,
|
|
41
|
+
Key: file.key,
|
|
42
|
+
ResponseContentType: file.responseContentType,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const command = new GetObjectCommand(params);
|
|
46
|
+
|
|
47
|
+
const url = await getSignedUrl(this.client, command, { expiresIn: 3600 });
|
|
48
|
+
|
|
49
|
+
return url;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async getFile(file: GetFile): Promise<GetObjectCommandOutput> {
|
|
53
|
+
const params = {
|
|
54
|
+
Bucket: file.bucket,
|
|
55
|
+
Key: file.key,
|
|
56
|
+
ResponseContentType: file.responseContentType,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const command = new GetObjectCommand(params);
|
|
60
|
+
|
|
61
|
+
const response = await this.client.send(command);
|
|
62
|
+
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async listFiles(data: ListFiles): Promise<ListObjectsV2CommandOutput> {
|
|
67
|
+
const params = { Bucket: data.bucket, Prefix: data.folder };
|
|
68
|
+
|
|
69
|
+
const command = new ListObjectsV2Command(params);
|
|
70
|
+
|
|
71
|
+
const response = await this.client.send(command);
|
|
72
|
+
|
|
73
|
+
return response;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async deleteFile(file: DeleteFile): Promise<DeleteObjectCommandOutput> {
|
|
77
|
+
const params = {
|
|
78
|
+
Bucket: file.bucket,
|
|
79
|
+
Key: file.key,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const command = new DeleteObjectCommand(params);
|
|
83
|
+
|
|
84
|
+
return await this.client.send(command);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { SESClient } from '@aws-sdk/client-ses';
|
|
2
|
+
import { DynamicModule } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
export type SESSetup = {
|
|
5
|
+
region: string;
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
credentials: {
|
|
8
|
+
accessKeyId: string;
|
|
9
|
+
secretAccessKey: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const SESProvider = (params: SESSetup) => {
|
|
14
|
+
return {
|
|
15
|
+
provide: 'CONNECTION_SES',
|
|
16
|
+
useFactory: () => {
|
|
17
|
+
return new SESClient({
|
|
18
|
+
credentials: {
|
|
19
|
+
accessKeyId: params.credentials.accessKeyId,
|
|
20
|
+
secretAccessKey: params.credentials.secretAccessKey,
|
|
21
|
+
},
|
|
22
|
+
...(params.endpoint && { endpoint: params.endpoint }),
|
|
23
|
+
region: params.region,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export class SESModule {
|
|
30
|
+
static forRoot(params: SESSetup): DynamicModule {
|
|
31
|
+
const sesProvider = SESProvider(params);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
module: SESModule,
|
|
35
|
+
providers: [sesProvider],
|
|
36
|
+
exports: [sesProvider],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import {
|
|
3
|
+
SendEmailCommand,
|
|
4
|
+
SendEmailCommandOutput,
|
|
5
|
+
SendRawEmailCommand,
|
|
6
|
+
SendRawEmailCommandOutput,
|
|
7
|
+
SESClient,
|
|
8
|
+
} from '@aws-sdk/client-ses';
|
|
9
|
+
import { IEmail } from 'src/lib/email/interfaces/email.interface';
|
|
10
|
+
import { SendMail, SendRawMail } from 'src/lib/email/types/email.type';
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class SES implements IEmail {
|
|
14
|
+
constructor(@Inject('CONNECTION_SES') private readonly client: SESClient) {}
|
|
15
|
+
|
|
16
|
+
async sendRawEmail(data: SendRawMail): Promise<SendRawEmailCommandOutput> {
|
|
17
|
+
const resEncodedMessage = new TextEncoder().encode(data.message);
|
|
18
|
+
|
|
19
|
+
const params = {
|
|
20
|
+
Source: data.from,
|
|
21
|
+
Destination: data.to,
|
|
22
|
+
RawMessage: {
|
|
23
|
+
Data: resEncodedMessage,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const command = new SendRawEmailCommand(params);
|
|
28
|
+
|
|
29
|
+
return await this.client.send(command);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async sendEmail(data: SendMail): Promise<SendEmailCommandOutput> {
|
|
33
|
+
const command = new SendEmailCommand({
|
|
34
|
+
Source: data.source,
|
|
35
|
+
Destination: { ToAddresses: data.destination },
|
|
36
|
+
Message: {
|
|
37
|
+
Body: {
|
|
38
|
+
Html: {
|
|
39
|
+
Charset: 'UTF-8',
|
|
40
|
+
Data: data.message,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
Subject: {
|
|
44
|
+
Charset: 'UTF-8',
|
|
45
|
+
Data: data.message,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return await this.client.send(command);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { SNSClient } from '@aws-sdk/client-sns';
|
|
2
|
+
import { DynamicModule } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
export type SNSSetup = {
|
|
5
|
+
region: string;
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
credentials: {
|
|
8
|
+
accessKeyId: string;
|
|
9
|
+
secretAccessKey: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const SNSProvider = (params: SNSSetup) => {
|
|
14
|
+
return {
|
|
15
|
+
provide: 'CONNECTION_SNS',
|
|
16
|
+
useFactory: () => {
|
|
17
|
+
return new SNSClient({
|
|
18
|
+
credentials: {
|
|
19
|
+
accessKeyId: params.credentials.accessKeyId,
|
|
20
|
+
secretAccessKey: params.credentials.secretAccessKey,
|
|
21
|
+
},
|
|
22
|
+
...(params.endpoint && { endpoint: params.endpoint }),
|
|
23
|
+
region: params.region,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export class SNSModule {
|
|
30
|
+
static forRoot(params: SNSSetup): DynamicModule {
|
|
31
|
+
const snsProvider = SNSProvider(params);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
module: SNSModule,
|
|
35
|
+
providers: [snsProvider],
|
|
36
|
+
exports: [snsProvider],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PublishCommand,
|
|
3
|
+
PublishCommandOutput,
|
|
4
|
+
SNSClient,
|
|
5
|
+
} from '@aws-sdk/client-sns';
|
|
6
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
7
|
+
import { IEvent } from 'src/lib/events/interfaces/event.interface';
|
|
8
|
+
import { EventData, EventSmsData } from 'src/lib/events/types/event.type';
|
|
9
|
+
|
|
10
|
+
@Injectable()
|
|
11
|
+
export class Sns implements IEvent {
|
|
12
|
+
constructor(@Inject('CONNECTION_SNS') private readonly client: SNSClient) {}
|
|
13
|
+
|
|
14
|
+
async publishSns(event: EventData): Promise<PublishCommandOutput> {
|
|
15
|
+
const command = new PublishCommand({
|
|
16
|
+
TopicArn: event.topic,
|
|
17
|
+
Message: event.message,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
return await this.client.send(command);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async publishSms(event: EventSmsData): Promise<PublishCommandOutput> {
|
|
24
|
+
const command = new PublishCommand({
|
|
25
|
+
PhoneNumber: event.phoneNumber,
|
|
26
|
+
Message: event.message,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return await this.client.send(command);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DynamicModule, Module } from '@nestjs/common';
|
|
2
|
+
import { Crypto } from './crypto';
|
|
3
|
+
import { ICrypto } from './interfaces/crypto.interface';
|
|
4
|
+
import { KMS } from '../../external/aws/kms/kms.service';
|
|
5
|
+
import { KMSModule, KMSSetup } from 'src/external/aws/kms/kms.provider';
|
|
6
|
+
|
|
7
|
+
@Module({})
|
|
8
|
+
export class CryptoModule {
|
|
9
|
+
static forRoot(params: KMSSetup): DynamicModule {
|
|
10
|
+
return {
|
|
11
|
+
module: CryptoModule,
|
|
12
|
+
imports: [KMSModule.forRoot(params)],
|
|
13
|
+
providers: [Crypto, { provide: ICrypto, useClass: KMS }],
|
|
14
|
+
exports: [Crypto, { provide: ICrypto, useClass: KMS }],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { ICrypto } from './interfaces/crypto.interface';
|
|
3
|
+
import {
|
|
4
|
+
DecryptCommandOutput,
|
|
5
|
+
EncryptCommandOutput,
|
|
6
|
+
} from '@aws-sdk/client-kms';
|
|
7
|
+
import { DecryptData, EncryptData } from './types/crypto.type';
|
|
8
|
+
|
|
9
|
+
@Injectable()
|
|
10
|
+
export class Crypto {
|
|
11
|
+
constructor(@Inject(ICrypto) private readonly crypto: ICrypto) {}
|
|
12
|
+
|
|
13
|
+
async encrypt(data: EncryptData): Promise<EncryptCommandOutput> {
|
|
14
|
+
return await this.crypto.encrypt(data);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async decrypt(data: DecryptData): Promise<DecryptCommandOutput> {
|
|
18
|
+
return await this.crypto.encrypt(data);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DecryptCommandOutput,
|
|
3
|
+
EncryptCommandOutput,
|
|
4
|
+
} from '@aws-sdk/client-kms';
|
|
5
|
+
import { DecryptData, EncryptData } from '../types/crypto.type';
|
|
6
|
+
|
|
7
|
+
export interface ICrypto {
|
|
8
|
+
encrypt(data: EncryptData): Promise<EncryptCommandOutput>;
|
|
9
|
+
decrypt(data: DecryptData): Promise<DecryptCommandOutput>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const ICrypto = Symbol('ICrypto');
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DynamicModule, Module } from '@nestjs/common';
|
|
2
|
+
import { SESModule, SESSetup } from 'src/external/aws/ses/ses.provider';
|
|
3
|
+
import { IEmail } from './interfaces/email.interface';
|
|
4
|
+
import { SES } from 'src/external/aws/ses/ses.service';
|
|
5
|
+
import { Email } from './email';
|
|
6
|
+
|
|
7
|
+
@Module({})
|
|
8
|
+
export class EmailModule {
|
|
9
|
+
static forRoot(params: SESSetup): DynamicModule {
|
|
10
|
+
return {
|
|
11
|
+
module: EmailModule,
|
|
12
|
+
imports: [SESModule.forRoot(params)],
|
|
13
|
+
providers: [Email, { provide: IEmail, useClass: SES }],
|
|
14
|
+
exports: [Email, { provide: IEmail, useClass: SES }],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { IEmail } from './interfaces/email.interface';
|
|
3
|
+
import {
|
|
4
|
+
SendEmailCommandOutput,
|
|
5
|
+
SendRawEmailCommandOutput,
|
|
6
|
+
} from '@aws-sdk/client-ses';
|
|
7
|
+
import { SendMail, SendRawMail } from './types/email.type';
|
|
8
|
+
|
|
9
|
+
@Injectable()
|
|
10
|
+
export class Email {
|
|
11
|
+
constructor(@Inject(IEmail) private readonly email: IEmail) {}
|
|
12
|
+
|
|
13
|
+
async sendRawEmail(data: SendRawMail): Promise<SendRawEmailCommandOutput> {
|
|
14
|
+
return await this.email.sendRawEmail(data);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async sendEmail(data: SendMail): Promise<SendEmailCommandOutput> {
|
|
18
|
+
return await this.email.sendEmail(data);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SendEmailCommandOutput,
|
|
3
|
+
SendRawEmailCommandOutput,
|
|
4
|
+
} from '@aws-sdk/client-ses';
|
|
5
|
+
import { SendMail, SendRawMail } from '../types/email.type';
|
|
6
|
+
|
|
7
|
+
export interface IEmail {
|
|
8
|
+
sendRawEmail(data: SendRawMail): Promise<SendRawEmailCommandOutput>;
|
|
9
|
+
sendEmail(data: SendMail): Promise<SendEmailCommandOutput>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const IEmail = Symbol('IEmail');
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DynamicModule, Module } from '@nestjs/common';
|
|
2
|
+
import { SNSModule, SNSSetup } from '../../external/aws/sns/sns.provider';
|
|
3
|
+
import { IEvent } from './interfaces/event.interface';
|
|
4
|
+
import { Sns } from 'src/external/aws/sns/sns.service';
|
|
5
|
+
import { Events } from './events';
|
|
6
|
+
|
|
7
|
+
@Module({})
|
|
8
|
+
export class EventModule {
|
|
9
|
+
static forRoot(params: SNSSetup): DynamicModule {
|
|
10
|
+
return {
|
|
11
|
+
module: EventModule,
|
|
12
|
+
imports: [SNSModule.forRoot(params)],
|
|
13
|
+
providers: [Events, { provide: IEvent, useClass: Sns }],
|
|
14
|
+
exports: [Events, { provide: IEvent, useClass: Sns }],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
package/src/lib/events/events.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { IEvent } from './interfaces/event.interface';
|
|
3
|
+
import { EventData, EventSmsData } from './types/event.type';
|
|
4
|
+
import { PublishCommandOutput } from '@aws-sdk/client-sns';
|
|
2
5
|
|
|
3
6
|
@Injectable()
|
|
4
|
-
export class Events {
|
|
7
|
+
export class Events {
|
|
8
|
+
constructor(@Inject(IEvent) private readonly event: IEvent) {}
|
|
9
|
+
|
|
10
|
+
async triggerEvent(event: EventData): Promise<PublishCommandOutput> {
|
|
11
|
+
return this.event.publishSns(event);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async publishSms(event: EventSmsData): Promise<PublishCommandOutput> {
|
|
15
|
+
return this.event.publishSms(event);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PublishCommandOutput } from '@aws-sdk/client-sns';
|
|
2
|
+
import { EventData, EventSmsData } from '../types/event.type';
|
|
3
|
+
|
|
4
|
+
export interface IEvent {
|
|
5
|
+
publishSns(event: EventData): Promise<PublishCommandOutput>;
|
|
6
|
+
publishSms(event: EventSmsData): Promise<PublishCommandOutput>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const IEvent = Symbol('IEvent');
|