@novha/anlia-core-lib 0.1.0 → 0.2.0
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/cdk/bin/app.ts +21 -0
- package/cdk/bin/infrastructure.ts +16 -6
- package/cdk/lib/app.ts +34 -0
- package/cdk/lib/infrastructures/event-stack.ts +74 -0
- package/cdk/lib/infrastructures/storage-stack.ts +57 -0
- package/cdk.json +1 -1
- package/cdk.out/.cache/dc7aa0aafa98afcdd2faf6146c00c1c90f0e795c782e819001cf6258fc79c93e.zip +0 -0
- package/cdk.out/anlia-core-lib-app-dev.assets.json +36 -0
- package/cdk.out/anlia-core-lib-app-dev.metadata.json +109 -0
- package/cdk.out/anlia-core-lib-app-dev.template.json +157 -0
- package/cdk.out/anlia-core-lib-dev.assets.json +21 -0
- package/cdk.out/anlia-core-lib-dev.metadata.json +223 -0
- package/cdk.out/anlia-core-lib-dev.template.json +232 -0
- package/cdk.out/asset.dc7aa0aafa98afcdd2faf6146c00c1c90f0e795c782e819001cf6258fc79c93e/index.js +38 -0
- package/cdk.out/cdk.out +1 -0
- package/cdk.out/manifest.json +548 -0
- package/cdk.out/tree.json +1 -0
- package/dist/cdk/bin/app.d.ts +1 -0
- package/dist/cdk/bin/app.js +21 -0
- package/dist/cdk/bin/infrastructure.js +13 -6
- package/dist/cdk/lib/app.d.ts +6 -0
- package/dist/cdk/lib/app.js +48 -0
- package/dist/cdk/lib/infrastructure.js +29 -0
- package/dist/cdk/lib/infrastructures/event-stack.d.ts +6 -0
- package/dist/cdk/lib/infrastructures/event-stack.js +61 -0
- package/dist/cdk/lib/infrastructures/storage-stack.d.ts +8 -0
- package/dist/cdk/lib/infrastructures/storage-stack.js +46 -0
- package/dist/src/dynamoDb/DynamoDbModule.d.ts +2 -0
- package/dist/src/dynamoDb/DynamoDbModule.js +29 -0
- package/dist/src/dynamoDb/index.d.ts +4 -0
- package/dist/src/dynamoDb/index.js +18 -0
- package/dist/src/dynamoDb/ioc/index.d.ts +3 -0
- package/dist/src/dynamoDb/ioc/index.js +6 -0
- package/dist/src/dynamoDb/service/DynamoDbService.d.ts +34 -0
- package/dist/src/dynamoDb/service/DynamoDbService.js +2 -0
- package/dist/src/dynamoDb/service/DynamoDbServiceImpl.d.ts +16 -0
- package/dist/src/dynamoDb/service/DynamoDbServiceImpl.js +108 -0
- package/dist/src/eventBridge/EventBridgeModule.js +5 -1
- package/dist/src/handlers/EventLoggerHandler.d.ts +2 -0
- package/dist/src/handlers/EventLoggerHandler.js +13 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/orders/index.d.ts +1 -0
- package/dist/src/s3/S3Module.d.ts +2 -0
- package/dist/src/s3/S3Module.js +31 -0
- package/dist/src/s3/index.d.ts +4 -0
- package/dist/src/s3/index.js +18 -0
- package/dist/src/s3/ioc/index.d.ts +3 -0
- package/dist/src/s3/ioc/index.js +6 -0
- package/dist/src/s3/service/S3Service.d.ts +27 -0
- package/dist/src/s3/service/S3Service.js +2 -0
- package/dist/src/s3/service/S3ServiceImpl.d.ts +17 -0
- package/dist/src/s3/service/S3ServiceImpl.js +104 -0
- package/package.json +8 -3
- package/src/dynamoDb/DynamoDbModule.ts +18 -0
- package/src/dynamoDb/index.ts +4 -0
- package/src/dynamoDb/ioc/index.ts +3 -0
- package/src/dynamoDb/service/DynamoDbService.ts +37 -0
- package/src/dynamoDb/service/DynamoDbServiceImpl.ts +132 -0
- package/src/eventBridge/EventBridgeModule.ts +6 -1
- package/src/handlers/EventLoggerHandler.ts +11 -0
- package/src/index.ts +3 -1
- package/src/orders/index.ts +2 -1
- package/src/s3/S3Module.ts +20 -0
- package/src/s3/index.ts +4 -0
- package/src/s3/ioc/index.ts +3 -0
- package/src/s3/service/S3Service.ts +30 -0
- package/src/s3/service/S3ServiceImpl.ts +116 -0
- package/tsconfig.json +1 -2
- package/cdk/lib/infrastructure.ts +0 -37
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.AppStack = void 0;
|
|
27
|
+
const path = __importStar(require("path"));
|
|
28
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
29
|
+
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
30
|
+
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
|
|
31
|
+
const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
|
|
32
|
+
const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources");
|
|
33
|
+
class AppStack extends aws_cdk_lib_1.Stack {
|
|
34
|
+
constructor(scope, id, props) {
|
|
35
|
+
super(scope, id, props);
|
|
36
|
+
const infraPrefix = `${props.projectName}-${props.stage}`;
|
|
37
|
+
const eventQueue = aws_sqs_1.Queue.fromQueueArn(this, "EventQueue", aws_cdk_lib_1.Fn.importValue(`${infraPrefix}-event-queue-arn`));
|
|
38
|
+
const eventLogger = new aws_lambda_nodejs_1.NodejsFunction(this, "EventLogger", {
|
|
39
|
+
entry: path.join(__dirname, "../../src/handlers/EventLoggerHandler.ts"),
|
|
40
|
+
handler: "handler",
|
|
41
|
+
runtime: aws_lambda_1.Runtime.NODEJS_22_X,
|
|
42
|
+
functionName: `${infraPrefix}-event-logger`,
|
|
43
|
+
timeout: aws_cdk_lib_1.Duration.seconds(300),
|
|
44
|
+
});
|
|
45
|
+
eventLogger.addEventSource(new aws_lambda_event_sources_1.SqsEventSource(eventQueue, { batchSize: 10 }));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.AppStack = AppStack;
|
|
@@ -3,14 +3,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.InfrastructureStack = void 0;
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
const aws_events_1 = require("aws-cdk-lib/aws-events");
|
|
6
|
+
const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
|
|
6
7
|
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
8
|
+
const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
|
|
7
9
|
class InfrastructureStack extends aws_cdk_lib_1.Stack {
|
|
8
10
|
constructor(scope, id, props) {
|
|
9
11
|
super(scope, id, props);
|
|
10
12
|
const eventBus = new aws_events_1.EventBus(this, "EventBus", {
|
|
11
13
|
eventBusName: `${props.projectName}-${props.stage}-event-bus`,
|
|
12
14
|
});
|
|
15
|
+
// ── SQS ─────────────────────────────────────────────────────────────
|
|
16
|
+
const dlq = new aws_sqs_1.Queue(this, "EventDLQ", {
|
|
17
|
+
queueName: `${props.projectName}-${props.stage}-event-dlq`,
|
|
18
|
+
retentionPeriod: aws_cdk_lib_1.Duration.days(14),
|
|
19
|
+
});
|
|
20
|
+
const eventQueue = new aws_sqs_1.Queue(this, "EventQueue", {
|
|
21
|
+
queueName: `${props.projectName}-${props.stage}-event-queue`,
|
|
22
|
+
visibilityTimeout: aws_cdk_lib_1.Duration.seconds(300),
|
|
23
|
+
deadLetterQueue: { queue: dlq, maxReceiveCount: 3 },
|
|
24
|
+
});
|
|
25
|
+
// Route every event published to the bus into the queue.
|
|
26
|
+
new aws_events_1.Rule(this, "AllEventsRule", {
|
|
27
|
+
eventBus,
|
|
28
|
+
description: "Forward all events on the bus to the event queue",
|
|
29
|
+
eventPattern: { source: aws_events_1.Match.prefix("") },
|
|
30
|
+
targets: [new aws_events_targets_1.SqsQueue(eventQueue)],
|
|
31
|
+
});
|
|
32
|
+
// ── S3 ──────────────────────────────────────────────────────────────
|
|
13
33
|
const bucket = new aws_s3_1.Bucket(this, "Bucket");
|
|
34
|
+
// ── Outputs ─────────────────────────────────────────────────────────
|
|
14
35
|
new aws_cdk_lib_1.CfnOutput(this, "EventBusArn", {
|
|
15
36
|
value: eventBus.eventBusArn,
|
|
16
37
|
exportName: `${props.projectName}-${props.stage}-event-bus-arn`,
|
|
@@ -19,6 +40,14 @@ class InfrastructureStack extends aws_cdk_lib_1.Stack {
|
|
|
19
40
|
value: eventBus.eventBusName,
|
|
20
41
|
exportName: `${props.projectName}-${props.stage}-event-bus-name`,
|
|
21
42
|
});
|
|
43
|
+
new aws_cdk_lib_1.CfnOutput(this, "EventQueueArn", {
|
|
44
|
+
value: eventQueue.queueArn,
|
|
45
|
+
exportName: `${props.projectName}-${props.stage}-event-queue-arn`,
|
|
46
|
+
});
|
|
47
|
+
new aws_cdk_lib_1.CfnOutput(this, "EventQueueUrl", {
|
|
48
|
+
value: eventQueue.queueUrl,
|
|
49
|
+
exportName: `${props.projectName}-${props.stage}-event-queue-url`,
|
|
50
|
+
});
|
|
22
51
|
new aws_cdk_lib_1.CfnOutput(this, "BucketArn", {
|
|
23
52
|
value: bucket.bucketArn,
|
|
24
53
|
exportName: `${props.projectName}-${props.stage}-bucket-arn`,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventStack = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const aws_events_1 = require("aws-cdk-lib/aws-events");
|
|
6
|
+
const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
|
|
7
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
8
|
+
const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
|
|
9
|
+
class EventStack extends aws_cdk_lib_1.Stack {
|
|
10
|
+
constructor(scope, id, props) {
|
|
11
|
+
super(scope, id, props);
|
|
12
|
+
const eventBus = new aws_events_1.EventBus(this, "EventBus", {
|
|
13
|
+
eventBusName: `${props.projectName}-${props.stage}-event-bus`,
|
|
14
|
+
});
|
|
15
|
+
// ── SQS ─────────────────────────────────────────────────────────────
|
|
16
|
+
const dlq = new aws_sqs_1.Queue(this, "EventDLQ", {
|
|
17
|
+
queueName: `${props.projectName}-${props.stage}-event-dlq`,
|
|
18
|
+
retentionPeriod: aws_cdk_lib_1.Duration.days(14),
|
|
19
|
+
});
|
|
20
|
+
const eventQueue = new aws_sqs_1.Queue(this, "EventQueue", {
|
|
21
|
+
queueName: `${props.projectName}-${props.stage}-event-queue`,
|
|
22
|
+
visibilityTimeout: aws_cdk_lib_1.Duration.seconds(300),
|
|
23
|
+
deadLetterQueue: { queue: dlq, maxReceiveCount: 3 },
|
|
24
|
+
});
|
|
25
|
+
// Route every event published to the bus into the queue.
|
|
26
|
+
new aws_events_1.Rule(this, "AllEventsRule", {
|
|
27
|
+
eventBus,
|
|
28
|
+
description: "Forward all events on the bus to the event queue",
|
|
29
|
+
eventPattern: { source: aws_events_1.Match.prefix("") },
|
|
30
|
+
targets: [new aws_events_targets_1.SqsQueue(eventQueue)],
|
|
31
|
+
});
|
|
32
|
+
// ── S3 ──────────────────────────────────────────────────────────────
|
|
33
|
+
const bucket = new aws_s3_1.Bucket(this, "Bucket");
|
|
34
|
+
// ── Outputs ─────────────────────────────────────────────────────────
|
|
35
|
+
new aws_cdk_lib_1.CfnOutput(this, "EventBusArn", {
|
|
36
|
+
value: eventBus.eventBusArn,
|
|
37
|
+
exportName: `${props.projectName}-${props.stage}-event-bus-arn`,
|
|
38
|
+
});
|
|
39
|
+
new aws_cdk_lib_1.CfnOutput(this, "EventBusName", {
|
|
40
|
+
value: eventBus.eventBusName,
|
|
41
|
+
exportName: `${props.projectName}-${props.stage}-event-bus-name`,
|
|
42
|
+
});
|
|
43
|
+
new aws_cdk_lib_1.CfnOutput(this, "EventQueueArn", {
|
|
44
|
+
value: eventQueue.queueArn,
|
|
45
|
+
exportName: `${props.projectName}-${props.stage}-event-queue-arn`,
|
|
46
|
+
});
|
|
47
|
+
new aws_cdk_lib_1.CfnOutput(this, "EventQueueUrl", {
|
|
48
|
+
value: eventQueue.queueUrl,
|
|
49
|
+
exportName: `${props.projectName}-${props.stage}-event-queue-url`,
|
|
50
|
+
});
|
|
51
|
+
new aws_cdk_lib_1.CfnOutput(this, "BucketArn", {
|
|
52
|
+
value: bucket.bucketArn,
|
|
53
|
+
exportName: `${props.projectName}-${props.stage}-bucket-arn`,
|
|
54
|
+
});
|
|
55
|
+
new aws_cdk_lib_1.CfnOutput(this, "BucketName", {
|
|
56
|
+
value: bucket.bucketName,
|
|
57
|
+
exportName: `${props.projectName}-${props.stage}-bucket-name`,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.EventStack = EventStack;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Stack } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { CommonProps } from "../../bin/project-names";
|
|
4
|
+
export declare class StorageStack extends Stack {
|
|
5
|
+
private readonly bucket;
|
|
6
|
+
private readonly orderTable;
|
|
7
|
+
constructor(scope: Construct, id: string, props: CommonProps);
|
|
8
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StorageStack = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
6
|
+
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
|
|
7
|
+
class StorageStack extends aws_cdk_lib_1.Stack {
|
|
8
|
+
constructor(scope, id, props) {
|
|
9
|
+
super(scope, id, props);
|
|
10
|
+
// ── S3 ──────────────────────────────────────────────────────────────
|
|
11
|
+
this.bucket = new aws_s3_1.Bucket(this, "Bucket");
|
|
12
|
+
// Define the DynamoDB Order table
|
|
13
|
+
this.orderTable = new aws_dynamodb_1.Table(this, 'OrderTable', {
|
|
14
|
+
tableName: `${props.projectName}-orders-${props.stage}`,
|
|
15
|
+
partitionKey: { name: 'id', type: aws_dynamodb_1.AttributeType.STRING },
|
|
16
|
+
sortKey: { name: 'providerIdentifier', type: aws_dynamodb_1.AttributeType.STRING },
|
|
17
|
+
billingMode: aws_dynamodb_1.BillingMode.PAY_PER_REQUEST,
|
|
18
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY, // NOT recommended for production
|
|
19
|
+
});
|
|
20
|
+
// Add a Global Secondary Index (GSI)
|
|
21
|
+
this.orderTable.addGlobalSecondaryIndex({
|
|
22
|
+
indexName: 'StatusUpdatedIndex',
|
|
23
|
+
partitionKey: { name: 'status', type: aws_dynamodb_1.AttributeType.STRING },
|
|
24
|
+
sortKey: { name: 'updatedUtc', type: aws_dynamodb_1.AttributeType.STRING },
|
|
25
|
+
projectionType: aws_dynamodb_1.ProjectionType.ALL,
|
|
26
|
+
});
|
|
27
|
+
// ── Outputs ─────────────────────────────────────────────────────────
|
|
28
|
+
new aws_cdk_lib_1.CfnOutput(this, "BucketArn", {
|
|
29
|
+
value: this.bucket.bucketArn,
|
|
30
|
+
exportName: `${props.projectName}-${props.stage}-bucket-arn`,
|
|
31
|
+
});
|
|
32
|
+
new aws_cdk_lib_1.CfnOutput(this, "BucketName", {
|
|
33
|
+
value: this.bucket.bucketName,
|
|
34
|
+
exportName: `${props.projectName}-${props.stage}-bucket-name`,
|
|
35
|
+
});
|
|
36
|
+
new aws_cdk_lib_1.CfnOutput(this, "OrderTableArn", {
|
|
37
|
+
value: this.orderTable.tableArn,
|
|
38
|
+
exportName: `${props.projectName}-${props.stage}-order-table-arn`,
|
|
39
|
+
});
|
|
40
|
+
new aws_cdk_lib_1.CfnOutput(this, "OrderTableName", {
|
|
41
|
+
value: this.orderTable.tableName,
|
|
42
|
+
exportName: `${props.projectName}-${props.stage}-order-table-name`,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.StorageStack = StorageStack;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.DynamoDbModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const ioc_1 = require("./ioc");
|
|
12
|
+
const DynamoDbServiceImpl_1 = require("./service/DynamoDbServiceImpl");
|
|
13
|
+
let DynamoDbModule = class DynamoDbModule {
|
|
14
|
+
};
|
|
15
|
+
exports.DynamoDbModule = DynamoDbModule;
|
|
16
|
+
exports.DynamoDbModule = DynamoDbModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
providers: [
|
|
19
|
+
{
|
|
20
|
+
provide: ioc_1.DynamoDbSymbols.DynamoDbService,
|
|
21
|
+
useFactory: () => new DynamoDbServiceImpl_1.DynamoDbServiceImpl({
|
|
22
|
+
region: process.env.AWS_REGION ?? 'us-east-1',
|
|
23
|
+
endpoint: process.env.DYNAMODB_ENDPOINT,
|
|
24
|
+
}),
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
exports: [ioc_1.DynamoDbSymbols.DynamoDbService],
|
|
28
|
+
})
|
|
29
|
+
], DynamoDbModule);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./DynamoDbModule"), exports);
|
|
18
|
+
__exportStar(require("./ioc"), exports);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface QueryParams {
|
|
2
|
+
tableName: string;
|
|
3
|
+
keyConditionExpression: string;
|
|
4
|
+
expressionAttributeValues: Record<string, unknown>;
|
|
5
|
+
expressionAttributeNames?: Record<string, string>;
|
|
6
|
+
filterExpression?: string;
|
|
7
|
+
indexName?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
exclusiveStartKey?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface ScanParams {
|
|
12
|
+
tableName: string;
|
|
13
|
+
filterExpression?: string;
|
|
14
|
+
expressionAttributeValues?: Record<string, unknown>;
|
|
15
|
+
expressionAttributeNames?: Record<string, string>;
|
|
16
|
+
limit?: number;
|
|
17
|
+
exclusiveStartKey?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface UpdateParams {
|
|
20
|
+
tableName: string;
|
|
21
|
+
key: Record<string, unknown>;
|
|
22
|
+
updateExpression: string;
|
|
23
|
+
expressionAttributeValues: Record<string, unknown>;
|
|
24
|
+
expressionAttributeNames?: Record<string, string>;
|
|
25
|
+
conditionExpression?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface IDynamoDbService {
|
|
28
|
+
get<T>(tableName: string, key: Record<string, unknown>): Promise<T | undefined>;
|
|
29
|
+
put(tableName: string, item: Record<string, unknown>): Promise<void>;
|
|
30
|
+
update(params: UpdateParams): Promise<void>;
|
|
31
|
+
delete(tableName: string, key: Record<string, unknown>): Promise<void>;
|
|
32
|
+
query<T>(params: QueryParams): Promise<T[]>;
|
|
33
|
+
scan<T>(params: ScanParams): Promise<T[]>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IDynamoDbService, QueryParams, ScanParams, UpdateParams } from './DynamoDbService';
|
|
2
|
+
export interface DynamoDbOptions {
|
|
3
|
+
region?: string;
|
|
4
|
+
/** Local DynamoDB endpoint, e.g. http://localhost:8000 */
|
|
5
|
+
endpoint?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class DynamoDbServiceImpl implements IDynamoDbService {
|
|
8
|
+
private readonly client;
|
|
9
|
+
constructor(options?: DynamoDbOptions);
|
|
10
|
+
get<T>(tableName: string, key: Record<string, unknown>): Promise<T | undefined>;
|
|
11
|
+
put(tableName: string, item: Record<string, unknown>): Promise<void>;
|
|
12
|
+
update(params: UpdateParams): Promise<void>;
|
|
13
|
+
delete(tableName: string, key: Record<string, unknown>): Promise<void>;
|
|
14
|
+
query<T>(params: QueryParams): Promise<T[]>;
|
|
15
|
+
scan<T>(params: ScanParams): Promise<T[]>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DynamoDbServiceImpl = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
15
|
+
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
16
|
+
let DynamoDbServiceImpl = class DynamoDbServiceImpl {
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
const base = new client_dynamodb_1.DynamoDBClient({
|
|
19
|
+
region: options.region ?? process.env.AWS_REGION ?? 'us-east-1',
|
|
20
|
+
endpoint: options.endpoint || undefined,
|
|
21
|
+
});
|
|
22
|
+
this.client = lib_dynamodb_1.DynamoDBDocumentClient.from(base, {
|
|
23
|
+
marshallOptions: { removeUndefinedValues: true },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async get(tableName, key) {
|
|
27
|
+
try {
|
|
28
|
+
const { Item } = await this.client.send(new lib_dynamodb_1.GetCommand({ TableName: tableName, Key: key }));
|
|
29
|
+
return Item;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new common_1.InternalServerErrorException(`DynamoDB get failed for table "${tableName}": ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async put(tableName, item) {
|
|
36
|
+
try {
|
|
37
|
+
await this.client.send(new lib_dynamodb_1.PutCommand({ TableName: tableName, Item: item }));
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw new common_1.InternalServerErrorException(`DynamoDB put failed for table "${tableName}": ${error.message}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async update(params) {
|
|
44
|
+
try {
|
|
45
|
+
await this.client.send(new lib_dynamodb_1.UpdateCommand({
|
|
46
|
+
TableName: params.tableName,
|
|
47
|
+
Key: params.key,
|
|
48
|
+
UpdateExpression: params.updateExpression,
|
|
49
|
+
ExpressionAttributeValues: params.expressionAttributeValues,
|
|
50
|
+
ExpressionAttributeNames: params.expressionAttributeNames,
|
|
51
|
+
ConditionExpression: params.conditionExpression,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error.name === 'ConditionalCheckFailedException') {
|
|
56
|
+
throw new common_1.NotFoundException(`Item not found in table "${params.tableName}".`);
|
|
57
|
+
}
|
|
58
|
+
throw new common_1.InternalServerErrorException(`DynamoDB update failed for table "${params.tableName}": ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async delete(tableName, key) {
|
|
62
|
+
try {
|
|
63
|
+
await this.client.send(new lib_dynamodb_1.DeleteCommand({ TableName: tableName, Key: key }));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
throw new common_1.InternalServerErrorException(`DynamoDB delete failed for table "${tableName}": ${error.message}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async query(params) {
|
|
70
|
+
try {
|
|
71
|
+
const { Items } = await this.client.send(new lib_dynamodb_1.QueryCommand({
|
|
72
|
+
TableName: params.tableName,
|
|
73
|
+
IndexName: params.indexName,
|
|
74
|
+
KeyConditionExpression: params.keyConditionExpression,
|
|
75
|
+
FilterExpression: params.filterExpression,
|
|
76
|
+
ExpressionAttributeValues: params.expressionAttributeValues,
|
|
77
|
+
ExpressionAttributeNames: params.expressionAttributeNames,
|
|
78
|
+
Limit: params.limit,
|
|
79
|
+
ExclusiveStartKey: params.exclusiveStartKey,
|
|
80
|
+
}));
|
|
81
|
+
return (Items ?? []);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
throw new common_1.InternalServerErrorException(`DynamoDB query failed for table "${params.tableName}": ${error.message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async scan(params) {
|
|
88
|
+
try {
|
|
89
|
+
const { Items } = await this.client.send(new lib_dynamodb_1.ScanCommand({
|
|
90
|
+
TableName: params.tableName,
|
|
91
|
+
FilterExpression: params.filterExpression,
|
|
92
|
+
ExpressionAttributeValues: params.expressionAttributeValues,
|
|
93
|
+
ExpressionAttributeNames: params.expressionAttributeNames,
|
|
94
|
+
Limit: params.limit,
|
|
95
|
+
ExclusiveStartKey: params.exclusiveStartKey,
|
|
96
|
+
}));
|
|
97
|
+
return (Items ?? []);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw new common_1.InternalServerErrorException(`DynamoDB scan failed for table "${params.tableName}": ${error.message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
exports.DynamoDbServiceImpl = DynamoDbServiceImpl;
|
|
105
|
+
exports.DynamoDbServiceImpl = DynamoDbServiceImpl = __decorate([
|
|
106
|
+
(0, common_1.Injectable)(),
|
|
107
|
+
__metadata("design:paramtypes", [Object])
|
|
108
|
+
], DynamoDbServiceImpl);
|
|
@@ -18,7 +18,11 @@ exports.EventBridgeModule = EventBridgeModule = __decorate([
|
|
|
18
18
|
providers: [
|
|
19
19
|
{
|
|
20
20
|
provide: ioc_1.EventBridgeSymbols.EventBridgeService,
|
|
21
|
-
|
|
21
|
+
useFactory: () => new EventBridgeServiceImpl_1.EventBridgeServiceImpl({
|
|
22
|
+
eventBusName: process.env.EVENT_BUS_NAME ?? "default",
|
|
23
|
+
source: process.env.EVENT_SOURCE ?? "com.anlia",
|
|
24
|
+
region: process.env.AWS_REGION ?? "us-east-1",
|
|
25
|
+
}),
|
|
22
26
|
},
|
|
23
27
|
],
|
|
24
28
|
exports: [ioc_1.EventBridgeSymbols.EventBridgeService],
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handler = void 0;
|
|
4
|
+
const handler = async (event) => {
|
|
5
|
+
for (const record of event.Records) {
|
|
6
|
+
console.log(JSON.stringify({
|
|
7
|
+
messageId: record.messageId,
|
|
8
|
+
eventSource: record.eventSource,
|
|
9
|
+
body: JSON.parse(record.body),
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
exports.handler = handler;
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
|
@@ -18,3 +18,5 @@ __exportStar(require("./events"), exports);
|
|
|
18
18
|
__exportStar(require("./enums"), exports);
|
|
19
19
|
__exportStar(require("./orders"), exports);
|
|
20
20
|
__exportStar(require("./interfaces"), exports);
|
|
21
|
+
__exportStar(require("./s3"), exports);
|
|
22
|
+
__exportStar(require("./dynamoDb"), exports);
|
|
@@ -5,3 +5,4 @@ export * from "./ioc";
|
|
|
5
5
|
export * from "./OrderModule";
|
|
6
6
|
export * from "./domain/posDto/SquareOrder";
|
|
7
7
|
export { SquareOrderServiceImpl as SquareOrderService } from "./services/square/SquareOrderServiceImpl";
|
|
8
|
+
export type { ISquareOrderService } from "./services/square/SquareOrderService";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.S3Module = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const ioc_1 = require("./ioc");
|
|
12
|
+
const S3ServiceImpl_1 = require("./service/S3ServiceImpl");
|
|
13
|
+
let S3Module = class S3Module {
|
|
14
|
+
};
|
|
15
|
+
exports.S3Module = S3Module;
|
|
16
|
+
exports.S3Module = S3Module = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
providers: [
|
|
19
|
+
{
|
|
20
|
+
provide: ioc_1.S3Symbols.S3Service,
|
|
21
|
+
useFactory: () => new S3ServiceImpl_1.S3ServiceImpl({
|
|
22
|
+
bucket: process.env.AWS_S3_BUCKET ?? '',
|
|
23
|
+
region: process.env.AWS_REGION ?? 'us-east-1',
|
|
24
|
+
endpoint: process.env.AWS_S3_ENDPOINT,
|
|
25
|
+
forcePathStyle: process.env.AWS_S3_FORCE_PATH_STYLE === 'true',
|
|
26
|
+
}),
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
exports: [ioc_1.S3Symbols.S3Service],
|
|
30
|
+
})
|
|
31
|
+
], S3Module);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./S3Module"), exports);
|
|
18
|
+
__exportStar(require("./ioc"), exports);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export type S3UploadFile = {
|
|
3
|
+
buffer: Buffer;
|
|
4
|
+
originalname: string;
|
|
5
|
+
mimetype: string;
|
|
6
|
+
size: number;
|
|
7
|
+
};
|
|
8
|
+
export type UploadS3FileRequest = {
|
|
9
|
+
file: S3UploadFile;
|
|
10
|
+
folder?: string;
|
|
11
|
+
};
|
|
12
|
+
export type UploadS3FileResponse = {
|
|
13
|
+
bucket: string;
|
|
14
|
+
key: string;
|
|
15
|
+
contentType: string;
|
|
16
|
+
size: number;
|
|
17
|
+
};
|
|
18
|
+
export type FetchS3FileResponse = {
|
|
19
|
+
body: Buffer;
|
|
20
|
+
contentType?: string;
|
|
21
|
+
contentLength?: number;
|
|
22
|
+
fileName: string;
|
|
23
|
+
};
|
|
24
|
+
export interface S3Service {
|
|
25
|
+
uploadFile(request: UploadS3FileRequest): Promise<UploadS3FileResponse>;
|
|
26
|
+
fetchFile(key: string): Promise<FetchS3FileResponse>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { FetchS3FileResponse, S3Service, UploadS3FileRequest, UploadS3FileResponse } from './S3Service';
|
|
2
|
+
export interface S3Options {
|
|
3
|
+
bucket: string;
|
|
4
|
+
region?: string;
|
|
5
|
+
endpoint?: string;
|
|
6
|
+
forcePathStyle?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class S3ServiceImpl implements S3Service {
|
|
9
|
+
private readonly s3Client;
|
|
10
|
+
private readonly bucket;
|
|
11
|
+
constructor(options: S3Options);
|
|
12
|
+
uploadFile(request: UploadS3FileRequest): Promise<UploadS3FileResponse>;
|
|
13
|
+
fetchFile(key: string): Promise<FetchS3FileResponse>;
|
|
14
|
+
private getBucketName;
|
|
15
|
+
private buildObjectKey;
|
|
16
|
+
private getFileNameFromKey;
|
|
17
|
+
}
|