@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.
- package/README.md +245 -0
- package/cjs/config/index.js +19 -0
- package/cjs/config/message-keys.js +92 -0
- package/cjs/config/task-manager.constants.js +11 -0
- package/cjs/controllers/index.js +22 -0
- package/cjs/controllers/task-board.controller.js +219 -0
- package/cjs/controllers/task-comment.controller.js +103 -0
- package/cjs/controllers/task-label.controller.js +112 -0
- package/cjs/controllers/task-list.controller.js +158 -0
- package/cjs/controllers/task.controller.js +199 -0
- package/cjs/docs/index.js +18 -0
- package/cjs/docs/task-manager-swagger.config.js +43 -0
- package/cjs/dtos/index.js +22 -0
- package/cjs/dtos/task-board.dto.js +310 -0
- package/cjs/dtos/task-comment.dto.js +131 -0
- package/cjs/dtos/task-label.dto.js +120 -0
- package/cjs/dtos/task-list.dto.js +198 -0
- package/cjs/dtos/task.dto.js +367 -0
- package/cjs/entities/index.js +72 -0
- package/cjs/entities/task-activity.entity.js +98 -0
- package/cjs/entities/task-assignee.entity.js +67 -0
- package/cjs/entities/task-board-member.entity.js +94 -0
- package/cjs/entities/task-board-with-company.entity.js +57 -0
- package/cjs/entities/task-board.entity.js +88 -0
- package/cjs/entities/task-comment.entity.js +80 -0
- package/cjs/entities/task-label.entity.js +72 -0
- package/cjs/entities/task-list.entity.js +104 -0
- package/cjs/entities/task-task-label.entity.js +67 -0
- package/cjs/entities/task.entity.js +151 -0
- package/cjs/gateways/index.js +18 -0
- package/cjs/gateways/task-board.gateway.js +199 -0
- package/cjs/index.js +26 -0
- package/cjs/interfaces/index.js +19 -0
- package/cjs/interfaces/task-manager-module.interface.js +4 -0
- package/cjs/interfaces/task.interface.js +4 -0
- package/cjs/modules/index.js +18 -0
- package/cjs/modules/task-manager.module.js +131 -0
- package/cjs/services/index.js +25 -0
- package/cjs/services/task-activity.service.js +76 -0
- package/cjs/services/task-board.service.js +235 -0
- package/cjs/services/task-comment.service.js +103 -0
- package/cjs/services/task-label.service.js +97 -0
- package/cjs/services/task-list.service.js +115 -0
- package/cjs/services/task-manager-config.service.js +69 -0
- package/cjs/services/task-manager-datasource.provider.js +84 -0
- package/cjs/services/task.service.js +359 -0
- package/config/index.d.ts +2 -0
- package/config/message-keys.d.ts +65 -0
- package/config/task-manager.constants.d.ts +1 -0
- package/controllers/index.d.ts +5 -0
- package/controllers/task-board.controller.d.ts +27 -0
- package/controllers/task-comment.controller.d.ts +22 -0
- package/controllers/task-label.controller.d.ts +22 -0
- package/controllers/task-list.controller.d.ts +26 -0
- package/controllers/task.controller.d.ts +28 -0
- package/docs/index.d.ts +1 -0
- package/docs/task-manager-swagger.config.d.ts +2 -0
- package/dtos/index.d.ts +5 -0
- package/dtos/task-board.dto.d.ts +44 -0
- package/dtos/task-comment.dto.d.ts +16 -0
- package/dtos/task-label.dto.d.ts +16 -0
- package/dtos/task-list.dto.d.ts +26 -0
- package/dtos/task.dto.d.ts +48 -0
- package/entities/index.d.ts +22 -0
- package/entities/task-activity.entity.d.ts +9 -0
- package/entities/task-assignee.entity.d.ts +5 -0
- package/entities/task-board-member.entity.d.ts +12 -0
- package/entities/task-board-with-company.entity.d.ts +4 -0
- package/entities/task-board.entity.d.ts +8 -0
- package/entities/task-comment.entity.d.ts +7 -0
- package/entities/task-label.entity.d.ts +6 -0
- package/entities/task-list.entity.d.ts +9 -0
- package/entities/task-task-label.entity.d.ts +5 -0
- package/entities/task.entity.d.ts +23 -0
- package/fesm/config/index.js +2 -0
- package/fesm/config/message-keys.js +65 -0
- package/fesm/config/task-manager.constants.js +1 -0
- package/fesm/controllers/index.js +5 -0
- package/fesm/controllers/task-board.controller.js +209 -0
- package/fesm/controllers/task-comment.controller.js +93 -0
- package/fesm/controllers/task-label.controller.js +102 -0
- package/fesm/controllers/task-list.controller.js +148 -0
- package/fesm/controllers/task.controller.js +189 -0
- package/fesm/docs/index.js +1 -0
- package/fesm/docs/task-manager-swagger.config.js +33 -0
- package/fesm/dtos/index.js +5 -0
- package/fesm/dtos/task-board.dto.js +277 -0
- package/fesm/dtos/task-comment.dto.js +110 -0
- package/fesm/dtos/task-label.dto.js +99 -0
- package/fesm/dtos/task-list.dto.js +174 -0
- package/fesm/dtos/task.dto.js +337 -0
- package/fesm/entities/index.js +46 -0
- package/fesm/entities/task-activity.entity.js +88 -0
- package/fesm/entities/task-assignee.entity.js +57 -0
- package/fesm/entities/task-board-member.entity.js +76 -0
- package/fesm/entities/task-board-with-company.entity.js +47 -0
- package/fesm/entities/task-board.entity.js +78 -0
- package/fesm/entities/task-comment.entity.js +70 -0
- package/fesm/entities/task-label.entity.js +62 -0
- package/fesm/entities/task-list.entity.js +94 -0
- package/fesm/entities/task-task-label.entity.js +57 -0
- package/fesm/entities/task.entity.js +133 -0
- package/fesm/gateways/index.js +1 -0
- package/fesm/gateways/task-board.gateway.js +148 -0
- package/fesm/index.js +9 -0
- package/fesm/interfaces/index.js +2 -0
- package/fesm/interfaces/task-manager-module.interface.js +1 -0
- package/fesm/interfaces/task.interface.js +1 -0
- package/fesm/modules/index.js +1 -0
- package/fesm/modules/task-manager.module.js +121 -0
- package/fesm/services/index.js +8 -0
- package/fesm/services/task-activity.service.js +66 -0
- package/fesm/services/task-board.service.js +225 -0
- package/fesm/services/task-comment.service.js +93 -0
- package/fesm/services/task-label.service.js +87 -0
- package/fesm/services/task-list.service.js +105 -0
- package/fesm/services/task-manager-config.service.js +59 -0
- package/fesm/services/task-manager-datasource.provider.js +74 -0
- package/fesm/services/task.service.js +349 -0
- package/gateways/index.d.ts +1 -0
- package/gateways/task-board.gateway.d.ts +22 -0
- package/index.d.ts +9 -0
- package/interfaces/index.d.ts +2 -0
- package/interfaces/task-manager-module.interface.d.ts +19 -0
- package/interfaces/task.interface.d.ts +52 -0
- package/modules/index.d.ts +1 -0
- package/modules/task-manager.module.d.ts +8 -0
- package/package.json +91 -0
- package/services/index.d.ts +8 -0
- package/services/task-activity.service.d.ts +8 -0
- package/services/task-board.service.d.ts +32 -0
- package/services/task-comment.service.d.ts +18 -0
- package/services/task-label.service.d.ts +18 -0
- package/services/task-list.service.d.ts +19 -0
- package/services/task-manager-config.service.d.ts +12 -0
- package/services/task-manager-datasource.provider.d.ts +18 -0
- 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);
|