@flusys/nestjs-task-manager 7.0.2 → 8.0.0-beta.1
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/config/index.d.ts +3 -3
- package/controllers/index.d.ts +5 -5
- package/controllers/task-board.controller.d.ts +3 -3
- package/controllers/task-comment.controller.d.ts +2 -2
- package/controllers/task-label.controller.d.ts +2 -2
- package/controllers/task-list.controller.d.ts +3 -3
- package/controllers/task.controller.d.ts +4 -4
- package/docs/index.d.ts +1 -1
- package/docs/task-manager-swagger.config.d.ts +1 -1
- package/dtos/index.d.ts +5 -5
- package/dtos/task-board.dto.d.ts +1 -1
- package/dtos/task.dto.d.ts +2 -2
- package/entities/index.d.ts +19 -19
- package/entities/task-board-with-company.entity.d.ts +1 -1
- package/fesm/234.js +1393 -0
- package/fesm/431.js +981 -0
- package/fesm/827.js +1054 -0
- package/fesm/988.js +881 -0
- package/fesm/config/index.js +156 -3
- package/fesm/controllers/index.js +21 -5
- package/fesm/docs/index.js +58 -1
- package/fesm/dtos/index.js +280 -5
- package/fesm/entities/index.js +26 -46
- package/fesm/gateways/index.js +288 -1
- package/fesm/index.js +440 -9
- package/fesm/interfaces/index.js +16 -2
- package/fesm/modules/index.js +210 -1
- package/fesm/runtime.js +85 -0
- package/fesm/services/index.js +53 -8
- package/gateways/index.d.ts +1 -1
- package/gateways/task-board.gateway.d.ts +3 -3
- package/index.d.ts +9 -9
- package/interfaces/index.d.ts +2 -2
- package/interfaces/task-manager-module.interface.d.ts +3 -3
- package/interfaces/task.interface.d.ts +2 -2
- package/modules/index.d.ts +1 -1
- package/modules/task-manager.module.d.ts +2 -2
- package/package.json +26 -36
- package/services/index.d.ts +8 -8
- package/services/task-activity.service.d.ts +1 -1
- package/services/task-board.service.d.ts +5 -5
- package/services/task-comment.service.d.ts +4 -4
- package/services/task-label.service.d.ts +4 -4
- package/services/task-list.service.d.ts +4 -4
- package/services/task-manager-config.service.d.ts +3 -3
- package/services/task-manager-datasource.provider.d.ts +3 -3
- package/services/task.service.d.ts +7 -7
- package/cjs/config/event-actions.js +0 -37
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -92
- package/cjs/config/task-manager.constants.js +0 -11
- package/cjs/controllers/index.js +0 -22
- package/cjs/controllers/task-board.controller.js +0 -219
- package/cjs/controllers/task-board.controller.spec.js +0 -132
- package/cjs/controllers/task-comment.controller.js +0 -103
- package/cjs/controllers/task-comment.controller.spec.js +0 -86
- package/cjs/controllers/task-label.controller.js +0 -112
- package/cjs/controllers/task-label.controller.spec.js +0 -88
- package/cjs/controllers/task-list.controller.js +0 -158
- package/cjs/controllers/task-list.controller.spec.js +0 -112
- package/cjs/controllers/task.controller.js +0 -199
- package/cjs/controllers/task.controller.spec.js +0 -131
- package/cjs/docs/index.js +0 -18
- package/cjs/docs/task-manager-swagger.config.js +0 -43
- package/cjs/docs/task-manager-swagger.config.spec.js +0 -28
- package/cjs/dtos/index.js +0 -22
- package/cjs/dtos/task-board.dto.js +0 -310
- package/cjs/dtos/task-comment.dto.js +0 -131
- package/cjs/dtos/task-label.dto.js +0 -120
- package/cjs/dtos/task-list.dto.js +0 -198
- package/cjs/dtos/task.dto.js +0 -367
- package/cjs/entities/index.js +0 -72
- package/cjs/entities/index.spec.js +0 -30
- package/cjs/entities/task-activity.entity.js +0 -98
- package/cjs/entities/task-assignee.entity.js +0 -67
- package/cjs/entities/task-board-member.entity.js +0 -94
- package/cjs/entities/task-board-with-company.entity.js +0 -57
- package/cjs/entities/task-board.entity.js +0 -88
- package/cjs/entities/task-comment.entity.js +0 -80
- package/cjs/entities/task-label.entity.js +0 -72
- package/cjs/entities/task-list.entity.js +0 -104
- package/cjs/entities/task-task-label.entity.js +0 -67
- package/cjs/entities/task.entity.js +0 -151
- package/cjs/gateways/index.js +0 -18
- package/cjs/gateways/task-board.gateway.js +0 -167
- package/cjs/gateways/task-board.gateway.spec.js +0 -243
- package/cjs/index.js +0 -26
- package/cjs/interfaces/index.js +0 -19
- package/cjs/interfaces/task-manager-module.interface.js +0 -4
- package/cjs/interfaces/task.interface.js +0 -4
- package/cjs/modules/index.js +0 -18
- package/cjs/modules/task-manager.module.js +0 -135
- package/cjs/modules/task-manager.module.spec.js +0 -144
- package/cjs/services/index.js +0 -25
- package/cjs/services/task-activity.service.js +0 -76
- package/cjs/services/task-activity.service.spec.js +0 -125
- package/cjs/services/task-board.service.js +0 -247
- package/cjs/services/task-board.service.spec.js +0 -465
- package/cjs/services/task-comment.service.js +0 -103
- package/cjs/services/task-comment.service.spec.js +0 -160
- package/cjs/services/task-label.service.js +0 -97
- package/cjs/services/task-label.service.spec.js +0 -138
- package/cjs/services/task-list.service.js +0 -130
- package/cjs/services/task-list.service.spec.js +0 -284
- package/cjs/services/task-manager-config.service.js +0 -69
- package/cjs/services/task-manager-config.service.spec.js +0 -98
- package/cjs/services/task-manager-datasource.provider.js +0 -84
- package/cjs/services/task-manager-datasource.provider.spec.js +0 -131
- package/cjs/services/task.service.js +0 -398
- package/cjs/services/task.service.spec.js +0 -700
- package/fesm/config/event-actions.js +0 -16
- package/fesm/config/message-keys.js +0 -65
- package/fesm/config/task-manager.constants.js +0 -1
- package/fesm/controllers/task-board.controller.js +0 -209
- package/fesm/controllers/task-board.controller.spec.js +0 -128
- package/fesm/controllers/task-comment.controller.js +0 -93
- package/fesm/controllers/task-comment.controller.spec.js +0 -82
- package/fesm/controllers/task-label.controller.js +0 -102
- package/fesm/controllers/task-label.controller.spec.js +0 -84
- package/fesm/controllers/task-list.controller.js +0 -148
- package/fesm/controllers/task-list.controller.spec.js +0 -108
- package/fesm/controllers/task.controller.js +0 -189
- package/fesm/controllers/task.controller.spec.js +0 -127
- package/fesm/docs/task-manager-swagger.config.js +0 -33
- package/fesm/docs/task-manager-swagger.config.spec.js +0 -24
- package/fesm/dtos/task-board.dto.js +0 -277
- package/fesm/dtos/task-comment.dto.js +0 -110
- package/fesm/dtos/task-label.dto.js +0 -99
- package/fesm/dtos/task-list.dto.js +0 -174
- package/fesm/dtos/task.dto.js +0 -337
- package/fesm/entities/index.spec.js +0 -26
- package/fesm/entities/task-activity.entity.js +0 -88
- package/fesm/entities/task-assignee.entity.js +0 -57
- package/fesm/entities/task-board-member.entity.js +0 -76
- package/fesm/entities/task-board-with-company.entity.js +0 -47
- package/fesm/entities/task-board.entity.js +0 -78
- package/fesm/entities/task-comment.entity.js +0 -70
- package/fesm/entities/task-label.entity.js +0 -62
- package/fesm/entities/task-list.entity.js +0 -94
- package/fesm/entities/task-task-label.entity.js +0 -57
- package/fesm/entities/task.entity.js +0 -133
- package/fesm/gateways/task-board.gateway.js +0 -157
- package/fesm/gateways/task-board.gateway.spec.js +0 -239
- package/fesm/interfaces/task-manager-module.interface.js +0 -1
- package/fesm/interfaces/task.interface.js +0 -1
- package/fesm/modules/task-manager.module.js +0 -125
- package/fesm/modules/task-manager.module.spec.js +0 -140
- package/fesm/services/task-activity.service.js +0 -66
- package/fesm/services/task-activity.service.spec.js +0 -121
- package/fesm/services/task-board.service.js +0 -237
- package/fesm/services/task-board.service.spec.js +0 -461
- package/fesm/services/task-comment.service.js +0 -93
- package/fesm/services/task-comment.service.spec.js +0 -156
- package/fesm/services/task-label.service.js +0 -87
- package/fesm/services/task-label.service.spec.js +0 -134
- package/fesm/services/task-list.service.js +0 -120
- package/fesm/services/task-list.service.spec.js +0 -280
- package/fesm/services/task-manager-config.service.js +0 -59
- package/fesm/services/task-manager-config.service.spec.js +0 -94
- package/fesm/services/task-manager-datasource.provider.js +0 -74
- package/fesm/services/task-manager-datasource.provider.spec.js +0 -127
- package/fesm/services/task.service.js +0 -388
- package/fesm/services/task.service.spec.js +0 -696
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _testing = require("@nestjs/testing");
|
|
6
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
7
|
-
const _repositorymock = require("@test-utils/mocks/repository.mock");
|
|
8
|
-
const _loggedusermock = require("@test-utils/mocks/logged-user.mock");
|
|
9
|
-
const _taskcommentservice = require("./task-comment.service");
|
|
10
|
-
const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
|
|
11
|
-
function buildTaskComment(overrides = {}) {
|
|
12
|
-
return {
|
|
13
|
-
id: 'comment-uuid-1',
|
|
14
|
-
taskId: 'task-uuid-1',
|
|
15
|
-
userId: 'user-uuid-1',
|
|
16
|
-
content: 'Original comment',
|
|
17
|
-
parentCommentId: null,
|
|
18
|
-
createdAt: new Date(),
|
|
19
|
-
updatedAt: new Date(),
|
|
20
|
-
deletedAt: null,
|
|
21
|
-
createdById: null,
|
|
22
|
-
updatedById: null,
|
|
23
|
-
deletedById: null,
|
|
24
|
-
...overrides
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
function mockQueryRunner(repo) {
|
|
28
|
-
const qr = {
|
|
29
|
-
connect: jest.fn().mockResolvedValue(undefined),
|
|
30
|
-
startTransaction: jest.fn().mockResolvedValue(undefined),
|
|
31
|
-
commitTransaction: jest.fn().mockResolvedValue(undefined),
|
|
32
|
-
rollbackTransaction: jest.fn().mockResolvedValue(undefined),
|
|
33
|
-
release: jest.fn().mockResolvedValue(undefined),
|
|
34
|
-
manager: {
|
|
35
|
-
save: jest.fn((_target, entities)=>Promise.resolve(entities))
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
repo.manager.connection.createQueryRunner.mockReturnValue(qr);
|
|
39
|
-
return qr;
|
|
40
|
-
}
|
|
41
|
-
describe('TaskCommentService', ()=>{
|
|
42
|
-
let service;
|
|
43
|
-
let mockRepo;
|
|
44
|
-
beforeEach(async ()=>{
|
|
45
|
-
mockRepo = (0, _repositorymock.createMockRepository)();
|
|
46
|
-
const mockDataSourceProvider = (0, _repositorymock.createMockDataSourceProvider)(mockRepo);
|
|
47
|
-
const module = await _testing.Test.createTestingModule({
|
|
48
|
-
providers: [
|
|
49
|
-
_taskcommentservice.TaskCommentService,
|
|
50
|
-
{
|
|
51
|
-
provide: 'CACHE_INSTANCE',
|
|
52
|
-
useValue: {}
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
provide: _modules.UtilsService,
|
|
56
|
-
useValue: {
|
|
57
|
-
clearCache: jest.fn(),
|
|
58
|
-
getCacheKey: jest.fn(),
|
|
59
|
-
trackCacheKey: jest.fn()
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
provide: _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider,
|
|
64
|
-
useValue: mockDataSourceProvider
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
}).compile();
|
|
68
|
-
service = await module.resolve(_taskcommentservice.TaskCommentService);
|
|
69
|
-
});
|
|
70
|
-
describe('convertSingleDtoToEntity (via insert)', ()=>{
|
|
71
|
-
it('creates a top-level comment authored by the current user', async ()=>{
|
|
72
|
-
mockQueryRunner(mockRepo);
|
|
73
|
-
const user = (0, _loggedusermock.buildMockUser)({
|
|
74
|
-
id: 'author-1'
|
|
75
|
-
});
|
|
76
|
-
const result = await service.insert({
|
|
77
|
-
taskId: 'task-1',
|
|
78
|
-
content: 'Nice work'
|
|
79
|
-
}, user);
|
|
80
|
-
expect(result).toEqual(expect.objectContaining({
|
|
81
|
-
taskId: 'task-1',
|
|
82
|
-
userId: 'author-1',
|
|
83
|
-
content: 'Nice work',
|
|
84
|
-
parentCommentId: null
|
|
85
|
-
}));
|
|
86
|
-
});
|
|
87
|
-
it('creates a reply comment carrying the parentCommentId', async ()=>{
|
|
88
|
-
mockQueryRunner(mockRepo);
|
|
89
|
-
const result = await service.insert({
|
|
90
|
-
taskId: 'task-1',
|
|
91
|
-
content: 'Reply',
|
|
92
|
-
parentCommentId: 'comment-parent-1'
|
|
93
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
94
|
-
expect(result).toEqual(expect.objectContaining({
|
|
95
|
-
parentCommentId: 'comment-parent-1'
|
|
96
|
-
}));
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
describe('convertSingleDtoToEntity (via update)', ()=>{
|
|
100
|
-
it('throws NotFoundException when the comment does not exist', async ()=>{
|
|
101
|
-
mockQueryRunner(mockRepo);
|
|
102
|
-
mockRepo.findOne.mockResolvedValue(null);
|
|
103
|
-
await expect(service.update({
|
|
104
|
-
id: 'missing',
|
|
105
|
-
content: 'Edited'
|
|
106
|
-
}, (0, _loggedusermock.buildMockUser)())).rejects.toThrow();
|
|
107
|
-
});
|
|
108
|
-
it('throws ForbiddenException when editing a comment authored by another user', async ()=>{
|
|
109
|
-
mockQueryRunner(mockRepo);
|
|
110
|
-
const existing = buildTaskComment({
|
|
111
|
-
id: 'comment-1',
|
|
112
|
-
userId: 'someone-else'
|
|
113
|
-
});
|
|
114
|
-
mockRepo.findOne.mockResolvedValue(existing);
|
|
115
|
-
await expect(service.update({
|
|
116
|
-
id: 'comment-1',
|
|
117
|
-
content: 'Edited'
|
|
118
|
-
}, (0, _loggedusermock.buildMockUser)({
|
|
119
|
-
id: 'not-the-author'
|
|
120
|
-
}))).rejects.toThrow();
|
|
121
|
-
});
|
|
122
|
-
it('allows the original author to edit their own comment', async ()=>{
|
|
123
|
-
mockQueryRunner(mockRepo);
|
|
124
|
-
const existing = buildTaskComment({
|
|
125
|
-
id: 'comment-1',
|
|
126
|
-
userId: 'author-1',
|
|
127
|
-
content: 'Old'
|
|
128
|
-
});
|
|
129
|
-
mockRepo.findOne.mockResolvedValue(existing);
|
|
130
|
-
const result = await service.update({
|
|
131
|
-
id: 'comment-1',
|
|
132
|
-
content: 'Updated content'
|
|
133
|
-
}, (0, _loggedusermock.buildMockUser)({
|
|
134
|
-
id: 'author-1'
|
|
135
|
-
}));
|
|
136
|
-
expect(result).toEqual(expect.objectContaining({
|
|
137
|
-
id: 'comment-1',
|
|
138
|
-
content: 'Updated content'
|
|
139
|
-
}));
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
describe('getFilterQuery', ()=>{
|
|
143
|
-
it('filters by taskId when supplied', async ()=>{
|
|
144
|
-
const qb = (0, _repositorymock.createMockQueryBuilder)();
|
|
145
|
-
const { query, isRaw } = await service.getFilterQuery(qb, {
|
|
146
|
-
taskId: 'task-1'
|
|
147
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
148
|
-
expect(qb.andWhere).toHaveBeenCalledWith('task_comment.taskId = :taskId', {
|
|
149
|
-
taskId: 'task-1'
|
|
150
|
-
});
|
|
151
|
-
expect(isRaw).toBe(false);
|
|
152
|
-
expect(query).toBe(qb);
|
|
153
|
-
});
|
|
154
|
-
it('applies no filter when taskId is absent', async ()=>{
|
|
155
|
-
const qb = (0, _repositorymock.createMockQueryBuilder)();
|
|
156
|
-
await service.getFilterQuery(qb, {}, (0, _loggedusermock.buildMockUser)());
|
|
157
|
-
expect(qb.andWhere).not.toHaveBeenCalled();
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
});
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "TaskLabelService", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return TaskLabelService;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _classes = require("@flusys/nestjs-shared/classes");
|
|
12
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
13
|
-
const _common = require("@nestjs/common");
|
|
14
|
-
const _config = require("../config");
|
|
15
|
-
const _entities = require("../entities");
|
|
16
|
-
const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
|
|
17
|
-
function _define_property(obj, key, value) {
|
|
18
|
-
if (key in obj) {
|
|
19
|
-
Object.defineProperty(obj, key, {
|
|
20
|
-
value: value,
|
|
21
|
-
enumerable: true,
|
|
22
|
-
configurable: true,
|
|
23
|
-
writable: true
|
|
24
|
-
});
|
|
25
|
-
} else {
|
|
26
|
-
obj[key] = value;
|
|
27
|
-
}
|
|
28
|
-
return obj;
|
|
29
|
-
}
|
|
30
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
31
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
32
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
33
|
-
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;
|
|
34
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
35
|
-
}
|
|
36
|
-
function _ts_metadata(k, v) {
|
|
37
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
38
|
-
}
|
|
39
|
-
function _ts_param(paramIndex, decorator) {
|
|
40
|
-
return function(target, key) {
|
|
41
|
-
decorator(target, key, paramIndex);
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
let TaskLabelService = class TaskLabelService extends _classes.ApiService {
|
|
45
|
-
async convertSingleDtoToEntity(dto, _user) {
|
|
46
|
-
await this.ensureDataSourceRepository();
|
|
47
|
-
let entity = {};
|
|
48
|
-
if ('id' in dto && dto.id) {
|
|
49
|
-
const existing = await this.repository.findOne({
|
|
50
|
-
where: {
|
|
51
|
-
id: dto.id
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
if (!existing) throw new _common.NotFoundException({
|
|
55
|
-
message: 'Label not found',
|
|
56
|
-
messageKey: _config.TASK_LABEL_MESSAGES.NOT_FOUND
|
|
57
|
-
});
|
|
58
|
-
entity = existing;
|
|
59
|
-
}
|
|
60
|
-
return {
|
|
61
|
-
...entity,
|
|
62
|
-
boardId: dto.boardId ?? entity.boardId,
|
|
63
|
-
name: dto.name ?? entity.name,
|
|
64
|
-
color: dto.color ?? entity.color ?? '#10B981'
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
async getFilterQuery(query, filter, _user) {
|
|
68
|
-
for (const [key, value] of Object.entries(filter)){
|
|
69
|
-
if (key === 'boardId') {
|
|
70
|
-
query.andWhere('task_label.boardId = :boardId', {
|
|
71
|
-
boardId: value
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
query,
|
|
77
|
-
isRaw: false
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
constructor(cacheManager, utilsService, dataSourceProvider){
|
|
81
|
-
super(_config.TASK_MANAGER_EVENT_ENTITIES.TASK_LABEL, cacheManager, utilsService, TaskLabelService.name, true, _config.TASK_MANAGER_EVENT_MODULE, dataSourceProvider, _entities.TaskLabel), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.dataSourceProvider = dataSourceProvider;
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
TaskLabelService = _ts_decorate([
|
|
85
|
-
(0, _common.Injectable)({
|
|
86
|
-
scope: _common.Scope.REQUEST
|
|
87
|
-
}),
|
|
88
|
-
_ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
|
|
89
|
-
_ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
|
|
90
|
-
_ts_param(2, (0, _common.Inject)(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider)),
|
|
91
|
-
_ts_metadata("design:type", Function),
|
|
92
|
-
_ts_metadata("design:paramtypes", [
|
|
93
|
-
typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
|
|
94
|
-
typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
|
|
95
|
-
typeof _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider === "undefined" ? Object : _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider
|
|
96
|
-
])
|
|
97
|
-
], TaskLabelService);
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _testing = require("@nestjs/testing");
|
|
6
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
7
|
-
const _repositorymock = require("@test-utils/mocks/repository.mock");
|
|
8
|
-
const _loggedusermock = require("@test-utils/mocks/logged-user.mock");
|
|
9
|
-
const _tasklabelservice = require("./task-label.service");
|
|
10
|
-
const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
|
|
11
|
-
function buildTaskLabel(overrides = {}) {
|
|
12
|
-
return {
|
|
13
|
-
id: 'label-uuid-1',
|
|
14
|
-
boardId: 'board-uuid-1',
|
|
15
|
-
name: 'Bug',
|
|
16
|
-
color: '#10B981',
|
|
17
|
-
createdAt: new Date(),
|
|
18
|
-
updatedAt: new Date(),
|
|
19
|
-
deletedAt: null,
|
|
20
|
-
createdById: null,
|
|
21
|
-
updatedById: null,
|
|
22
|
-
deletedById: null,
|
|
23
|
-
...overrides
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
function mockQueryRunner(repo) {
|
|
27
|
-
const qr = {
|
|
28
|
-
connect: jest.fn().mockResolvedValue(undefined),
|
|
29
|
-
startTransaction: jest.fn().mockResolvedValue(undefined),
|
|
30
|
-
commitTransaction: jest.fn().mockResolvedValue(undefined),
|
|
31
|
-
rollbackTransaction: jest.fn().mockResolvedValue(undefined),
|
|
32
|
-
release: jest.fn().mockResolvedValue(undefined),
|
|
33
|
-
manager: {
|
|
34
|
-
save: jest.fn((_target, entities)=>Promise.resolve(entities))
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
repo.manager.connection.createQueryRunner.mockReturnValue(qr);
|
|
38
|
-
return qr;
|
|
39
|
-
}
|
|
40
|
-
describe('TaskLabelService', ()=>{
|
|
41
|
-
let service;
|
|
42
|
-
let mockRepo;
|
|
43
|
-
beforeEach(async ()=>{
|
|
44
|
-
mockRepo = (0, _repositorymock.createMockRepository)();
|
|
45
|
-
const mockDataSourceProvider = (0, _repositorymock.createMockDataSourceProvider)(mockRepo);
|
|
46
|
-
const module = await _testing.Test.createTestingModule({
|
|
47
|
-
providers: [
|
|
48
|
-
_tasklabelservice.TaskLabelService,
|
|
49
|
-
{
|
|
50
|
-
provide: 'CACHE_INSTANCE',
|
|
51
|
-
useValue: {}
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
provide: _modules.UtilsService,
|
|
55
|
-
useValue: {
|
|
56
|
-
clearCache: jest.fn(),
|
|
57
|
-
getCacheKey: jest.fn(),
|
|
58
|
-
trackCacheKey: jest.fn()
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
provide: _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider,
|
|
63
|
-
useValue: mockDataSourceProvider
|
|
64
|
-
}
|
|
65
|
-
]
|
|
66
|
-
}).compile();
|
|
67
|
-
service = await module.resolve(_tasklabelservice.TaskLabelService);
|
|
68
|
-
});
|
|
69
|
-
describe('convertSingleDtoToEntity (via insert/update)', ()=>{
|
|
70
|
-
it('creates a label applying the default color when none is given', async ()=>{
|
|
71
|
-
mockQueryRunner(mockRepo);
|
|
72
|
-
const result = await service.insert({
|
|
73
|
-
boardId: 'board-1',
|
|
74
|
-
name: 'Bug'
|
|
75
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
76
|
-
expect(result).toEqual(expect.objectContaining({
|
|
77
|
-
boardId: 'board-1',
|
|
78
|
-
name: 'Bug',
|
|
79
|
-
color: '#10B981'
|
|
80
|
-
}));
|
|
81
|
-
});
|
|
82
|
-
it('respects an explicit color on create', async ()=>{
|
|
83
|
-
mockQueryRunner(mockRepo);
|
|
84
|
-
const result = await service.insert({
|
|
85
|
-
boardId: 'board-1',
|
|
86
|
-
name: 'Urgent',
|
|
87
|
-
color: '#EF4444'
|
|
88
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
89
|
-
expect(result).toEqual(expect.objectContaining({
|
|
90
|
-
color: '#EF4444'
|
|
91
|
-
}));
|
|
92
|
-
});
|
|
93
|
-
it('throws NotFoundException when updating a non-existent label', async ()=>{
|
|
94
|
-
mockQueryRunner(mockRepo);
|
|
95
|
-
mockRepo.findOne.mockResolvedValue(null);
|
|
96
|
-
await expect(service.update({
|
|
97
|
-
id: 'missing',
|
|
98
|
-
name: 'Renamed'
|
|
99
|
-
}, (0, _loggedusermock.buildMockUser)())).rejects.toThrow();
|
|
100
|
-
});
|
|
101
|
-
it('merges update fields onto the existing entity', async ()=>{
|
|
102
|
-
mockQueryRunner(mockRepo);
|
|
103
|
-
const existing = buildTaskLabel({
|
|
104
|
-
id: 'label-1',
|
|
105
|
-
name: 'Old',
|
|
106
|
-
color: '#000000'
|
|
107
|
-
});
|
|
108
|
-
mockRepo.findOne.mockResolvedValue(existing);
|
|
109
|
-
const result = await service.update({
|
|
110
|
-
id: 'label-1',
|
|
111
|
-
name: 'New'
|
|
112
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
113
|
-
expect(result).toEqual(expect.objectContaining({
|
|
114
|
-
id: 'label-1',
|
|
115
|
-
name: 'New',
|
|
116
|
-
color: '#000000'
|
|
117
|
-
}));
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
describe('getFilterQuery', ()=>{
|
|
121
|
-
it('filters by boardId when supplied', async ()=>{
|
|
122
|
-
const qb = (0, _repositorymock.createMockQueryBuilder)();
|
|
123
|
-
const { query, isRaw } = await service.getFilterQuery(qb, {
|
|
124
|
-
boardId: 'board-1'
|
|
125
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
126
|
-
expect(qb.andWhere).toHaveBeenCalledWith('task_label.boardId = :boardId', {
|
|
127
|
-
boardId: 'board-1'
|
|
128
|
-
});
|
|
129
|
-
expect(isRaw).toBe(false);
|
|
130
|
-
expect(query).toBe(qb);
|
|
131
|
-
});
|
|
132
|
-
it('applies no filter when boardId is absent', async ()=>{
|
|
133
|
-
const qb = (0, _repositorymock.createMockQueryBuilder)();
|
|
134
|
-
await service.getFilterQuery(qb, {}, (0, _loggedusermock.buildMockUser)());
|
|
135
|
-
expect(qb.andWhere).not.toHaveBeenCalled();
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
});
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "TaskListService", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return TaskListService;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _classes = require("@flusys/nestjs-shared/classes");
|
|
12
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
13
|
-
const _common = require("@nestjs/common");
|
|
14
|
-
const _config = require("../config");
|
|
15
|
-
const _entities = require("../entities");
|
|
16
|
-
const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
|
|
17
|
-
function _define_property(obj, key, value) {
|
|
18
|
-
if (key in obj) {
|
|
19
|
-
Object.defineProperty(obj, key, {
|
|
20
|
-
value: value,
|
|
21
|
-
enumerable: true,
|
|
22
|
-
configurable: true,
|
|
23
|
-
writable: true
|
|
24
|
-
});
|
|
25
|
-
} else {
|
|
26
|
-
obj[key] = value;
|
|
27
|
-
}
|
|
28
|
-
return obj;
|
|
29
|
-
}
|
|
30
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
31
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
32
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
33
|
-
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;
|
|
34
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
35
|
-
}
|
|
36
|
-
function _ts_metadata(k, v) {
|
|
37
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
38
|
-
}
|
|
39
|
-
function _ts_param(paramIndex, decorator) {
|
|
40
|
-
return function(target, key) {
|
|
41
|
-
decorator(target, key, paramIndex);
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
let TaskListService = class TaskListService extends _classes.ApiService {
|
|
45
|
-
/** Boards cache denormalized `total_tasks` / `total_lists`, so board caches go stale on any write here. */ async clearCacheForAll() {
|
|
46
|
-
await super.clearCacheForAll();
|
|
47
|
-
await this.utilsService.clearCache(_config.TASK_MANAGER_EVENT_ENTITIES.TASK_BOARD, this.cacheManager);
|
|
48
|
-
}
|
|
49
|
-
async convertSingleDtoToEntity(dto, _user) {
|
|
50
|
-
await this.ensureDataSourceRepository();
|
|
51
|
-
let entity = {};
|
|
52
|
-
if ('id' in dto && dto.id) {
|
|
53
|
-
const existing = await this.repository.findOne({
|
|
54
|
-
where: {
|
|
55
|
-
id: dto.id
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
if (!existing) throw new _common.NotFoundException({
|
|
59
|
-
message: 'List not found',
|
|
60
|
-
messageKey: _config.TASK_LIST_MESSAGES.NOT_FOUND
|
|
61
|
-
});
|
|
62
|
-
entity = existing;
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
...entity,
|
|
66
|
-
boardId: dto.boardId ?? entity.boardId,
|
|
67
|
-
name: dto.name ?? entity.name,
|
|
68
|
-
color: dto.color ?? entity.color ?? '#6B7280',
|
|
69
|
-
position: dto.position ?? entity.position ?? 0,
|
|
70
|
-
isDoneList: ('isDoneList' in dto ? dto.isDoneList : undefined) ?? entity.isDoneList ?? false,
|
|
71
|
-
isActive: ('isActive' in dto ? dto.isActive : undefined) ?? entity.isActive ?? true
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
async getFilterQuery(query, filter, _user) {
|
|
75
|
-
for (const [key, value] of Object.entries(filter)){
|
|
76
|
-
if (key === 'boardId') {
|
|
77
|
-
query.andWhere('task_list.boardId = :boardId', {
|
|
78
|
-
boardId: value
|
|
79
|
-
});
|
|
80
|
-
} else if (key === 'isActive' && typeof value === 'boolean') {
|
|
81
|
-
query.andWhere('task_list.isActive = :isActive', {
|
|
82
|
-
isActive: value
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
query.orderBy('task_list.position', 'ASC');
|
|
87
|
-
return {
|
|
88
|
-
query,
|
|
89
|
-
isRaw: false
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
async reorderLists(dto) {
|
|
93
|
-
await this.ensureDataSourceRepository();
|
|
94
|
-
await Promise.all(dto.orderedIds.map((id, i)=>this.repository.update({
|
|
95
|
-
id,
|
|
96
|
-
boardId: dto.boardId
|
|
97
|
-
}, {
|
|
98
|
-
position: i * 100
|
|
99
|
-
})));
|
|
100
|
-
await Promise.all([
|
|
101
|
-
this.clearCacheForAll(),
|
|
102
|
-
this.clearCacheForId(dto.orderedIds.map((id)=>({
|
|
103
|
-
id
|
|
104
|
-
})))
|
|
105
|
-
]);
|
|
106
|
-
await this.publishDomainAction(_config.TASK_MANAGER_EVENT_ACTIONS.REORDERED, {
|
|
107
|
-
ids: dto.orderedIds,
|
|
108
|
-
metadata: {
|
|
109
|
-
boardId: dto.boardId
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
constructor(cacheManager, utilsService, dataSourceProvider){
|
|
114
|
-
super(_config.TASK_MANAGER_EVENT_ENTITIES.TASK_LIST, cacheManager, utilsService, TaskListService.name, true, _config.TASK_MANAGER_EVENT_MODULE, dataSourceProvider, _entities.TaskList), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.dataSourceProvider = dataSourceProvider;
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
TaskListService = _ts_decorate([
|
|
118
|
-
(0, _common.Injectable)({
|
|
119
|
-
scope: _common.Scope.REQUEST
|
|
120
|
-
}),
|
|
121
|
-
_ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
|
|
122
|
-
_ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
|
|
123
|
-
_ts_param(2, (0, _common.Inject)(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider)),
|
|
124
|
-
_ts_metadata("design:type", Function),
|
|
125
|
-
_ts_metadata("design:paramtypes", [
|
|
126
|
-
typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
|
|
127
|
-
typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
|
|
128
|
-
typeof _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider === "undefined" ? Object : _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider
|
|
129
|
-
])
|
|
130
|
-
], TaskListService);
|