@flusys/nestjs-task-manager 5.3.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 (137) hide show
  1. package/README.md +245 -0
  2. package/cjs/config/index.js +19 -0
  3. package/cjs/config/message-keys.js +92 -0
  4. package/cjs/config/task-manager.constants.js +11 -0
  5. package/cjs/controllers/index.js +22 -0
  6. package/cjs/controllers/task-board.controller.js +219 -0
  7. package/cjs/controllers/task-comment.controller.js +103 -0
  8. package/cjs/controllers/task-label.controller.js +112 -0
  9. package/cjs/controllers/task-list.controller.js +158 -0
  10. package/cjs/controllers/task.controller.js +199 -0
  11. package/cjs/docs/index.js +18 -0
  12. package/cjs/docs/task-manager-swagger.config.js +43 -0
  13. package/cjs/dtos/index.js +22 -0
  14. package/cjs/dtos/task-board.dto.js +310 -0
  15. package/cjs/dtos/task-comment.dto.js +131 -0
  16. package/cjs/dtos/task-label.dto.js +120 -0
  17. package/cjs/dtos/task-list.dto.js +198 -0
  18. package/cjs/dtos/task.dto.js +367 -0
  19. package/cjs/entities/index.js +72 -0
  20. package/cjs/entities/task-activity.entity.js +98 -0
  21. package/cjs/entities/task-assignee.entity.js +67 -0
  22. package/cjs/entities/task-board-member.entity.js +94 -0
  23. package/cjs/entities/task-board-with-company.entity.js +57 -0
  24. package/cjs/entities/task-board.entity.js +88 -0
  25. package/cjs/entities/task-comment.entity.js +80 -0
  26. package/cjs/entities/task-label.entity.js +72 -0
  27. package/cjs/entities/task-list.entity.js +104 -0
  28. package/cjs/entities/task-task-label.entity.js +67 -0
  29. package/cjs/entities/task.entity.js +151 -0
  30. package/cjs/gateways/index.js +18 -0
  31. package/cjs/gateways/task-board.gateway.js +199 -0
  32. package/cjs/index.js +26 -0
  33. package/cjs/interfaces/index.js +19 -0
  34. package/cjs/interfaces/task-manager-module.interface.js +4 -0
  35. package/cjs/interfaces/task.interface.js +4 -0
  36. package/cjs/modules/index.js +18 -0
  37. package/cjs/modules/task-manager.module.js +131 -0
  38. package/cjs/services/index.js +25 -0
  39. package/cjs/services/task-activity.service.js +76 -0
  40. package/cjs/services/task-board.service.js +235 -0
  41. package/cjs/services/task-comment.service.js +103 -0
  42. package/cjs/services/task-label.service.js +97 -0
  43. package/cjs/services/task-list.service.js +115 -0
  44. package/cjs/services/task-manager-config.service.js +69 -0
  45. package/cjs/services/task-manager-datasource.provider.js +84 -0
  46. package/cjs/services/task.service.js +359 -0
  47. package/config/index.d.ts +2 -0
  48. package/config/message-keys.d.ts +65 -0
  49. package/config/task-manager.constants.d.ts +1 -0
  50. package/controllers/index.d.ts +5 -0
  51. package/controllers/task-board.controller.d.ts +27 -0
  52. package/controllers/task-comment.controller.d.ts +22 -0
  53. package/controllers/task-label.controller.d.ts +22 -0
  54. package/controllers/task-list.controller.d.ts +26 -0
  55. package/controllers/task.controller.d.ts +28 -0
  56. package/docs/index.d.ts +1 -0
  57. package/docs/task-manager-swagger.config.d.ts +2 -0
  58. package/dtos/index.d.ts +5 -0
  59. package/dtos/task-board.dto.d.ts +44 -0
  60. package/dtos/task-comment.dto.d.ts +16 -0
  61. package/dtos/task-label.dto.d.ts +16 -0
  62. package/dtos/task-list.dto.d.ts +26 -0
  63. package/dtos/task.dto.d.ts +48 -0
  64. package/entities/index.d.ts +22 -0
  65. package/entities/task-activity.entity.d.ts +9 -0
  66. package/entities/task-assignee.entity.d.ts +5 -0
  67. package/entities/task-board-member.entity.d.ts +12 -0
  68. package/entities/task-board-with-company.entity.d.ts +4 -0
  69. package/entities/task-board.entity.d.ts +8 -0
  70. package/entities/task-comment.entity.d.ts +7 -0
  71. package/entities/task-label.entity.d.ts +6 -0
  72. package/entities/task-list.entity.d.ts +9 -0
  73. package/entities/task-task-label.entity.d.ts +5 -0
  74. package/entities/task.entity.d.ts +23 -0
  75. package/fesm/config/index.js +2 -0
  76. package/fesm/config/message-keys.js +65 -0
  77. package/fesm/config/task-manager.constants.js +1 -0
  78. package/fesm/controllers/index.js +5 -0
  79. package/fesm/controllers/task-board.controller.js +209 -0
  80. package/fesm/controllers/task-comment.controller.js +93 -0
  81. package/fesm/controllers/task-label.controller.js +102 -0
  82. package/fesm/controllers/task-list.controller.js +148 -0
  83. package/fesm/controllers/task.controller.js +189 -0
  84. package/fesm/docs/index.js +1 -0
  85. package/fesm/docs/task-manager-swagger.config.js +33 -0
  86. package/fesm/dtos/index.js +5 -0
  87. package/fesm/dtos/task-board.dto.js +277 -0
  88. package/fesm/dtos/task-comment.dto.js +110 -0
  89. package/fesm/dtos/task-label.dto.js +99 -0
  90. package/fesm/dtos/task-list.dto.js +174 -0
  91. package/fesm/dtos/task.dto.js +337 -0
  92. package/fesm/entities/index.js +46 -0
  93. package/fesm/entities/task-activity.entity.js +88 -0
  94. package/fesm/entities/task-assignee.entity.js +57 -0
  95. package/fesm/entities/task-board-member.entity.js +76 -0
  96. package/fesm/entities/task-board-with-company.entity.js +47 -0
  97. package/fesm/entities/task-board.entity.js +78 -0
  98. package/fesm/entities/task-comment.entity.js +70 -0
  99. package/fesm/entities/task-label.entity.js +62 -0
  100. package/fesm/entities/task-list.entity.js +94 -0
  101. package/fesm/entities/task-task-label.entity.js +57 -0
  102. package/fesm/entities/task.entity.js +133 -0
  103. package/fesm/gateways/index.js +1 -0
  104. package/fesm/gateways/task-board.gateway.js +148 -0
  105. package/fesm/index.js +9 -0
  106. package/fesm/interfaces/index.js +2 -0
  107. package/fesm/interfaces/task-manager-module.interface.js +1 -0
  108. package/fesm/interfaces/task.interface.js +1 -0
  109. package/fesm/modules/index.js +1 -0
  110. package/fesm/modules/task-manager.module.js +121 -0
  111. package/fesm/services/index.js +8 -0
  112. package/fesm/services/task-activity.service.js +66 -0
  113. package/fesm/services/task-board.service.js +225 -0
  114. package/fesm/services/task-comment.service.js +93 -0
  115. package/fesm/services/task-label.service.js +87 -0
  116. package/fesm/services/task-list.service.js +105 -0
  117. package/fesm/services/task-manager-config.service.js +59 -0
  118. package/fesm/services/task-manager-datasource.provider.js +74 -0
  119. package/fesm/services/task.service.js +349 -0
  120. package/gateways/index.d.ts +1 -0
  121. package/gateways/task-board.gateway.d.ts +22 -0
  122. package/index.d.ts +9 -0
  123. package/interfaces/index.d.ts +2 -0
  124. package/interfaces/task-manager-module.interface.d.ts +19 -0
  125. package/interfaces/task.interface.d.ts +52 -0
  126. package/modules/index.d.ts +1 -0
  127. package/modules/task-manager.module.d.ts +8 -0
  128. package/package.json +91 -0
  129. package/services/index.d.ts +8 -0
  130. package/services/task-activity.service.d.ts +8 -0
  131. package/services/task-board.service.d.ts +32 -0
  132. package/services/task-comment.service.d.ts +18 -0
  133. package/services/task-label.service.d.ts +18 -0
  134. package/services/task-list.service.d.ts +19 -0
  135. package/services/task-manager-config.service.d.ts +12 -0
  136. package/services/task-manager-datasource.provider.d.ts +18 -0
  137. package/services/task.service.d.ts +44 -0
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "TaskActivityService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return TaskActivityService;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _entities = require("../entities");
13
+ const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
14
+ function _define_property(obj, key, value) {
15
+ if (key in obj) {
16
+ Object.defineProperty(obj, key, {
17
+ value: value,
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true
21
+ });
22
+ } else {
23
+ obj[key] = value;
24
+ }
25
+ return obj;
26
+ }
27
+ function _ts_decorate(decorators, target, key, desc) {
28
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
+ 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;
31
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
32
+ }
33
+ function _ts_metadata(k, v) {
34
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
35
+ }
36
+ function _ts_param(paramIndex, decorator) {
37
+ return function(target, key) {
38
+ decorator(target, key, paramIndex);
39
+ };
40
+ }
41
+ let TaskActivityService = class TaskActivityService {
42
+ async log(taskId, boardId, userId, action, oldValue, newValue) {
43
+ const repo = await this.ensureRepository();
44
+ const activity = repo.create({
45
+ taskId,
46
+ boardId,
47
+ userId,
48
+ action,
49
+ oldValue,
50
+ newValue
51
+ });
52
+ await repo.save(activity);
53
+ }
54
+ async ensureRepository() {
55
+ if (!this.repository) {
56
+ this.repository = await this.dataSourceProvider.getRepository(_entities.TaskActivity);
57
+ }
58
+ return this.repository;
59
+ }
60
+ constructor(dataSourceProvider){
61
+ _define_property(this, "dataSourceProvider", void 0);
62
+ _define_property(this, "repository", void 0);
63
+ this.dataSourceProvider = dataSourceProvider;
64
+ this.repository = null;
65
+ }
66
+ };
67
+ TaskActivityService = _ts_decorate([
68
+ (0, _common.Injectable)({
69
+ scope: _common.Scope.REQUEST
70
+ }),
71
+ _ts_param(0, (0, _common.Inject)(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider)),
72
+ _ts_metadata("design:type", Function),
73
+ _ts_metadata("design:paramtypes", [
74
+ typeof _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider === "undefined" ? Object : _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider
75
+ ])
76
+ ], TaskActivityService);
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "TaskBoardService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return TaskBoardService;
9
+ }
10
+ });
11
+ const _classes = require("@flusys/nestjs-shared/classes");
12
+ const _modules = require("@flusys/nestjs-shared/modules");
13
+ const _utils = require("@flusys/nestjs-shared/utils");
14
+ const _common = require("@nestjs/common");
15
+ const _typeorm = require("typeorm");
16
+ const _config = require("../config");
17
+ const _entities = require("../entities");
18
+ const _taskmanagerconfigservice = require("./task-manager-config.service");
19
+ const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
20
+ function _define_property(obj, key, value) {
21
+ if (key in obj) {
22
+ Object.defineProperty(obj, key, {
23
+ value: value,
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true
27
+ });
28
+ } else {
29
+ obj[key] = value;
30
+ }
31
+ return obj;
32
+ }
33
+ function _ts_decorate(decorators, target, key, desc) {
34
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
35
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
36
+ 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;
37
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
38
+ }
39
+ function _ts_metadata(k, v) {
40
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
41
+ }
42
+ function _ts_param(paramIndex, decorator) {
43
+ return function(target, key) {
44
+ decorator(target, key, paramIndex);
45
+ };
46
+ }
47
+ let TaskBoardService = class TaskBoardService extends _classes.ApiService {
48
+ resolveEntity() {
49
+ return this.config.isCompanyFeatureEnabled() ? _entities.TaskBoardWithCompany : _entities.TaskBoard;
50
+ }
51
+ async convertSingleDtoToEntity(dto, user) {
52
+ await this.ensureDataSourceRepository();
53
+ let entity = {};
54
+ if ('id' in dto && dto.id) {
55
+ const existing = await this.repository.findOne({
56
+ where: {
57
+ id: dto.id
58
+ }
59
+ });
60
+ if (!existing) throw new _common.NotFoundException({
61
+ message: 'Board not found',
62
+ messageKey: _config.TASK_BOARD_MESSAGES.NOT_FOUND
63
+ });
64
+ entity = existing;
65
+ }
66
+ const merged = {
67
+ ...entity,
68
+ name: dto.name ?? entity.name,
69
+ description: dto.description !== undefined ? dto.description ?? null : entity.description ?? null,
70
+ color: dto.color ?? entity.color ?? '#3B82F6',
71
+ isActive: ('isActive' in dto ? dto.isActive : undefined) ?? entity.isActive ?? true
72
+ };
73
+ if (this.config.isCompanyFeatureEnabled()) {
74
+ merged.companyId = user?.companyId ?? null;
75
+ }
76
+ return merged;
77
+ }
78
+ async getExtraManipulateQuery(query, filterDto, user) {
79
+ await super.getExtraManipulateQuery(query, filterDto, user);
80
+ (0, _utils.applyCompanyFilter)(query, {
81
+ isCompanyFeatureEnabled: this.config.isCompanyFeatureEnabled(),
82
+ entityAlias: 'task_board'
83
+ }, user);
84
+ if (user?.id) {
85
+ query.innerJoin('task_board_member', 'tbm_filter', 'tbm_filter.board_id = task_board.id AND tbm_filter.user_id = :currentUserId AND tbm_filter.deleted_at IS NULL', {
86
+ currentUserId: user.id
87
+ });
88
+ }
89
+ query.addSelect('task_board.createdAt').addSelect('task_board.updatedAt').addSelect(`(SELECT CAST(COUNT(*) AS INTEGER) FROM task_board_member tbm WHERE tbm.board_id = task_board.id AND tbm.deleted_at IS NULL)`, 'total_members').addSelect(`(SELECT CAST(COUNT(*) AS INTEGER) FROM task_list tl WHERE tl.board_id = task_board.id AND tl.is_active = true AND tl.deleted_at IS NULL)`, 'total_lists').addSelect(`(SELECT CAST(COUNT(*) AS INTEGER) FROM task t WHERE t.board_id = task_board.id AND t.deleted_at IS NULL)`, 'total_tasks');
90
+ return {
91
+ query,
92
+ isRaw: true
93
+ };
94
+ }
95
+ convertEntityToResponseDto(entity, isRaw) {
96
+ if (!isRaw) return super.convertEntityToResponseDto(entity, isRaw);
97
+ const prefix = `${this.entityName}_`;
98
+ const mapped = {};
99
+ for (const [key, value] of Object.entries(entity)){
100
+ const rawKey = key.startsWith(prefix) ? key.slice(prefix.length) : key;
101
+ const camelKey = rawKey.replace(/_([a-z])/g, (_, c)=>c.toUpperCase());
102
+ mapped[camelKey] = typeof value === 'string' && value !== '' && !isNaN(Number(value)) ? Number(value) : value;
103
+ }
104
+ return mapped;
105
+ }
106
+ async addMember(dto, user) {
107
+ await this.ensureDataSourceRepository();
108
+ const memberRepo = await this.ensureMemberRepository();
109
+ const board = await this.repository.findOne({
110
+ where: {
111
+ id: dto.boardId
112
+ }
113
+ });
114
+ if (!board) throw new _common.NotFoundException({
115
+ message: 'Board not found',
116
+ messageKey: _config.TASK_BOARD_MESSAGES.NOT_FOUND
117
+ });
118
+ const existing = await memberRepo.findOne({
119
+ where: {
120
+ boardId: dto.boardId,
121
+ userId: dto.userId,
122
+ deletedAt: (0, _typeorm.IsNull)()
123
+ }
124
+ });
125
+ if (existing) throw new _common.BadRequestException({
126
+ message: 'User is already a board member',
127
+ messageKey: _config.TASK_BOARD_MESSAGES.MEMBER_ALREADY_EXISTS
128
+ });
129
+ const softDeleted = await memberRepo.findOne({
130
+ where: {
131
+ boardId: dto.boardId,
132
+ userId: dto.userId
133
+ },
134
+ withDeleted: true
135
+ });
136
+ if (softDeleted) {
137
+ await memberRepo.restore({
138
+ id: softDeleted.id
139
+ });
140
+ await memberRepo.update({
141
+ id: softDeleted.id
142
+ }, {
143
+ role: dto.role ?? _entities.BoardMemberRole.MEMBER
144
+ });
145
+ return memberRepo.findOne({
146
+ where: {
147
+ id: softDeleted.id
148
+ }
149
+ });
150
+ }
151
+ const member = memberRepo.create({
152
+ boardId: dto.boardId,
153
+ userId: dto.userId,
154
+ role: dto.role ?? _entities.BoardMemberRole.MEMBER,
155
+ createdById: user.id
156
+ });
157
+ return memberRepo.save(member);
158
+ }
159
+ async removeMember(dto) {
160
+ const memberRepo = await this.ensureMemberRepository();
161
+ const member = await memberRepo.findOne({
162
+ where: {
163
+ boardId: dto.boardId,
164
+ userId: dto.userId,
165
+ deletedAt: (0, _typeorm.IsNull)()
166
+ }
167
+ });
168
+ if (!member) throw new _common.NotFoundException({
169
+ message: 'Member not found',
170
+ messageKey: _config.TASK_BOARD_MESSAGES.MEMBER_NOT_FOUND
171
+ });
172
+ await memberRepo.update({
173
+ id: member.id
174
+ }, {
175
+ deletedAt: new Date()
176
+ });
177
+ }
178
+ async getMembers(boardId) {
179
+ const memberRepo = await this.ensureMemberRepository();
180
+ const { entities, raw } = await memberRepo.createQueryBuilder('tbm').leftJoin('app_user', 'u', 'u.id = tbm.user_id').addSelect('u.name', 'userName').addSelect('u.email', 'userEmail').where('tbm.board_id = :boardId', {
181
+ boardId
182
+ }).andWhere('tbm.deleted_at IS NULL').orderBy('tbm.created_at', 'ASC').getRawAndEntities();
183
+ return entities.map((entity, i)=>({
184
+ ...entity,
185
+ userName: raw[i]?.userName ?? null,
186
+ userEmail: raw[i]?.userEmail ?? null
187
+ }));
188
+ }
189
+ async isBoardMember(boardId, userId) {
190
+ const memberRepo = await this.ensureMemberRepository();
191
+ const count = await memberRepo.count({
192
+ where: {
193
+ boardId,
194
+ userId,
195
+ deletedAt: (0, _typeorm.IsNull)()
196
+ }
197
+ });
198
+ return count > 0;
199
+ }
200
+ async afterInsertOperation(entities, user, _qr) {
201
+ if (!user?.id) return;
202
+ const memberRepo = await this.ensureMemberRepository();
203
+ await memberRepo.save(entities.map((board)=>memberRepo.create({
204
+ boardId: board.id,
205
+ userId: user.id,
206
+ role: _entities.BoardMemberRole.OWNER,
207
+ createdById: user.id
208
+ })));
209
+ }
210
+ async ensureMemberRepository() {
211
+ if (!this.memberRepository) {
212
+ this.memberRepository = await this.dataSourceProvider.getRepository(_entities.TaskBoardMember);
213
+ }
214
+ return this.memberRepository;
215
+ }
216
+ constructor(cacheManager, utilsService, config, dataSourceProvider){
217
+ super('task_board', cacheManager, utilsService, TaskBoardService.name, true, 'task-manager', undefined, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "config", void 0), _define_property(this, "dataSourceProvider", void 0), _define_property(this, "memberRepository", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.config = config, this.dataSourceProvider = dataSourceProvider, this.memberRepository = null;
218
+ }
219
+ };
220
+ TaskBoardService = _ts_decorate([
221
+ (0, _common.Injectable)({
222
+ scope: _common.Scope.REQUEST
223
+ }),
224
+ _ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
225
+ _ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
226
+ _ts_param(2, (0, _common.Inject)(_taskmanagerconfigservice.TaskManagerConfigService)),
227
+ _ts_param(3, (0, _common.Inject)(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider)),
228
+ _ts_metadata("design:type", Function),
229
+ _ts_metadata("design:paramtypes", [
230
+ typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
231
+ typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
232
+ typeof _taskmanagerconfigservice.TaskManagerConfigService === "undefined" ? Object : _taskmanagerconfigservice.TaskManagerConfigService,
233
+ typeof _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider === "undefined" ? Object : _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider
234
+ ])
235
+ ], TaskBoardService);
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "TaskCommentService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return TaskCommentService;
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 TaskCommentService = class TaskCommentService 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: 'Comment not found',
56
+ messageKey: _config.TASK_COMMENT_MESSAGES.NOT_FOUND
57
+ });
58
+ if (existing.userId !== user?.id) throw new _common.ForbiddenException({
59
+ message: 'Cannot edit another user comment',
60
+ messageKey: _config.TASK_COMMENT_MESSAGES.FORBIDDEN
61
+ });
62
+ entity = existing;
63
+ }
64
+ const taskId = ('taskId' in dto ? dto.taskId : undefined) ?? entity.taskId;
65
+ return {
66
+ ...entity,
67
+ taskId,
68
+ userId: entity.userId !== undefined ? entity.userId : user?.id ?? null,
69
+ content: dto.content,
70
+ parentCommentId: 'parentCommentId' in dto ? dto.parentCommentId ?? null : entity.parentCommentId ?? null
71
+ };
72
+ }
73
+ async getFilterQuery(query, filter, _user) {
74
+ for (const [key, value] of Object.entries(filter)){
75
+ if (key === 'taskId') {
76
+ query.andWhere('task_comment.taskId = :taskId', {
77
+ taskId: value
78
+ });
79
+ }
80
+ }
81
+ return {
82
+ query,
83
+ isRaw: false
84
+ };
85
+ }
86
+ constructor(cacheManager, utilsService, dataSourceProvider){
87
+ super('task_comment', cacheManager, utilsService, TaskCommentService.name, false, 'task-manager', _entities.TaskComment, dataSourceProvider), _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;
88
+ }
89
+ };
90
+ TaskCommentService = _ts_decorate([
91
+ (0, _common.Injectable)({
92
+ scope: _common.Scope.REQUEST
93
+ }),
94
+ _ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
95
+ _ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
96
+ _ts_param(2, (0, _common.Inject)(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider)),
97
+ _ts_metadata("design:type", Function),
98
+ _ts_metadata("design:paramtypes", [
99
+ typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
100
+ typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
101
+ typeof _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider === "undefined" ? Object : _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider
102
+ ])
103
+ ], TaskCommentService);
@@ -0,0 +1,97 @@
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('task_label', cacheManager, utilsService, TaskLabelService.name, true, 'task-manager', _entities.TaskLabel, dataSourceProvider), _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);
@@ -0,0 +1,115 @@
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
+ 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: 'List not found',
56
+ messageKey: _config.TASK_LIST_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 ?? '#6B7280',
65
+ position: dto.position ?? entity.position ?? 0,
66
+ isDoneList: ('isDoneList' in dto ? dto.isDoneList : undefined) ?? entity.isDoneList ?? false,
67
+ isActive: ('isActive' in dto ? dto.isActive : undefined) ?? entity.isActive ?? true
68
+ };
69
+ }
70
+ async getFilterQuery(query, filter, _user) {
71
+ for (const [key, value] of Object.entries(filter)){
72
+ if (key === 'boardId') {
73
+ query.andWhere('task_list.boardId = :boardId', {
74
+ boardId: value
75
+ });
76
+ } else if (key === 'isActive' && typeof value === 'boolean') {
77
+ query.andWhere('task_list.isActive = :isActive', {
78
+ isActive: value
79
+ });
80
+ }
81
+ }
82
+ query.orderBy('task_list.position', 'ASC');
83
+ return {
84
+ query,
85
+ isRaw: false
86
+ };
87
+ }
88
+ async reorderLists(dto) {
89
+ await this.ensureDataSourceRepository();
90
+ await Promise.all(dto.orderedIds.map((id, i)=>this.repository.update({
91
+ id,
92
+ boardId: dto.boardId
93
+ }, {
94
+ position: i * 100
95
+ })));
96
+ await this.clearCacheForAll();
97
+ }
98
+ constructor(cacheManager, utilsService, dataSourceProvider){
99
+ super('task_list', cacheManager, utilsService, TaskListService.name, true, 'task-manager', _entities.TaskList, dataSourceProvider), _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;
100
+ }
101
+ };
102
+ TaskListService = _ts_decorate([
103
+ (0, _common.Injectable)({
104
+ scope: _common.Scope.REQUEST
105
+ }),
106
+ _ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
107
+ _ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
108
+ _ts_param(2, (0, _common.Inject)(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider)),
109
+ _ts_metadata("design:type", Function),
110
+ _ts_metadata("design:paramtypes", [
111
+ typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
112
+ typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
113
+ typeof _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider === "undefined" ? Object : _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider
114
+ ])
115
+ ], TaskListService);