@mbc-cqrs-serverless/master 0.1.69-beta.0 → 0.1.71-beta.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/dist/controllers/master-data.controller.spec.d.ts +1 -0
- package/dist/controllers/master-data.controller.spec.js +341 -0
- package/dist/controllers/master-data.controller.spec.js.map +1 -0
- package/dist/controllers/master-setting.controller.d.ts +2 -1
- package/dist/controllers/master-setting.controller.js +12 -0
- package/dist/controllers/master-setting.controller.js.map +1 -1
- package/dist/controllers/master-setting.controller.spec.d.ts +1 -0
- package/dist/controllers/master-setting.controller.spec.js +164 -0
- package/dist/controllers/master-setting.controller.spec.js.map +1 -0
- package/dist/custom-task/custom-task.module.d.ts +2 -0
- package/dist/custom-task/custom-task.module.js +30 -0
- package/dist/custom-task/custom-task.module.js.map +1 -0
- package/dist/custom-task/event/task-queue-event-factory.d.ts +6 -0
- package/dist/custom-task/event/task-queue-event-factory.js +23 -0
- package/dist/custom-task/event/task-queue-event-factory.js.map +1 -0
- package/dist/custom-task/my-task.controller.d.ts +9 -0
- package/dist/custom-task/my-task.controller.js +56 -0
- package/dist/custom-task/my-task.controller.js.map +1 -0
- package/dist/custom-task/my-task.controller.spec.d.ts +1 -0
- package/dist/custom-task/my-task.controller.spec.js +147 -0
- package/dist/custom-task/my-task.controller.spec.js.map +1 -0
- package/dist/custom-task/my-task.service.d.ts +12 -0
- package/dist/custom-task/my-task.service.js +76 -0
- package/dist/custom-task/my-task.service.js.map +1 -0
- package/dist/custom-task/my-task.service.spec.d.ts +1 -0
- package/dist/custom-task/my-task.service.spec.js +111 -0
- package/dist/custom-task/my-task.service.spec.js.map +1 -0
- package/dist/handler/master-sfn-task.event.d.ts +3 -0
- package/dist/handler/master-sfn-task.event.js +8 -0
- package/dist/handler/master-sfn-task.event.js.map +1 -0
- package/dist/handler/master-sfn-task.handler.d.ts +24 -0
- package/dist/handler/master-sfn-task.handler.js +242 -0
- package/dist/handler/master-sfn-task.handler.js.map +1 -0
- package/dist/helpers/index.d.ts +7 -0
- package/dist/helpers/index.js +15 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/master.module.js +9 -0
- package/dist/master.module.js.map +1 -1
- package/dist/services/master-data.service.spec.d.ts +1 -0
- package/dist/services/master-data.service.spec.js +1385 -0
- package/dist/services/master-data.service.spec.js.map +1 -0
- package/dist/services/master-setting.service.d.ts +7 -2
- package/dist/services/master-setting.service.js +29 -2
- package/dist/services/master-setting.service.js.map +1 -1
- package/dist/services/master-setting.service.spec.js +754 -27
- package/dist/services/master-setting.service.spec.js.map +1 -1
- package/dist/update-scheme.js +1 -10
- package/dist/update-scheme.js.map +1 -1
- package/package.json +5 -5
- package/src/templates/master/handler/master-rds.handler.ts +0 -4
- package/src/templates/master/master.module.ts +2 -9
- package/src/templates/custom-task/custom-task.module.ts +0 -18
- package/src/templates/custom-task/event/task-queue-event-factory.ts +0 -26
- package/src/templates/custom-task/my-task.controller.ts +0 -28
- package/src/templates/custom-task/my-task.service.ts +0 -99
- package/src/templates/master/handler/master-sfn-task.event.ts +0 -3
- package/src/templates/master/handler/master-sfn-task.handler.ts +0 -332
- package/src/templates/master/master-setting.controller.ts +0 -23
- package/src/templates/master/master-setting.service.ts +0 -55
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ITaskQueueEventFactory } from '@mbc-cqrs-serverless/task';
|
|
2
|
+
import { StepFunctionTaskEvent } from '@mbc-cqrs-serverless/task';
|
|
3
|
+
export declare class TaskQueueEventFactory implements ITaskQueueEventFactory {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
transformStepFunctionTask(event: StepFunctionTaskEvent): Promise<any[]>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskQueueEventFactory = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const master_sfn_task_event_1 = require("../../handler/master-sfn-task.event");
|
|
6
|
+
class TaskQueueEventFactory {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.logger = new common_1.Logger(TaskQueueEventFactory.name);
|
|
9
|
+
}
|
|
10
|
+
async transformStepFunctionTask(event) {
|
|
11
|
+
this.logger.debug('Received StepFunctionTaskEvent', event);
|
|
12
|
+
const taskKeySk = event.taskKey.sk;
|
|
13
|
+
this.logger.debug(`Evaluating taskKey.sk: ${taskKeySk}`);
|
|
14
|
+
if (taskKeySk.startsWith('MASTER_COPY')) {
|
|
15
|
+
this.logger.debug(`Matched MASTER_COPY_SK_PREFIX (MASTER_COPY)`);
|
|
16
|
+
return [new master_sfn_task_event_1.MasterSfnTaskEvent(event)];
|
|
17
|
+
}
|
|
18
|
+
this.logger.debug(`No matching SK prefix found for: ${taskKeySk}`);
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.TaskQueueEventFactory = TaskQueueEventFactory;
|
|
23
|
+
//# sourceMappingURL=task-queue-event-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-queue-event-factory.js","sourceRoot":"","sources":["../../../src/custom-task/event/task-queue-event-factory.ts"],"names":[],"mappings":";;;AAEA,2CAAuC;AAEvC,+EAAwE;AAExE,MAAa,qBAAqB;IAAlC;QACmB,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAkBlE,CAAC;IAhBC,KAAK,CAAC,yBAAyB,CAC7B,KAA4B;QAE5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAA;QAE1D,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAA;QAExD,IAAI,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;YAChE,OAAO,CAAC,IAAI,0CAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;QACxC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAA;QAClE,OAAO,EAAE,CAAA;IACX,CAAC;CACF;AAnBD,sDAmBC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DetailDto, IInvoke } from '@mbc-cqrs-serverless/core';
|
|
2
|
+
import { TaskEntity } from '@mbc-cqrs-serverless/task';
|
|
3
|
+
import { MyTaskService } from './my-task.service';
|
|
4
|
+
export declare class MyTaskController {
|
|
5
|
+
private readonly myTaskService;
|
|
6
|
+
constructor(myTaskService: MyTaskService);
|
|
7
|
+
getSfnTaskParentBySettingCode(invokeContext: IInvoke, masterSettingCode: string): Promise<TaskEntity[]>;
|
|
8
|
+
getSfnChildTask(key: DetailDto): Promise<TaskEntity[]>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MyTaskController = void 0;
|
|
16
|
+
const openapi = require("@nestjs/swagger");
|
|
17
|
+
const core_1 = require("@mbc-cqrs-serverless/core");
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
20
|
+
const decorators_1 = require("../decorators");
|
|
21
|
+
const my_task_service_1 = require("./my-task.service");
|
|
22
|
+
let MyTaskController = class MyTaskController {
|
|
23
|
+
constructor(myTaskService) {
|
|
24
|
+
this.myTaskService = myTaskService;
|
|
25
|
+
}
|
|
26
|
+
async getSfnTaskParentBySettingCode(invokeContext, masterSettingCode) {
|
|
27
|
+
return this.myTaskService.getSfnTaskParentBySettingCode(masterSettingCode, invokeContext);
|
|
28
|
+
}
|
|
29
|
+
async getSfnChildTask(key) {
|
|
30
|
+
return this.myTaskService.getSfnChildTask(key);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.MyTaskController = MyTaskController;
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, common_1.Get)('/sfn-task-parent'),
|
|
36
|
+
openapi.ApiResponse({ status: 200, type: [require("../../../task/dist/entity/task.entity").TaskEntity] }),
|
|
37
|
+
__param(0, (0, core_1.INVOKE_CONTEXT)()),
|
|
38
|
+
__param(1, (0, common_1.Query)('masterSettingCode')),
|
|
39
|
+
__metadata("design:type", Function),
|
|
40
|
+
__metadata("design:paramtypes", [Object, String]),
|
|
41
|
+
__metadata("design:returntype", Promise)
|
|
42
|
+
], MyTaskController.prototype, "getSfnTaskParentBySettingCode", null);
|
|
43
|
+
__decorate([
|
|
44
|
+
(0, common_1.Get)('/:id'),
|
|
45
|
+
openapi.ApiResponse({ status: 200, type: [require("../../../task/dist/entity/task.entity").TaskEntity] }),
|
|
46
|
+
__param(0, (0, decorators_1.DetailKeys)()),
|
|
47
|
+
__metadata("design:type", Function),
|
|
48
|
+
__metadata("design:paramtypes", [core_1.DetailDto]),
|
|
49
|
+
__metadata("design:returntype", Promise)
|
|
50
|
+
], MyTaskController.prototype, "getSfnChildTask", null);
|
|
51
|
+
exports.MyTaskController = MyTaskController = __decorate([
|
|
52
|
+
(0, common_1.Controller)('api/tasks'),
|
|
53
|
+
(0, swagger_1.ApiTags)('tasks'),
|
|
54
|
+
__metadata("design:paramtypes", [my_task_service_1.MyTaskService])
|
|
55
|
+
], MyTaskController);
|
|
56
|
+
//# sourceMappingURL=my-task.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"my-task.controller.js","sourceRoot":"","sources":["../../src/custom-task/my-task.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAA8E;AAE9E,2CAAuD;AACvD,6CAAyC;AAEzC,8CAA0C;AAC1C,uDAAiD;AAI1C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAGvD,AAAN,KAAK,CAAC,6BAA6B,CACf,aAAsB,EACZ,iBAAyB;QAErD,OAAO,IAAI,CAAC,aAAa,CAAC,6BAA6B,CACrD,iBAAiB,EACjB,aAAa,CACd,CAAA;IACH,CAAC;IAGK,AAAN,KAAK,CAAC,eAAe,CAAe,GAAc;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAChD,CAAC;CACF,CAAA;AAlBY,4CAAgB;AAIrB;IADL,IAAA,YAAG,EAAC,kBAAkB,CAAC;;IAErB,WAAA,IAAA,qBAAc,GAAE,CAAA;IAChB,WAAA,IAAA,cAAK,EAAC,mBAAmB,CAAC,CAAA;;;;qEAM5B;AAGK;IADL,IAAA,YAAG,EAAC,MAAM,CAAC;;IACW,WAAA,IAAA,uBAAU,GAAE,CAAA;;qCAAM,gBAAS;;uDAEjD;2BAjBU,gBAAgB;IAF5B,IAAA,mBAAU,EAAC,WAAW,CAAC;IACvB,IAAA,iBAAO,EAAC,OAAO,CAAC;qCAE6B,+BAAa;GAD9C,gBAAgB,CAkB5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const task_1 = require("@mbc-cqrs-serverless/task");
|
|
6
|
+
const my_task_controller_1 = require("./my-task.controller");
|
|
7
|
+
const my_task_service_1 = require("./my-task.service");
|
|
8
|
+
describe('MyTaskController', () => {
|
|
9
|
+
let controller;
|
|
10
|
+
let service;
|
|
11
|
+
const mockInvokeContext = {
|
|
12
|
+
event: {
|
|
13
|
+
requestContext: {
|
|
14
|
+
authorizer: {
|
|
15
|
+
jwt: {
|
|
16
|
+
claims: {
|
|
17
|
+
sub: 'test-sub',
|
|
18
|
+
iss: 'test-issuer',
|
|
19
|
+
'cognito:username': 'test-user',
|
|
20
|
+
aud: 'test-audience',
|
|
21
|
+
event_id: 'test-event-id',
|
|
22
|
+
token_use: 'id',
|
|
23
|
+
auth_time: 1699930911,
|
|
24
|
+
name: 'Test User',
|
|
25
|
+
'custom:tenant': 'test-tenant',
|
|
26
|
+
exp: 1700017311,
|
|
27
|
+
email: 'test@example.com',
|
|
28
|
+
iat: 1699930911,
|
|
29
|
+
jti: 'test-jti',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
beforeEach(async () => {
|
|
37
|
+
const mockMyTaskService = {
|
|
38
|
+
getSfnTaskParentBySettingCode: jest.fn(),
|
|
39
|
+
getSfnChildTask: jest.fn(),
|
|
40
|
+
};
|
|
41
|
+
const module = await testing_1.Test.createTestingModule({
|
|
42
|
+
controllers: [my_task_controller_1.MyTaskController],
|
|
43
|
+
providers: [
|
|
44
|
+
{
|
|
45
|
+
provide: my_task_service_1.MyTaskService,
|
|
46
|
+
useValue: mockMyTaskService,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
}).compile();
|
|
50
|
+
controller = module.get(my_task_controller_1.MyTaskController);
|
|
51
|
+
service = module.get(my_task_service_1.MyTaskService);
|
|
52
|
+
});
|
|
53
|
+
it('should be defined', () => {
|
|
54
|
+
expect(controller).toBeDefined();
|
|
55
|
+
});
|
|
56
|
+
describe('getSfnTaskParentBySettingCode', () => {
|
|
57
|
+
it('should get SFN task parent by setting code successfully', async () => {
|
|
58
|
+
const masterSettingCode = 'TEST_SETTING';
|
|
59
|
+
const expectedResult = [
|
|
60
|
+
new task_1.TaskEntity({
|
|
61
|
+
pk: 'TASK#test-tenant',
|
|
62
|
+
sk: 'SFN_TASK#MASTER_COPY_TEST_SETTING',
|
|
63
|
+
id: 'SFN_TASK#MASTER_COPY_TEST_SETTING',
|
|
64
|
+
code: 'SFN_TASK#MASTER_COPY_TEST_SETTING',
|
|
65
|
+
name: 'Test Task',
|
|
66
|
+
tenantCode: 'test-tenant',
|
|
67
|
+
type: 'SFN_TASK',
|
|
68
|
+
status: task_1.TaskStatusEnum.QUEUED,
|
|
69
|
+
input: { masterSettingCode: 'TEST_SETTING' },
|
|
70
|
+
version: 1,
|
|
71
|
+
}),
|
|
72
|
+
];
|
|
73
|
+
jest
|
|
74
|
+
.spyOn(service, 'getSfnTaskParentBySettingCode')
|
|
75
|
+
.mockResolvedValue(expectedResult);
|
|
76
|
+
const result = await controller.getSfnTaskParentBySettingCode(mockInvokeContext, masterSettingCode);
|
|
77
|
+
expect(service.getSfnTaskParentBySettingCode).toHaveBeenCalledWith(masterSettingCode, mockInvokeContext);
|
|
78
|
+
expect(result).toEqual(expectedResult);
|
|
79
|
+
});
|
|
80
|
+
it('should handle missing master setting code', async () => {
|
|
81
|
+
const masterSettingCode = '';
|
|
82
|
+
const error = new common_1.BadRequestException('Must provide master setting code');
|
|
83
|
+
jest
|
|
84
|
+
.spyOn(service, 'getSfnTaskParentBySettingCode')
|
|
85
|
+
.mockRejectedValue(error);
|
|
86
|
+
await expect(controller.getSfnTaskParentBySettingCode(mockInvokeContext, masterSettingCode)).rejects.toThrow('Must provide master setting code');
|
|
87
|
+
});
|
|
88
|
+
it('should handle service errors', async () => {
|
|
89
|
+
const masterSettingCode = 'TEST_SETTING';
|
|
90
|
+
const error = new Error('Service error');
|
|
91
|
+
jest
|
|
92
|
+
.spyOn(service, 'getSfnTaskParentBySettingCode')
|
|
93
|
+
.mockRejectedValue(error);
|
|
94
|
+
await expect(controller.getSfnTaskParentBySettingCode(mockInvokeContext, masterSettingCode)).rejects.toThrow('Service error');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('getSfnChildTask', () => {
|
|
98
|
+
it('should get SFN child task successfully', async () => {
|
|
99
|
+
const key = { pk: 'TASK#test-tenant', sk: 'SFN_TASK#PARENT' };
|
|
100
|
+
const expectedResult = [
|
|
101
|
+
new task_1.TaskEntity({
|
|
102
|
+
pk: 'TASK#test-tenant',
|
|
103
|
+
sk: 'SFN_TASK#PARENT#CHILD1',
|
|
104
|
+
id: 'SFN_TASK#PARENT#CHILD1',
|
|
105
|
+
code: 'SFN_TASK#PARENT#CHILD1',
|
|
106
|
+
name: 'Child Task 1',
|
|
107
|
+
tenantCode: 'test-tenant',
|
|
108
|
+
type: 'SFN_TASK',
|
|
109
|
+
status: task_1.TaskStatusEnum.COMPLETED,
|
|
110
|
+
input: { parentTaskId: 'parent-task-123' },
|
|
111
|
+
version: 1,
|
|
112
|
+
}),
|
|
113
|
+
new task_1.TaskEntity({
|
|
114
|
+
pk: 'TASK#test-tenant',
|
|
115
|
+
sk: 'SFN_TASK#PARENT#CHILD2',
|
|
116
|
+
id: 'SFN_TASK#PARENT#CHILD2',
|
|
117
|
+
code: 'SFN_TASK#PARENT#CHILD2',
|
|
118
|
+
name: 'Child Task 2',
|
|
119
|
+
tenantCode: 'test-tenant',
|
|
120
|
+
type: 'SFN_TASK',
|
|
121
|
+
status: task_1.TaskStatusEnum.QUEUED,
|
|
122
|
+
input: { parentTaskId: 'parent-task-123' },
|
|
123
|
+
version: 1,
|
|
124
|
+
}),
|
|
125
|
+
];
|
|
126
|
+
jest.spyOn(service, 'getSfnChildTask').mockResolvedValue(expectedResult);
|
|
127
|
+
const result = await controller.getSfnChildTask(key);
|
|
128
|
+
expect(service.getSfnChildTask).toHaveBeenCalledWith(key);
|
|
129
|
+
expect(result).toEqual(expectedResult);
|
|
130
|
+
});
|
|
131
|
+
it('should handle empty child task results', async () => {
|
|
132
|
+
const key = { pk: 'TASK#test-tenant', sk: 'SFN_TASK#PARENT' };
|
|
133
|
+
const expectedResult = [];
|
|
134
|
+
jest.spyOn(service, 'getSfnChildTask').mockResolvedValue(expectedResult);
|
|
135
|
+
const result = await controller.getSfnChildTask(key);
|
|
136
|
+
expect(service.getSfnChildTask).toHaveBeenCalledWith(key);
|
|
137
|
+
expect(result).toEqual(expectedResult);
|
|
138
|
+
});
|
|
139
|
+
it('should handle service errors', async () => {
|
|
140
|
+
const key = { pk: 'TASK#test-tenant', sk: 'SFN_TASK#PARENT' };
|
|
141
|
+
const error = new Error('Child task retrieval failed');
|
|
142
|
+
jest.spyOn(service, 'getSfnChildTask').mockRejectedValue(error);
|
|
143
|
+
await expect(controller.getSfnChildTask(key)).rejects.toThrow('Child task retrieval failed');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=my-task.controller.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"my-task.controller.spec.js","sourceRoot":"","sources":["../../src/custom-task/my-task.controller.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DetailKey, IInvoke, UserContext } from '@mbc-cqrs-serverless/core';
|
|
2
|
+
import { TaskEntity, TaskService } from '@mbc-cqrs-serverless/task';
|
|
3
|
+
import { ExecutionContext } from '@nestjs/common';
|
|
4
|
+
export declare class MyTaskService {
|
|
5
|
+
private readonly taskService;
|
|
6
|
+
constructor(taskService: TaskService);
|
|
7
|
+
getSfnTaskParentBySettingCode(masterSettingCode: string, invokeContext: IInvoke): Promise<TaskEntity[]>;
|
|
8
|
+
getSfnChildTask(key: DetailKey): Promise<TaskEntity[]>;
|
|
9
|
+
private listAllItemsByPk;
|
|
10
|
+
private isParentTask;
|
|
11
|
+
getUserContext: (ctx: IInvoke | ExecutionContext) => UserContext;
|
|
12
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
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.MyTaskService = void 0;
|
|
13
|
+
const core_1 = require("@mbc-cqrs-serverless/core");
|
|
14
|
+
const task_1 = require("@mbc-cqrs-serverless/task");
|
|
15
|
+
const common_1 = require("@nestjs/common");
|
|
16
|
+
let MyTaskService = class MyTaskService {
|
|
17
|
+
constructor(taskService) {
|
|
18
|
+
this.taskService = taskService;
|
|
19
|
+
this.getUserContext = (ctx) => {
|
|
20
|
+
if ('getHandler' in ctx) {
|
|
21
|
+
ctx = (0, core_1.extractInvokeContext)(ctx);
|
|
22
|
+
}
|
|
23
|
+
const claims = (0, core_1.getAuthorizerClaims)(ctx);
|
|
24
|
+
const userId = claims.sub;
|
|
25
|
+
const tenantCode = claims['custom:tenant_code'] ||
|
|
26
|
+
(ctx?.event?.headers || {})[core_1.HEADER_TENANT_CODE];
|
|
27
|
+
const tenantRole = claims['custom:user_type'];
|
|
28
|
+
return {
|
|
29
|
+
userId,
|
|
30
|
+
tenantRole,
|
|
31
|
+
tenantCode,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async getSfnTaskParentBySettingCode(masterSettingCode, invokeContext) {
|
|
36
|
+
const userContext = this.getUserContext(invokeContext);
|
|
37
|
+
if (!masterSettingCode) {
|
|
38
|
+
throw new common_1.BadRequestException('Must provide master setting code');
|
|
39
|
+
}
|
|
40
|
+
const items = await this.listAllItemsByPk(userContext.tenantCode, 'SFN_TASK', {
|
|
41
|
+
sk: {
|
|
42
|
+
skExpession: 'begins_with(sk, :code)',
|
|
43
|
+
skAttributeValues: {
|
|
44
|
+
':code': `MASTER_COPY_${masterSettingCode}`,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
order: 'desc',
|
|
48
|
+
});
|
|
49
|
+
return items.filter((item) => this.isParentTask(item.sk));
|
|
50
|
+
}
|
|
51
|
+
async getSfnChildTask(key) {
|
|
52
|
+
return await this.taskService.getAllSubTask(key);
|
|
53
|
+
}
|
|
54
|
+
async listAllItemsByPk(tenantCode, type, options) {
|
|
55
|
+
const allItems = [];
|
|
56
|
+
let lastSk = undefined;
|
|
57
|
+
do {
|
|
58
|
+
const result = await this.taskService.listItemsByPk(tenantCode, type, {
|
|
59
|
+
...options,
|
|
60
|
+
startFromSk: lastSk,
|
|
61
|
+
});
|
|
62
|
+
allItems.push(...result.items);
|
|
63
|
+
lastSk = result.lastSk;
|
|
64
|
+
} while (lastSk);
|
|
65
|
+
return allItems;
|
|
66
|
+
}
|
|
67
|
+
isParentTask(sk) {
|
|
68
|
+
return sk.split(core_1.KEY_SEPARATOR).length === 2;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.MyTaskService = MyTaskService;
|
|
72
|
+
exports.MyTaskService = MyTaskService = __decorate([
|
|
73
|
+
(0, common_1.Injectable)(),
|
|
74
|
+
__metadata("design:paramtypes", [task_1.TaskService])
|
|
75
|
+
], MyTaskService);
|
|
76
|
+
//# sourceMappingURL=my-task.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"my-task.service.js","sourceRoot":"","sources":["../../src/custom-task/my-task.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAQkC;AAClC,oDAAmE;AACnE,2CAIuB;AAGhB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QA+DrD,mBAAc,GAAG,CAAC,GAA+B,EAAe,EAAE;YAChE,IAAI,YAAY,IAAI,GAAG,EAAE,CAAC;gBACxB,GAAG,GAAG,IAAA,2BAAoB,EAAC,GAAG,CAAC,CAAA;YACjC,CAAC;YACD,MAAM,MAAM,GAAG,IAAA,0BAAmB,EAAC,GAAG,CAAC,CAAA;YAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA;YACzB,MAAM,UAAU,GACd,MAAM,CAAC,oBAAoB,CAAC;gBAC5B,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,yBAAkB,CAAC,CAAA;YACjD,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAC7C,OAAO;gBACL,MAAM;gBACN,UAAU;gBACV,UAAU;aACX,CAAA;QACH,CAAC,CAAA;IA/EuD,CAAC;IAEzD,KAAK,CAAC,6BAA6B,CACjC,iBAAyB,EACzB,aAAsB;QAEtB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAA;QACtD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,4BAAmB,CAAC,kCAAkC,CAAC,CAAA;QACnE,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACvC,WAAW,CAAC,UAAU,EACtB,UAAU,EACV;YACE,EAAE,EAAE;gBACF,WAAW,EAAE,wBAAwB;gBACrC,iBAAiB,EAAE;oBACjB,OAAO,EAAE,eAAe,iBAAiB,EAAE;iBAC5C;aACF;YACD,KAAK,EAAE,MAAM;SACd,CACF,CAAA;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAc;QAClC,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAClD,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,UAAkB,EAClB,IAAY,EACZ,OAOC;QAED,MAAM,QAAQ,GAAiB,EAAE,CAAA;QACjC,IAAI,MAAM,GAAuB,SAAS,CAAA;QAE1C,GAAG,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE;gBACpE,GAAG,OAAO;gBACV,WAAW,EAAE,MAAM;aACpB,CAAC,CAAA;YAEF,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC9B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QACxB,CAAC,QAAQ,MAAM,EAAC;QAEhB,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,YAAY,CAAC,EAAU;QAC7B,OAAO,EAAE,CAAC,KAAK,CAAC,oBAAa,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;IAC7C,CAAC;CAmBF,CAAA;AAjFY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAE+B,kBAAW;GAD1C,aAAa,CAiFzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const ts_jest_1 = require("@golevelup/ts-jest");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const my_task_service_1 = require("./my-task.service");
|
|
7
|
+
const task_1 = require("@mbc-cqrs-serverless/task");
|
|
8
|
+
describe('MyTaskService', () => {
|
|
9
|
+
let service;
|
|
10
|
+
let taskService;
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
const module = await testing_1.Test.createTestingModule({
|
|
13
|
+
providers: [
|
|
14
|
+
my_task_service_1.MyTaskService,
|
|
15
|
+
{
|
|
16
|
+
provide: task_1.TaskService,
|
|
17
|
+
useValue: (0, ts_jest_1.createMock)(),
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
}).compile();
|
|
21
|
+
service = module.get(my_task_service_1.MyTaskService);
|
|
22
|
+
taskService = module.get(task_1.TaskService);
|
|
23
|
+
jest.clearAllMocks();
|
|
24
|
+
});
|
|
25
|
+
it('should be defined', () => {
|
|
26
|
+
expect(service).toBeDefined();
|
|
27
|
+
});
|
|
28
|
+
describe('getSfnTaskParentBySettingCode', () => {
|
|
29
|
+
const mockInvokeContext = (0, ts_jest_1.createMock)();
|
|
30
|
+
it('should return parent tasks for valid setting code', async () => {
|
|
31
|
+
const masterSettingCode = 'TEST_SETTING';
|
|
32
|
+
const mockTasks = [
|
|
33
|
+
{
|
|
34
|
+
pk: 'test-tenant',
|
|
35
|
+
sk: 'MASTER_COPY_TEST_SETTING#PARENT',
|
|
36
|
+
type: 'SFN_TASK',
|
|
37
|
+
version: 1,
|
|
38
|
+
createdAt: new Date('2023-01-01T00:00:00Z'),
|
|
39
|
+
updatedAt: new Date('2023-01-01T00:00:00Z'),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
pk: 'test-tenant',
|
|
43
|
+
sk: 'MASTER_COPY_TEST_SETTING#PARENT#CHILD',
|
|
44
|
+
type: 'SFN_TASK',
|
|
45
|
+
version: 1,
|
|
46
|
+
createdAt: new Date('2023-01-01T00:00:00Z'),
|
|
47
|
+
updatedAt: new Date('2023-01-01T00:00:00Z'),
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
jest.spyOn(service, 'getUserContext').mockReturnValue({
|
|
51
|
+
userId: 'test-user-id',
|
|
52
|
+
tenantCode: 'test-tenant',
|
|
53
|
+
tenantRole: 'admin',
|
|
54
|
+
});
|
|
55
|
+
taskService.listItemsByPk.mockResolvedValue({
|
|
56
|
+
items: mockTasks,
|
|
57
|
+
lastSk: undefined,
|
|
58
|
+
});
|
|
59
|
+
const result = await service.getSfnTaskParentBySettingCode(masterSettingCode, mockInvokeContext);
|
|
60
|
+
expect(result).toHaveLength(1);
|
|
61
|
+
expect(result[0].sk).toBe('MASTER_COPY_TEST_SETTING#PARENT');
|
|
62
|
+
});
|
|
63
|
+
it('should throw BadRequestException when masterSettingCode is empty', async () => {
|
|
64
|
+
await expect(service.getSfnTaskParentBySettingCode('', mockInvokeContext)).rejects.toThrow(common_1.BadRequestException);
|
|
65
|
+
await expect(service.getSfnTaskParentBySettingCode('', mockInvokeContext)).rejects.toThrow('Must provide master setting code');
|
|
66
|
+
});
|
|
67
|
+
it('should throw BadRequestException when masterSettingCode is null', async () => {
|
|
68
|
+
await expect(service.getSfnTaskParentBySettingCode(null, mockInvokeContext)).rejects.toThrow(common_1.BadRequestException);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('getSfnChildTask', () => {
|
|
72
|
+
it('should return child tasks for given key', async () => {
|
|
73
|
+
const key = {
|
|
74
|
+
pk: 'test-tenant',
|
|
75
|
+
sk: 'MASTER_COPY_TEST_SETTING#PARENT',
|
|
76
|
+
};
|
|
77
|
+
const mockChildTasks = [
|
|
78
|
+
{
|
|
79
|
+
pk: 'test-tenant',
|
|
80
|
+
sk: 'MASTER_COPY_TEST_SETTING#PARENT#CHILD1',
|
|
81
|
+
type: 'SFN_TASK',
|
|
82
|
+
version: 1,
|
|
83
|
+
createdAt: new Date('2023-01-01T00:00:00Z'),
|
|
84
|
+
updatedAt: new Date('2023-01-01T00:00:00Z'),
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
taskService.getAllSubTask.mockResolvedValue(mockChildTasks);
|
|
88
|
+
const result = await service.getSfnChildTask(key);
|
|
89
|
+
expect(taskService.getAllSubTask).toHaveBeenCalledWith(key);
|
|
90
|
+
expect(result).toBe(mockChildTasks);
|
|
91
|
+
});
|
|
92
|
+
it('should handle empty child tasks', async () => {
|
|
93
|
+
const key = {
|
|
94
|
+
pk: 'test-tenant',
|
|
95
|
+
sk: 'MASTER_COPY_TEST_SETTING#PARENT',
|
|
96
|
+
};
|
|
97
|
+
taskService.getAllSubTask.mockResolvedValue([]);
|
|
98
|
+
const result = await service.getSfnChildTask(key);
|
|
99
|
+
expect(result).toEqual([]);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('getUserContext', () => {
|
|
103
|
+
it('should extract user context from IInvoke', () => {
|
|
104
|
+
const mockInvokeContext = (0, ts_jest_1.createMock)();
|
|
105
|
+
const result = service.getUserContext(mockInvokeContext);
|
|
106
|
+
expect(result).toBeDefined();
|
|
107
|
+
expect(typeof result).toBe('object');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=my-task.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"my-task.service.spec.js","sourceRoot":"","sources":["../../src/custom-task/my-task.service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MasterSfnTaskEvent = void 0;
|
|
4
|
+
const task_1 = require("@mbc-cqrs-serverless/task");
|
|
5
|
+
class MasterSfnTaskEvent extends task_1.StepFunctionTaskEvent {
|
|
6
|
+
}
|
|
7
|
+
exports.MasterSfnTaskEvent = MasterSfnTaskEvent;
|
|
8
|
+
//# sourceMappingURL=master-sfn-task.event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"master-sfn-task.event.js","sourceRoot":"","sources":["../../src/handler/master-sfn-task.event.ts"],"names":[],"mappings":";;;AAAA,oDAAiE;AAEjE,MAAa,kBAAmB,SAAQ,4BAAqB;CAAG;AAAhE,gDAAgE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { DataService, DynamoDbService, IEventHandler } from '@mbc-cqrs-serverless/core';
|
|
2
|
+
import { SequencesService } from '@mbc-cqrs-serverless/sequence';
|
|
3
|
+
import { MasterDataService, MasterSettingService } from '../services';
|
|
4
|
+
import { MasterSfnTaskEvent } from './master-sfn-task.event';
|
|
5
|
+
export declare class MasterSfnTaskEventHandler implements IEventHandler<MasterSfnTaskEvent> {
|
|
6
|
+
private readonly dynamoDbService;
|
|
7
|
+
private readonly prismaService;
|
|
8
|
+
private readonly masterSettingService;
|
|
9
|
+
private readonly masterDataService;
|
|
10
|
+
private readonly dataService;
|
|
11
|
+
private readonly sequencesService;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
private sequenceTableName;
|
|
14
|
+
constructor(dynamoDbService: DynamoDbService, prismaService: any, masterSettingService: MasterSettingService, masterDataService: MasterDataService, dataService: DataService, sequencesService: SequencesService);
|
|
15
|
+
execute(event: MasterSfnTaskEvent): Promise<any>;
|
|
16
|
+
private fetchSetting;
|
|
17
|
+
private fetchMasterData;
|
|
18
|
+
private copySettingToTenant;
|
|
19
|
+
private copyDataToTenant;
|
|
20
|
+
private shouldCopySequence;
|
|
21
|
+
private copySeqToTenant;
|
|
22
|
+
private generateSequenceKey;
|
|
23
|
+
private getMasterCodeFromSetting;
|
|
24
|
+
}
|