@flusys/nestjs-task-manager 7.1.0 → 8.0.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.
Files changed (163) hide show
  1. package/config/index.d.ts +3 -3
  2. package/controllers/index.d.ts +5 -5
  3. package/controllers/task-board.controller.d.ts +3 -3
  4. package/controllers/task-comment.controller.d.ts +2 -2
  5. package/controllers/task-label.controller.d.ts +2 -2
  6. package/controllers/task-list.controller.d.ts +3 -3
  7. package/controllers/task.controller.d.ts +4 -4
  8. package/docs/index.d.ts +1 -1
  9. package/docs/task-manager-swagger.config.d.ts +1 -1
  10. package/dtos/index.d.ts +5 -5
  11. package/dtos/task-board.dto.d.ts +1 -1
  12. package/dtos/task.dto.d.ts +2 -2
  13. package/entities/index.d.ts +19 -19
  14. package/entities/task-board-with-company.entity.d.ts +1 -1
  15. package/fesm/234.js +1393 -0
  16. package/fesm/431.js +981 -0
  17. package/fesm/827.js +1054 -0
  18. package/fesm/988.js +881 -0
  19. package/fesm/config/index.js +156 -3
  20. package/fesm/controllers/index.js +21 -5
  21. package/fesm/docs/index.js +58 -1
  22. package/fesm/dtos/index.js +280 -5
  23. package/fesm/entities/index.js +26 -46
  24. package/fesm/gateways/index.js +288 -1
  25. package/fesm/index.js +440 -9
  26. package/fesm/interfaces/index.js +16 -2
  27. package/fesm/modules/index.js +210 -1
  28. package/fesm/runtime.js +85 -0
  29. package/fesm/services/index.js +53 -8
  30. package/gateways/index.d.ts +1 -1
  31. package/gateways/task-board.gateway.d.ts +3 -3
  32. package/index.d.ts +9 -9
  33. package/interfaces/index.d.ts +2 -2
  34. package/interfaces/task-manager-module.interface.d.ts +3 -3
  35. package/interfaces/task.interface.d.ts +2 -2
  36. package/modules/index.d.ts +1 -1
  37. package/modules/task-manager.module.d.ts +2 -2
  38. package/package.json +26 -36
  39. package/services/index.d.ts +8 -8
  40. package/services/task-activity.service.d.ts +1 -1
  41. package/services/task-board.service.d.ts +5 -5
  42. package/services/task-comment.service.d.ts +4 -4
  43. package/services/task-label.service.d.ts +4 -4
  44. package/services/task-list.service.d.ts +4 -4
  45. package/services/task-manager-config.service.d.ts +3 -3
  46. package/services/task-manager-datasource.provider.d.ts +3 -3
  47. package/services/task.service.d.ts +7 -7
  48. package/cjs/config/event-actions.js +0 -37
  49. package/cjs/config/index.js +0 -20
  50. package/cjs/config/message-keys.js +0 -92
  51. package/cjs/config/task-manager.constants.js +0 -11
  52. package/cjs/controllers/index.js +0 -22
  53. package/cjs/controllers/task-board.controller.js +0 -219
  54. package/cjs/controllers/task-board.controller.spec.js +0 -132
  55. package/cjs/controllers/task-comment.controller.js +0 -103
  56. package/cjs/controllers/task-comment.controller.spec.js +0 -86
  57. package/cjs/controllers/task-label.controller.js +0 -112
  58. package/cjs/controllers/task-label.controller.spec.js +0 -88
  59. package/cjs/controllers/task-list.controller.js +0 -158
  60. package/cjs/controllers/task-list.controller.spec.js +0 -112
  61. package/cjs/controllers/task.controller.js +0 -199
  62. package/cjs/controllers/task.controller.spec.js +0 -131
  63. package/cjs/docs/index.js +0 -18
  64. package/cjs/docs/task-manager-swagger.config.js +0 -43
  65. package/cjs/docs/task-manager-swagger.config.spec.js +0 -28
  66. package/cjs/dtos/index.js +0 -22
  67. package/cjs/dtos/task-board.dto.js +0 -310
  68. package/cjs/dtos/task-comment.dto.js +0 -131
  69. package/cjs/dtos/task-label.dto.js +0 -120
  70. package/cjs/dtos/task-list.dto.js +0 -198
  71. package/cjs/dtos/task.dto.js +0 -367
  72. package/cjs/entities/index.js +0 -72
  73. package/cjs/entities/index.spec.js +0 -30
  74. package/cjs/entities/task-activity.entity.js +0 -98
  75. package/cjs/entities/task-assignee.entity.js +0 -67
  76. package/cjs/entities/task-board-member.entity.js +0 -94
  77. package/cjs/entities/task-board-with-company.entity.js +0 -57
  78. package/cjs/entities/task-board.entity.js +0 -88
  79. package/cjs/entities/task-comment.entity.js +0 -80
  80. package/cjs/entities/task-label.entity.js +0 -72
  81. package/cjs/entities/task-list.entity.js +0 -104
  82. package/cjs/entities/task-task-label.entity.js +0 -67
  83. package/cjs/entities/task.entity.js +0 -151
  84. package/cjs/gateways/index.js +0 -18
  85. package/cjs/gateways/task-board.gateway.js +0 -167
  86. package/cjs/gateways/task-board.gateway.spec.js +0 -243
  87. package/cjs/index.js +0 -26
  88. package/cjs/interfaces/index.js +0 -19
  89. package/cjs/interfaces/task-manager-module.interface.js +0 -4
  90. package/cjs/interfaces/task.interface.js +0 -4
  91. package/cjs/modules/index.js +0 -18
  92. package/cjs/modules/task-manager.module.js +0 -135
  93. package/cjs/modules/task-manager.module.spec.js +0 -144
  94. package/cjs/services/index.js +0 -25
  95. package/cjs/services/task-activity.service.js +0 -76
  96. package/cjs/services/task-activity.service.spec.js +0 -125
  97. package/cjs/services/task-board.service.js +0 -247
  98. package/cjs/services/task-board.service.spec.js +0 -465
  99. package/cjs/services/task-comment.service.js +0 -103
  100. package/cjs/services/task-comment.service.spec.js +0 -160
  101. package/cjs/services/task-label.service.js +0 -97
  102. package/cjs/services/task-label.service.spec.js +0 -138
  103. package/cjs/services/task-list.service.js +0 -130
  104. package/cjs/services/task-list.service.spec.js +0 -284
  105. package/cjs/services/task-manager-config.service.js +0 -69
  106. package/cjs/services/task-manager-config.service.spec.js +0 -98
  107. package/cjs/services/task-manager-datasource.provider.js +0 -84
  108. package/cjs/services/task-manager-datasource.provider.spec.js +0 -131
  109. package/cjs/services/task.service.js +0 -398
  110. package/cjs/services/task.service.spec.js +0 -700
  111. package/fesm/config/event-actions.js +0 -16
  112. package/fesm/config/message-keys.js +0 -65
  113. package/fesm/config/task-manager.constants.js +0 -1
  114. package/fesm/controllers/task-board.controller.js +0 -209
  115. package/fesm/controllers/task-board.controller.spec.js +0 -128
  116. package/fesm/controllers/task-comment.controller.js +0 -93
  117. package/fesm/controllers/task-comment.controller.spec.js +0 -82
  118. package/fesm/controllers/task-label.controller.js +0 -102
  119. package/fesm/controllers/task-label.controller.spec.js +0 -84
  120. package/fesm/controllers/task-list.controller.js +0 -148
  121. package/fesm/controllers/task-list.controller.spec.js +0 -108
  122. package/fesm/controllers/task.controller.js +0 -189
  123. package/fesm/controllers/task.controller.spec.js +0 -127
  124. package/fesm/docs/task-manager-swagger.config.js +0 -33
  125. package/fesm/docs/task-manager-swagger.config.spec.js +0 -24
  126. package/fesm/dtos/task-board.dto.js +0 -277
  127. package/fesm/dtos/task-comment.dto.js +0 -110
  128. package/fesm/dtos/task-label.dto.js +0 -99
  129. package/fesm/dtos/task-list.dto.js +0 -174
  130. package/fesm/dtos/task.dto.js +0 -337
  131. package/fesm/entities/index.spec.js +0 -26
  132. package/fesm/entities/task-activity.entity.js +0 -88
  133. package/fesm/entities/task-assignee.entity.js +0 -57
  134. package/fesm/entities/task-board-member.entity.js +0 -76
  135. package/fesm/entities/task-board-with-company.entity.js +0 -47
  136. package/fesm/entities/task-board.entity.js +0 -78
  137. package/fesm/entities/task-comment.entity.js +0 -70
  138. package/fesm/entities/task-label.entity.js +0 -62
  139. package/fesm/entities/task-list.entity.js +0 -94
  140. package/fesm/entities/task-task-label.entity.js +0 -57
  141. package/fesm/entities/task.entity.js +0 -133
  142. package/fesm/gateways/task-board.gateway.js +0 -157
  143. package/fesm/gateways/task-board.gateway.spec.js +0 -239
  144. package/fesm/interfaces/task-manager-module.interface.js +0 -1
  145. package/fesm/interfaces/task.interface.js +0 -1
  146. package/fesm/modules/task-manager.module.js +0 -125
  147. package/fesm/modules/task-manager.module.spec.js +0 -140
  148. package/fesm/services/task-activity.service.js +0 -66
  149. package/fesm/services/task-activity.service.spec.js +0 -121
  150. package/fesm/services/task-board.service.js +0 -237
  151. package/fesm/services/task-board.service.spec.js +0 -461
  152. package/fesm/services/task-comment.service.js +0 -93
  153. package/fesm/services/task-comment.service.spec.js +0 -156
  154. package/fesm/services/task-label.service.js +0 -87
  155. package/fesm/services/task-label.service.spec.js +0 -134
  156. package/fesm/services/task-list.service.js +0 -120
  157. package/fesm/services/task-list.service.spec.js +0 -280
  158. package/fesm/services/task-manager-config.service.js +0 -59
  159. package/fesm/services/task-manager-config.service.spec.js +0 -94
  160. package/fesm/services/task-manager-datasource.provider.js +0 -74
  161. package/fesm/services/task-manager-datasource.provider.spec.js +0 -127
  162. package/fesm/services/task.service.js +0 -388
  163. package/fesm/services/task.service.spec.js +0 -696
@@ -1,16 +0,0 @@
1
- /**
2
- * Domain event actions published by the task manager module, alongside the CRUD
3
- * lifecycle actions every ApiService emits.
4
- */ export const TASK_MANAGER_EVENT_ACTIONS = {
5
- MOVED: 'moved',
6
- ASSIGNED: 'assigned',
7
- REORDERED: 'reordered'
8
- };
9
- /** Every entity the task manager module publishes under */ export const TASK_MANAGER_EVENT_ENTITIES = {
10
- TASK: 'task',
11
- TASK_BOARD: 'task_board',
12
- TASK_LIST: 'task_list',
13
- TASK_LABEL: 'task_label',
14
- TASK_COMMENT: 'task_comment'
15
- };
16
- export const TASK_MANAGER_EVENT_MODULE = 'task-manager';
@@ -1,65 +0,0 @@
1
- export const TASK_BOARD_MESSAGES = {
2
- NOT_FOUND: 'task.board.not.found',
3
- CREATE_SUCCESS: 'task.board.create.success',
4
- CREATE_MANY_SUCCESS: 'task.board.create.many.success',
5
- GET_SUCCESS: 'task.board.get.success',
6
- GET_ALL_SUCCESS: 'task.board.get.all.success',
7
- UPDATE_SUCCESS: 'task.board.update.success',
8
- UPDATE_MANY_SUCCESS: 'task.board.update.many.success',
9
- DELETE_SUCCESS: 'task.board.delete.success',
10
- RESTORE_SUCCESS: 'task.board.restore.success',
11
- MEMBER_ADDED: 'task.board.member.added',
12
- MEMBER_REMOVED: 'task.board.member.removed',
13
- MEMBER_NOT_FOUND: 'task.board.member.not.found',
14
- MEMBER_ALREADY_EXISTS: 'task.board.member.already.exists',
15
- MEMBER_GET_ALL_SUCCESS: 'task.board.member.get.all.success'
16
- };
17
- export const TASK_LIST_MESSAGES = {
18
- NOT_FOUND: 'task.list.not.found',
19
- CREATE_SUCCESS: 'task.list.create.success',
20
- CREATE_MANY_SUCCESS: 'task.list.create.many.success',
21
- GET_SUCCESS: 'task.list.get.success',
22
- GET_ALL_SUCCESS: 'task.list.get.all.success',
23
- UPDATE_SUCCESS: 'task.list.update.success',
24
- UPDATE_MANY_SUCCESS: 'task.list.update.many.success',
25
- DELETE_SUCCESS: 'task.list.delete.success',
26
- RESTORE_SUCCESS: 'task.list.restore.success',
27
- REORDER_SUCCESS: 'task.list.reorder.success'
28
- };
29
- export const TASK_MESSAGES = {
30
- NOT_FOUND: 'task.not.found',
31
- CREATE_SUCCESS: 'task.create.success',
32
- CREATE_MANY_SUCCESS: 'task.create.many.success',
33
- GET_SUCCESS: 'task.get.success',
34
- GET_ALL_SUCCESS: 'task.get.all.success',
35
- UPDATE_SUCCESS: 'task.update.success',
36
- UPDATE_MANY_SUCCESS: 'task.update.many.success',
37
- DELETE_SUCCESS: 'task.delete.success',
38
- RESTORE_SUCCESS: 'task.restore.success',
39
- MOVE_SUCCESS: 'task.move.success',
40
- ASSIGN_SUCCESS: 'task.assign.success',
41
- ASSIGNEE_NOT_BOARD_MEMBER: 'task.assignee.not.board.member'
42
- };
43
- export const TASK_LABEL_MESSAGES = {
44
- NOT_FOUND: 'task.label.not.found',
45
- CREATE_SUCCESS: 'task.label.create.success',
46
- CREATE_MANY_SUCCESS: 'task.label.create.many.success',
47
- GET_SUCCESS: 'task.label.get.success',
48
- GET_ALL_SUCCESS: 'task.label.get.all.success',
49
- UPDATE_SUCCESS: 'task.label.update.success',
50
- UPDATE_MANY_SUCCESS: 'task.label.update.many.success',
51
- DELETE_SUCCESS: 'task.label.delete.success',
52
- RESTORE_SUCCESS: 'task.label.restore.success'
53
- };
54
- export const TASK_COMMENT_MESSAGES = {
55
- NOT_FOUND: 'task.comment.not.found',
56
- CREATE_SUCCESS: 'task.comment.create.success',
57
- CREATE_MANY_SUCCESS: 'task.comment.create.many.success',
58
- GET_SUCCESS: 'task.comment.get.success',
59
- GET_ALL_SUCCESS: 'task.comment.get.all.success',
60
- UPDATE_SUCCESS: 'task.comment.update.success',
61
- UPDATE_MANY_SUCCESS: 'task.comment.update.many.success',
62
- DELETE_SUCCESS: 'task.comment.delete.success',
63
- RESTORE_SUCCESS: 'task.comment.restore.success',
64
- FORBIDDEN: 'task.comment.forbidden'
65
- };
@@ -1 +0,0 @@
1
- export const TASK_MANAGER_MODULE_OPTIONS = 'TASK_MANAGER_MODULE_OPTIONS';
@@ -1,209 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- 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;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- function _ts_param(paramIndex, decorator) {
24
- return function(target, key) {
25
- decorator(target, key, paramIndex);
26
- };
27
- }
28
- import { TASK_BOARD_PERMISSIONS } from '@flusys/nestjs-shared';
29
- import { createApiController } from '@flusys/nestjs-shared/classes';
30
- import { ApiResponseDto, CurrentUser, RequirePermission } from '@flusys/nestjs-shared/decorators';
31
- import { MessageResponseDto } from '@flusys/nestjs-shared/dtos';
32
- import { JwtAuthGuard, PermissionGuard } from '@flusys/nestjs-shared/guards';
33
- import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
34
- import { Body, Controller, HttpCode, HttpStatus, Inject, Post, UseGuards } from '@nestjs/common';
35
- import { ApiBearerAuth, ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
36
- import { plainToInstance } from 'class-transformer';
37
- import { TASK_BOARD_MESSAGES } from '../config';
38
- import { AddBoardMemberDto, CreateTaskBoardDto, GetBoardMembersDto, RemoveBoardMemberDto, TaskBoardMemberResponseDto, TaskBoardResponseDto, UpdateTaskBoardDto } from '../dtos';
39
- import { TaskBoardService } from '../services/task-board.service';
40
- export class TaskBoardController extends createApiController(CreateTaskBoardDto, UpdateTaskBoardDto, TaskBoardResponseDto, {
41
- entityName: 'task.board',
42
- enabledEndpoints: [
43
- 'insert',
44
- 'insertMany',
45
- 'getById',
46
- 'getAll',
47
- 'update',
48
- 'updateMany',
49
- 'delete'
50
- ],
51
- security: {
52
- insert: {
53
- level: 'permission',
54
- permissions: [
55
- TASK_BOARD_PERMISSIONS.CREATE
56
- ]
57
- },
58
- insertMany: {
59
- level: 'permission',
60
- permissions: [
61
- TASK_BOARD_PERMISSIONS.CREATE
62
- ]
63
- },
64
- getById: {
65
- level: 'permission',
66
- permissions: [
67
- TASK_BOARD_PERMISSIONS.READ
68
- ]
69
- },
70
- getAll: {
71
- level: 'permission',
72
- permissions: [
73
- TASK_BOARD_PERMISSIONS.READ
74
- ]
75
- },
76
- update: {
77
- level: 'permission',
78
- permissions: [
79
- TASK_BOARD_PERMISSIONS.UPDATE
80
- ]
81
- },
82
- updateMany: {
83
- level: 'permission',
84
- permissions: [
85
- TASK_BOARD_PERMISSIONS.UPDATE
86
- ]
87
- },
88
- delete: {
89
- level: 'permission',
90
- permissions: [
91
- TASK_BOARD_PERMISSIONS.DELETE
92
- ]
93
- }
94
- }
95
- }) {
96
- async addMember(dto, user) {
97
- const member = await this.boardService.addMember(dto, user);
98
- return {
99
- success: true,
100
- message: 'Member added to board',
101
- messageKey: TASK_BOARD_MESSAGES.MEMBER_ADDED,
102
- data: plainToInstance(TaskBoardMemberResponseDto, member, {
103
- excludeExtraneousValues: true
104
- })
105
- };
106
- }
107
- async removeMember(dto) {
108
- await this.boardService.removeMember(dto);
109
- return {
110
- success: true,
111
- message: 'Member removed',
112
- messageKey: TASK_BOARD_MESSAGES.MEMBER_REMOVED
113
- };
114
- }
115
- async getMembers(dto) {
116
- const members = await this.boardService.getMembers(dto.boardId);
117
- const data = plainToInstance(TaskBoardMemberResponseDto, members, {
118
- excludeExtraneousValues: true
119
- });
120
- return {
121
- success: true,
122
- message: 'Board members retrieved',
123
- messageKey: TASK_BOARD_MESSAGES.MEMBER_GET_ALL_SUCCESS,
124
- data,
125
- meta: {
126
- total: data.length,
127
- page: 0,
128
- pageSize: data.length,
129
- count: data.length
130
- }
131
- };
132
- }
133
- constructor(boardService){
134
- super(boardService), _define_property(this, "boardService", void 0), this.boardService = boardService;
135
- }
136
- }
137
- _ts_decorate([
138
- Post('add-member'),
139
- UseGuards(JwtAuthGuard, PermissionGuard),
140
- ApiBearerAuth(),
141
- HttpCode(HttpStatus.OK),
142
- RequirePermission(TASK_BOARD_PERMISSIONS.MANAGE_MEMBERS),
143
- ApiOperation({
144
- summary: 'Add user to board'
145
- }),
146
- ApiBody({
147
- type: AddBoardMemberDto
148
- }),
149
- ApiResponseDto(TaskBoardMemberResponseDto),
150
- _ts_param(0, Body()),
151
- _ts_param(1, CurrentUser()),
152
- _ts_metadata("design:type", Function),
153
- _ts_metadata("design:paramtypes", [
154
- typeof AddBoardMemberDto === "undefined" ? Object : AddBoardMemberDto,
155
- typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
156
- ]),
157
- _ts_metadata("design:returntype", Promise)
158
- ], TaskBoardController.prototype, "addMember", null);
159
- _ts_decorate([
160
- Post('remove-member'),
161
- UseGuards(JwtAuthGuard, PermissionGuard),
162
- ApiBearerAuth(),
163
- HttpCode(HttpStatus.OK),
164
- RequirePermission(TASK_BOARD_PERMISSIONS.MANAGE_MEMBERS),
165
- ApiOperation({
166
- summary: 'Remove user from board'
167
- }),
168
- ApiBody({
169
- type: RemoveBoardMemberDto
170
- }),
171
- ApiResponse({
172
- status: 200,
173
- type: MessageResponseDto
174
- }),
175
- _ts_param(0, Body()),
176
- _ts_metadata("design:type", Function),
177
- _ts_metadata("design:paramtypes", [
178
- typeof RemoveBoardMemberDto === "undefined" ? Object : RemoveBoardMemberDto
179
- ]),
180
- _ts_metadata("design:returntype", Promise)
181
- ], TaskBoardController.prototype, "removeMember", null);
182
- _ts_decorate([
183
- Post('get-members'),
184
- UseGuards(JwtAuthGuard),
185
- ApiBearerAuth(),
186
- HttpCode(HttpStatus.OK),
187
- ApiOperation({
188
- summary: 'Get all board members'
189
- }),
190
- ApiBody({
191
- type: GetBoardMembersDto
192
- }),
193
- ApiResponseDto(TaskBoardMemberResponseDto, true),
194
- _ts_param(0, Body()),
195
- _ts_metadata("design:type", Function),
196
- _ts_metadata("design:paramtypes", [
197
- typeof GetBoardMembersDto === "undefined" ? Object : GetBoardMembersDto
198
- ]),
199
- _ts_metadata("design:returntype", Promise)
200
- ], TaskBoardController.prototype, "getMembers", null);
201
- TaskBoardController = _ts_decorate([
202
- ApiTags('Task Manager - Boards'),
203
- Controller('task-manager/board'),
204
- _ts_param(0, Inject(TaskBoardService)),
205
- _ts_metadata("design:type", Function),
206
- _ts_metadata("design:paramtypes", [
207
- typeof TaskBoardService === "undefined" ? Object : TaskBoardService
208
- ])
209
- ], TaskBoardController);
@@ -1,128 +0,0 @@
1
- import { buildMockUser } from '@test-utils/mocks/logged-user.mock';
2
- import { TaskBoardController } from './task-board.controller';
3
- function buildBoard(overrides = {}) {
4
- return {
5
- id: 'board-uuid-1',
6
- name: 'Sprint Board',
7
- description: null,
8
- isActive: true,
9
- readOnly: false,
10
- createdAt: new Date(),
11
- updatedAt: new Date(),
12
- ...overrides
13
- };
14
- }
15
- describe('TaskBoardController', ()=>{
16
- let controller;
17
- let mockBoardService;
18
- beforeEach(()=>{
19
- mockBoardService = {
20
- insert: jest.fn(),
21
- findById: jest.fn(),
22
- getAll: jest.fn(),
23
- update: jest.fn(),
24
- delete: jest.fn(),
25
- addMember: jest.fn(),
26
- removeMember: jest.fn(),
27
- getMembers: jest.fn()
28
- };
29
- controller = new TaskBoardController(mockBoardService);
30
- });
31
- describe('insert', ()=>{
32
- it('creates a board and returns the mapped response', async ()=>{
33
- const user = buildMockUser();
34
- mockBoardService.insert.mockResolvedValue(buildBoard());
35
- const result = await controller.insert({
36
- name: 'Sprint Board'
37
- }, user);
38
- expect(mockBoardService.insert).toHaveBeenCalledWith({
39
- name: 'Sprint Board'
40
- }, user);
41
- expect(result.success).toBe(true);
42
- expect(result.data).toEqual(expect.objectContaining({
43
- id: 'board-uuid-1'
44
- }));
45
- });
46
- });
47
- describe('getAll', ()=>{
48
- it('paginates boards and maps the response list', async ()=>{
49
- mockBoardService.getAll.mockResolvedValue({
50
- data: [
51
- buildBoard()
52
- ],
53
- total: 1
54
- });
55
- const result = await controller.getAll({}, buildMockUser(), '');
56
- expect(mockBoardService.getAll).toHaveBeenCalledWith('', {}, buildMockUser());
57
- expect(result.data).toHaveLength(1);
58
- });
59
- });
60
- describe('addMember', ()=>{
61
- it('adds a member to the board and maps the response', async ()=>{
62
- const user = buildMockUser();
63
- mockBoardService.addMember.mockResolvedValue({
64
- id: 'member-1',
65
- boardId: 'board-uuid-1',
66
- userId: 'user-2',
67
- role: 'member'
68
- });
69
- const result = await controller.addMember({
70
- boardId: 'board-uuid-1',
71
- userId: 'user-2'
72
- }, user);
73
- expect(mockBoardService.addMember).toHaveBeenCalledWith({
74
- boardId: 'board-uuid-1',
75
- userId: 'user-2'
76
- }, user);
77
- expect(result.success).toBe(true);
78
- expect(result.data).toEqual(expect.objectContaining({
79
- userId: 'user-2'
80
- }));
81
- });
82
- });
83
- describe('removeMember', ()=>{
84
- it('removes a member from the board', async ()=>{
85
- mockBoardService.removeMember.mockResolvedValue(undefined);
86
- const result = await controller.removeMember({
87
- boardId: 'board-uuid-1',
88
- userId: 'user-2'
89
- });
90
- expect(mockBoardService.removeMember).toHaveBeenCalledWith({
91
- boardId: 'board-uuid-1',
92
- userId: 'user-2'
93
- });
94
- expect(result.success).toBe(true);
95
- });
96
- });
97
- describe('getMembers', ()=>{
98
- it('returns all members for a board with a computed pagination meta', async ()=>{
99
- mockBoardService.getMembers.mockResolvedValue([
100
- {
101
- id: 'member-1',
102
- userId: 'user-2',
103
- role: 'member'
104
- }
105
- ]);
106
- const result = await controller.getMembers({
107
- boardId: 'board-uuid-1'
108
- });
109
- expect(mockBoardService.getMembers).toHaveBeenCalledWith('board-uuid-1');
110
- expect(result.data).toHaveLength(1);
111
- expect(result.meta).toEqual(expect.objectContaining({
112
- total: 1,
113
- count: 1
114
- }));
115
- });
116
- it('returns an empty list with zeroed meta when the board has no members', async ()=>{
117
- mockBoardService.getMembers.mockResolvedValue([]);
118
- const result = await controller.getMembers({
119
- boardId: 'board-uuid-1'
120
- });
121
- expect(result.data).toEqual([]);
122
- expect(result.meta).toEqual(expect.objectContaining({
123
- total: 0,
124
- count: 0
125
- }));
126
- });
127
- });
128
- });
@@ -1,93 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- 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;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- function _ts_param(paramIndex, decorator) {
24
- return function(target, key) {
25
- decorator(target, key, paramIndex);
26
- };
27
- }
28
- import { createApiController } from '@flusys/nestjs-shared/classes';
29
- import { Controller, Inject } from '@nestjs/common';
30
- import { ApiTags } from '@nestjs/swagger';
31
- import { TASK_COMMENT_PERMISSIONS } from '@flusys/nestjs-shared';
32
- import { CreateTaskCommentDto, TaskCommentResponseDto, UpdateTaskCommentDto } from '../dtos';
33
- import { TaskCommentService } from '../services/task-comment.service';
34
- export class TaskCommentController extends createApiController(CreateTaskCommentDto, UpdateTaskCommentDto, TaskCommentResponseDto, {
35
- entityName: 'task.comment',
36
- enabledEndpoints: [
37
- 'insert',
38
- 'insertMany',
39
- 'getById',
40
- 'getAll',
41
- 'update',
42
- 'updateMany',
43
- 'delete'
44
- ],
45
- security: {
46
- insert: {
47
- level: 'permission',
48
- permissions: [
49
- TASK_COMMENT_PERMISSIONS.CREATE
50
- ]
51
- },
52
- insertMany: {
53
- level: 'permission',
54
- permissions: [
55
- TASK_COMMENT_PERMISSIONS.CREATE
56
- ]
57
- },
58
- getById: {
59
- level: 'jwt'
60
- },
61
- getAll: {
62
- level: 'permission',
63
- permissions: [
64
- TASK_COMMENT_PERMISSIONS.READ
65
- ]
66
- },
67
- update: {
68
- level: 'jwt'
69
- },
70
- updateMany: {
71
- level: 'jwt'
72
- },
73
- delete: {
74
- level: 'permission',
75
- permissions: [
76
- TASK_COMMENT_PERMISSIONS.DELETE
77
- ]
78
- }
79
- }
80
- }) {
81
- constructor(commentService){
82
- super(commentService), _define_property(this, "commentService", void 0), this.commentService = commentService;
83
- }
84
- }
85
- TaskCommentController = _ts_decorate([
86
- ApiTags('Task Manager - Comments'),
87
- Controller('task-manager/comment'),
88
- _ts_param(0, Inject(TaskCommentService)),
89
- _ts_metadata("design:type", Function),
90
- _ts_metadata("design:paramtypes", [
91
- typeof TaskCommentService === "undefined" ? Object : TaskCommentService
92
- ])
93
- ], TaskCommentController);
@@ -1,82 +0,0 @@
1
- import { buildMockUser } from '@test-utils/mocks/logged-user.mock';
2
- import { TaskCommentController } from './task-comment.controller';
3
- function buildComment(overrides = {}) {
4
- return {
5
- id: 'comment-1',
6
- taskId: 'task-uuid-1',
7
- userId: 'user-uuid-1',
8
- body: 'Looks good to me',
9
- readOnly: false,
10
- createdAt: new Date(),
11
- updatedAt: new Date(),
12
- ...overrides
13
- };
14
- }
15
- describe('TaskCommentController', ()=>{
16
- let controller;
17
- let mockCommentService;
18
- beforeEach(()=>{
19
- mockCommentService = {
20
- insert: jest.fn(),
21
- findById: jest.fn(),
22
- getAll: jest.fn(),
23
- update: jest.fn(),
24
- delete: jest.fn()
25
- };
26
- controller = new TaskCommentController(mockCommentService);
27
- });
28
- it('wires the injected service onto the generated controller base', ()=>{
29
- expect(controller.service).toBe(mockCommentService);
30
- });
31
- describe('insert', ()=>{
32
- it('creates a comment and returns the mapped response', async ()=>{
33
- const user = buildMockUser();
34
- mockCommentService.insert.mockResolvedValue(buildComment());
35
- const result = await controller.insert({
36
- taskId: 'task-uuid-1',
37
- body: 'Looks good to me'
38
- }, user);
39
- expect(mockCommentService.insert).toHaveBeenCalledWith({
40
- taskId: 'task-uuid-1',
41
- body: 'Looks good to me'
42
- }, user);
43
- expect(result.success).toBe(true);
44
- expect(result.data).toEqual(expect.objectContaining({
45
- id: 'comment-1'
46
- }));
47
- });
48
- });
49
- describe('getAll', ()=>{
50
- it('paginates comments and maps the response list', async ()=>{
51
- mockCommentService.getAll.mockResolvedValue({
52
- data: [
53
- buildComment()
54
- ],
55
- total: 1
56
- });
57
- const result = await controller.getAll({}, buildMockUser(), '');
58
- expect(mockCommentService.getAll).toHaveBeenCalledWith('', {}, buildMockUser());
59
- expect(result.data).toHaveLength(1);
60
- });
61
- });
62
- describe('delete', ()=>{
63
- it('delegates soft-delete to the service', async ()=>{
64
- mockCommentService.delete.mockResolvedValue({
65
- count: 1
66
- });
67
- const result = await controller.delete({
68
- id: [
69
- 'comment-1'
70
- ],
71
- type: 'delete'
72
- }, buildMockUser());
73
- expect(mockCommentService.delete).toHaveBeenCalledWith({
74
- id: [
75
- 'comment-1'
76
- ],
77
- type: 'delete'
78
- }, buildMockUser());
79
- expect(result.success).toBe(true);
80
- });
81
- });
82
- });