@comasoft/nestjs 0.0.97 → 0.1.2

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 (211) hide show
  1. package/README.md +31 -0
  2. package/dist/aws/aws-s3.service.d.ts +17 -0
  3. package/dist/aws/aws-s3.service.js +158 -0
  4. package/dist/aws/aws.module.d.ts +2 -0
  5. package/dist/aws/aws.module.js +25 -0
  6. package/dist/aws/aws.service.d.ts +3 -0
  7. package/dist/aws/aws.service.js +21 -0
  8. package/dist/aws/constants/storage.constant.d.ts +4 -0
  9. package/dist/aws/constants/storage.constant.js +25 -0
  10. package/dist/aws/dto/create-s3-presigned.dto.d.ts +12 -0
  11. package/dist/aws/dto/create-s3-presigned.dto.js +78 -0
  12. package/dist/aws/dto/index.d.ts +2 -0
  13. package/dist/aws/dto/index.js +18 -0
  14. package/dist/aws/dto/response-s3-presigned.dto.d.ts +30 -0
  15. package/dist/aws/dto/response-s3-presigned.dto.js +110 -0
  16. package/dist/aws/index.d.ts +4 -0
  17. package/dist/aws/index.js +20 -0
  18. package/dist/aws/types/s3.interface.d.ts +14 -0
  19. package/dist/aws/types/s3.interface.js +2 -0
  20. package/dist/aws/types/storage.interface.d.ts +19 -0
  21. package/dist/aws/types/storage.interface.js +2 -0
  22. package/dist/category/category.module.d.ts +2 -0
  23. package/dist/category/category.module.js +23 -0
  24. package/dist/category/category.service.d.ts +13 -0
  25. package/dist/category/category.service.js +124 -0
  26. package/dist/category/dto/create-category.dto.d.ts +7 -0
  27. package/dist/category/dto/create-category.dto.js +34 -0
  28. package/dist/category/dto/delete-category.dto.d.ts +3 -0
  29. package/dist/category/dto/delete-category.dto.js +6 -0
  30. package/dist/category/dto/index.d.ts +5 -0
  31. package/dist/category/dto/index.js +21 -0
  32. package/dist/category/dto/response-categories.dto.d.ts +12 -0
  33. package/dist/category/dto/response-categories.dto.js +52 -0
  34. package/dist/category/dto/update-category-sort.dto.d.ts +9 -0
  35. package/dist/category/dto/update-category-sort.dto.js +33 -0
  36. package/dist/category/dto/update-category.dto.d.ts +6 -0
  37. package/dist/category/dto/update-category.dto.js +9 -0
  38. package/dist/category/index.d.ts +3 -0
  39. package/dist/category/index.js +19 -0
  40. package/dist/comment/comment.module.d.ts +2 -0
  41. package/dist/comment/comment.module.js +23 -0
  42. package/dist/comment/comment.service.d.ts +33 -0
  43. package/dist/comment/comment.service.js +240 -0
  44. package/dist/comment/dto/create-comment.dto.d.ts +7 -0
  45. package/dist/comment/dto/create-comment.dto.js +41 -0
  46. package/dist/comment/dto/index.d.ts +3 -0
  47. package/dist/comment/dto/index.js +19 -0
  48. package/dist/comment/dto/response-comment.dto.d.ts +26 -0
  49. package/dist/comment/dto/response-comment.dto.js +97 -0
  50. package/dist/comment/dto/update-comment.dto.d.ts +4 -0
  51. package/dist/comment/dto/update-comment.dto.js +22 -0
  52. package/dist/comment/index.d.ts +3 -0
  53. package/dist/comment/index.js +19 -0
  54. package/dist/database/entities/category.entity.d.ts +14 -0
  55. package/dist/database/entities/category.entity.js +70 -0
  56. package/dist/database/entities/comment.entity.d.ts +16 -0
  57. package/dist/database/entities/comment.entity.js +77 -0
  58. package/dist/database/entities/config.entity.d.ts +8 -0
  59. package/dist/database/entities/config.entity.js +44 -0
  60. package/dist/database/entities/file.entity.d.ts +20 -0
  61. package/dist/database/entities/file.entity.js +91 -0
  62. package/dist/database/entities/index.d.ts +10 -0
  63. package/dist/database/entities/index.js +26 -0
  64. package/dist/database/entities/like.entity.d.ts +10 -0
  65. package/dist/database/entities/like.entity.js +49 -0
  66. package/dist/database/entities/logs-audit.entity.d.ts +16 -0
  67. package/dist/database/entities/logs-audit.entity.js +72 -0
  68. package/dist/database/entities/logs-event.entity.d.ts +16 -0
  69. package/dist/database/entities/logs-event.entity.js +72 -0
  70. package/dist/database/entities/notification-recipient.entity.d.ts +19 -0
  71. package/dist/database/entities/notification-recipient.entity.js +74 -0
  72. package/dist/database/entities/notification.entity.d.ts +18 -0
  73. package/dist/database/entities/notification.entity.js +69 -0
  74. package/dist/database/entities/role.entity.d.ts +13 -0
  75. package/dist/database/entities/role.entity.js +54 -0
  76. package/dist/database/entities/roles.entity.d.ts +12 -0
  77. package/dist/database/entities/roles.entity.js +1 -0
  78. package/dist/decorators/auth.decorator.factory.d.ts +1 -1
  79. package/dist/decorators/auth.decorator.factory.js +23 -2
  80. package/dist/decorators/delete-columns.decorator.js +1 -33
  81. package/dist/decorators/patch-body.decorator.js +20 -12
  82. package/dist/decorators/soft-delete.decorator.js +1 -15
  83. package/dist/decorators/timestamps.decorator.js +5 -13
  84. package/dist/dto/file.dto.d.ts +18 -0
  85. package/dist/dto/file.dto.js +70 -0
  86. package/dist/dto/index.d.ts +2 -0
  87. package/dist/dto/index.js +2 -0
  88. package/dist/dto/response-uid.dto.d.ts +2 -0
  89. package/dist/dto/response-uid.dto.js +8 -0
  90. package/dist/dto/update-ids.dto.d.ts +6 -1
  91. package/dist/dto/update-ids.dto.js +24 -10
  92. package/dist/dto/update-sort.dto.d.ts +9 -0
  93. package/dist/dto/update-sort.dto.js +50 -0
  94. package/dist/enums.common.d.ts +23 -0
  95. package/dist/enums.common.js +28 -1
  96. package/dist/events/event-bus.module.d.ts +2 -0
  97. package/dist/events/event-bus.module.js +44 -0
  98. package/dist/events/index.d.ts +4 -0
  99. package/dist/events/index.js +20 -0
  100. package/dist/events/listeners/audit-event.listener.d.ts +9 -0
  101. package/dist/events/listeners/audit-event.listener.js +58 -0
  102. package/dist/events/listeners/index.d.ts +1 -0
  103. package/dist/events/listeners/index.js +17 -0
  104. package/dist/events/listeners/system-event.listener.d.ts +9 -0
  105. package/dist/events/listeners/system-event.listener.js +58 -0
  106. package/dist/events/services/event-logger.service.d.ts +5 -0
  107. package/dist/events/services/event-logger.service.js +34 -0
  108. package/dist/events/services/event-notification.service.d.ts +7 -0
  109. package/dist/events/services/event-notification.service.js +104 -0
  110. package/dist/events/services/event-storage.service.d.ts +11 -0
  111. package/dist/events/services/event-storage.service.js +79 -0
  112. package/dist/events/services/index.d.ts +4 -0
  113. package/dist/events/services/index.js +20 -0
  114. package/dist/events/services/token.service.d.ts +23 -0
  115. package/dist/events/services/token.service.js +88 -0
  116. package/dist/events/types/audit-events.type.d.ts +12 -0
  117. package/dist/events/types/audit-events.type.js +2 -0
  118. package/dist/events/types/index.d.ts +18 -0
  119. package/dist/events/types/index.js +17 -0
  120. package/dist/filters/http-exception.filter.d.ts +4 -0
  121. package/dist/filters/http-exception.filter.js +26 -4
  122. package/dist/guards/auth.guard.d.ts +3 -1
  123. package/dist/guards/auth.guard.js +33 -11
  124. package/dist/index.d.ts +20 -8
  125. package/dist/index.js +12 -0
  126. package/dist/library.module.d.ts +2 -0
  127. package/dist/library.module.js +20 -0
  128. package/dist/like/dto/create-like.dto.d.ts +7 -0
  129. package/dist/like/dto/create-like.dto.js +47 -0
  130. package/dist/like/dto/index.d.ts +2 -0
  131. package/dist/like/dto/index.js +18 -0
  132. package/dist/like/dto/response-like.dto.d.ts +19 -0
  133. package/dist/like/dto/response-like.dto.js +79 -0
  134. package/dist/like/index.d.ts +3 -0
  135. package/dist/like/index.js +19 -0
  136. package/dist/like/like.module.d.ts +2 -0
  137. package/dist/like/like.module.js +23 -0
  138. package/dist/like/like.service.d.ts +13 -0
  139. package/dist/like/like.service.js +155 -0
  140. package/dist/logger/index.d.ts +2 -0
  141. package/dist/logger/index.js +18 -0
  142. package/dist/logger/pino-options.d.ts +31 -0
  143. package/dist/logger/pino-options.js +77 -0
  144. package/dist/logger/pino-pretty-transport.d.ts +1 -0
  145. package/dist/logger/pino-pretty-transport.js +164 -0
  146. package/dist/modules/index.d.ts +1 -0
  147. package/dist/modules/index.js +1 -0
  148. package/dist/modules/redis.module.d.ts +9 -0
  149. package/dist/modules/redis.module.js +1 -0
  150. package/dist/notifications/index.d.ts +70 -0
  151. package/dist/notifications/index.js +18 -0
  152. package/dist/notifications/notification.module.d.ts +2 -0
  153. package/dist/notifications/notification.module.js +32 -0
  154. package/dist/notifications/services/email.service.d.ts +31 -0
  155. package/dist/notifications/services/email.service.js +69 -0
  156. package/dist/notifications/services/index.d.ts +7 -0
  157. package/dist/notifications/services/index.js +23 -0
  158. package/dist/notifications/services/kakao.service.d.ts +41 -0
  159. package/dist/notifications/services/kakao.service.js +94 -0
  160. package/dist/notifications/services/message-template.service.d.ts +15 -0
  161. package/dist/notifications/services/message-template.service.js +74 -0
  162. package/dist/notifications/services/notification-send.service.d.ts +30 -0
  163. package/dist/notifications/services/notification-send.service.js +146 -0
  164. package/dist/notifications/services/notification.service.d.ts +37 -0
  165. package/dist/notifications/services/notification.service.js +125 -0
  166. package/dist/notifications/services/slack.service.d.ts +11 -0
  167. package/dist/notifications/services/slack.service.js +53 -0
  168. package/dist/notifications/services/sms.service.d.ts +19 -0
  169. package/dist/notifications/services/sms.service.js +62 -0
  170. package/dist/redis/index.d.ts +2 -0
  171. package/dist/redis/index.js +18 -0
  172. package/dist/redis/redis-constraint.d.ts +1 -0
  173. package/dist/redis/redis-constraint.js +4 -0
  174. package/dist/redis/redis.module.d.ts +8 -0
  175. package/dist/redis/redis.module.js +62 -0
  176. package/dist/redis/redis.service.d.ts +12 -0
  177. package/dist/redis/redis.service.js +76 -0
  178. package/dist/role/dto/create-role.dto.d.ts +5 -0
  179. package/dist/role/dto/create-role.dto.js +41 -0
  180. package/dist/role/dto/index.d.ts +3 -0
  181. package/dist/role/dto/index.js +19 -0
  182. package/dist/role/dto/response-roles.dto.d.ts +15 -0
  183. package/dist/role/dto/response-roles.dto.js +62 -0
  184. package/dist/role/dto/update-role.dto.d.ts +6 -0
  185. package/dist/role/dto/update-role.dto.js +9 -0
  186. package/dist/role/index.d.ts +3 -0
  187. package/dist/role/index.js +19 -0
  188. package/dist/role/role.module.d.ts +2 -0
  189. package/dist/role/role.module.js +23 -0
  190. package/dist/role/role.service.d.ts +17 -0
  191. package/dist/role/role.service.js +144 -0
  192. package/dist/services/file.service.d.ts +55 -0
  193. package/dist/services/file.service.js +82 -0
  194. package/dist/services/index.d.ts +2 -0
  195. package/dist/services/index.js +18 -0
  196. package/dist/services/message-template.service.d.ts +15 -0
  197. package/dist/services/message-template.service.js +1 -0
  198. package/dist/services/permission-checker.service.d.ts +38 -0
  199. package/dist/services/permission-checker.service.js +65 -0
  200. package/dist/shared/error-codes.d.ts +5 -0
  201. package/dist/shared/error-codes.js +9 -0
  202. package/dist/utils/common.utils.d.ts +2 -0
  203. package/dist/utils/common.utils.js +11 -1
  204. package/dist/utils/index.d.ts +1 -0
  205. package/dist/utils/index.js +1 -0
  206. package/dist/utils/object-diff.d.ts +1 -0
  207. package/dist/utils/object-diff.js +33 -0
  208. package/package.json +61 -16
  209. package/eslint.config.js +0 -31
  210. package/tsconfig.build.json +0 -19
  211. package/tsconfig.json +0 -18
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.RoleService = void 0;
25
+ const common_1 = require("@nestjs/common");
26
+ const typeorm_1 = require("@nestjs/typeorm");
27
+ const class_transformer_1 = require("class-transformer");
28
+ const typeorm_2 = require("typeorm");
29
+ const entities_1 = require("../database/entities");
30
+ const utils_1 = require("../utils");
31
+ const dto_1 = require("./dto");
32
+ let RoleService = class RoleService {
33
+ constructor(repository, dataSource) {
34
+ this.repository = repository;
35
+ this.dataSource = dataSource;
36
+ }
37
+ validatePermissions(permissions) {
38
+ throw new common_1.BadRequestException('validatePermissions must be implemented in app service');
39
+ }
40
+ validateRoleLimit() {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ throw new common_1.BadRequestException('validateRoleLimit must be implemented in app service');
43
+ });
44
+ }
45
+ checkRoleUsage(id) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ throw new common_1.BadRequestException('checkRoleUsage must be implemented in app service');
48
+ });
49
+ }
50
+ create(body) {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ if (!body.permissions || body.permissions.length === 0) {
53
+ throw new common_1.BadRequestException('Permissions are required');
54
+ }
55
+ yield this.validateRoleLimit();
56
+ const existRole = yield this.repository.findOne({
57
+ where: { name: body.name },
58
+ });
59
+ if (existRole)
60
+ throw new common_1.ConflictException('Role name already exists');
61
+ this.validatePermissions(body.permissions);
62
+ const next_sort = (yield this.repository.count()) + 1;
63
+ const role = yield this.repository.save({
64
+ name: body.name,
65
+ description: body.description,
66
+ permissions: body.permissions,
67
+ sort: next_sort,
68
+ });
69
+ return (0, class_transformer_1.plainToClass)(dto_1.ResponseRoleBaseDto, role);
70
+ });
71
+ }
72
+ findAll(c_params) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ const { _page, _limit, _keyword, _group, _sort } = c_params;
75
+ let queryBuilder = this.repository
76
+ .createQueryBuilder('roles')
77
+ .select(['roles'])
78
+ .orderBy('roles.sort', 'ASC');
79
+ queryBuilder = (0, utils_1.applyFiltersAndSorting)(queryBuilder, {
80
+ _keyword,
81
+ _group,
82
+ _sort,
83
+ keywordFields: ['name'],
84
+ aliasName: 'roles',
85
+ });
86
+ const res = yield (0, utils_1.paginate)(queryBuilder, {
87
+ page: _page,
88
+ limit: _limit,
89
+ });
90
+ return (0, class_transformer_1.plainToClass)(dto_1.ResponseRolesBaseDto, res);
91
+ });
92
+ }
93
+ findOne(id) {
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ const role = yield this.repository.findOne({
96
+ where: { id },
97
+ });
98
+ if (!role) {
99
+ throw new common_1.NotFoundException(`Role with ID ${id} not found`);
100
+ }
101
+ return (0, class_transformer_1.plainToClass)(dto_1.ResponseRoleBaseDto, role);
102
+ });
103
+ }
104
+ update(id, body) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ const role = yield this.repository.findOne({ where: { id } });
107
+ if (!role)
108
+ throw new common_1.NotFoundException(`Role with ID ${id} not found`);
109
+ if (role.is_system) {
110
+ throw new common_1.BadRequestException('Cannot update system role');
111
+ }
112
+ if (body.permissions) {
113
+ this.validatePermissions(body.permissions);
114
+ }
115
+ yield this.repository.update(id, {
116
+ name: body.name,
117
+ description: body.description,
118
+ permissions: body.permissions || undefined,
119
+ });
120
+ const res = yield this.repository.findOne({ where: { id } });
121
+ return (0, class_transformer_1.plainToClass)(dto_1.ResponseRoleBaseDto, res);
122
+ });
123
+ }
124
+ remove(id) {
125
+ return __awaiter(this, void 0, void 0, function* () {
126
+ const role = yield this.repository.findOne({ where: { id } });
127
+ if (!role)
128
+ throw new common_1.NotFoundException(`Role with ID ${id} not found`);
129
+ if (role.is_system || role.is_default) {
130
+ throw new common_1.BadRequestException('Cannot delete system or default role');
131
+ }
132
+ yield this.checkRoleUsage(id);
133
+ yield this.repository.delete(id);
134
+ return;
135
+ });
136
+ }
137
+ };
138
+ exports.RoleService = RoleService;
139
+ exports.RoleService = RoleService = __decorate([
140
+ (0, common_1.Injectable)(),
141
+ __param(0, (0, typeorm_1.InjectRepository)(entities_1.Role)),
142
+ __metadata("design:paramtypes", [typeorm_2.Repository,
143
+ typeorm_2.DataSource])
144
+ ], RoleService);
@@ -0,0 +1,55 @@
1
+ import { DataSource, EntityManager } from 'typeorm';
2
+ import { S3Service } from '../aws/aws-s3.service';
3
+ import { FILE_STATUS } from '../enums.common';
4
+ import { File } from '../database/entities';
5
+ interface FileInput {
6
+ original_name: string;
7
+ file_name: string;
8
+ path: string;
9
+ mime_type: string;
10
+ size: number;
11
+ meta?: Record<string, any>;
12
+ sort?: number;
13
+ }
14
+ export interface CreateFileInput {
15
+ target: string;
16
+ group_number?: number;
17
+ user_id: number;
18
+ files: FileInput[];
19
+ manager?: EntityManager;
20
+ }
21
+ export type StatusCompletedInput = Omit<CreateFileInput, 'files'> & {
22
+ target_id: number;
23
+ file_ids?: number[];
24
+ };
25
+ export type SoftDeleteInput = Omit<CreateFileInput, 'files'> & {
26
+ target_id: number;
27
+ delete_file_ids: number[];
28
+ };
29
+ export declare class FileService {
30
+ private readonly dataSource;
31
+ private readonly s3Service;
32
+ constructor(dataSource: DataSource, s3Service: S3Service);
33
+ findAll({ target, target_id, group_number, }: {
34
+ target: string;
35
+ target_id: number;
36
+ group_number?: number;
37
+ }): Promise<File[]>;
38
+ createPending({ target, user_id, files, manager, group_number, }: CreateFileInput): Promise<({
39
+ sort: number;
40
+ group_number: number;
41
+ original_name: string;
42
+ file_name: string;
43
+ path: string;
44
+ mime_type: string;
45
+ size: number;
46
+ meta?: Record<string, any>;
47
+ status: FILE_STATUS.PENDING;
48
+ target: string;
49
+ target_id: number;
50
+ user_id: number;
51
+ } & File)[]>;
52
+ statusCompleted({ target, target_id, user_id, file_ids, manager, }: StatusCompletedInput): Promise<void>;
53
+ softDelete({ target, target_id, user_id, delete_file_ids, manager, }: SoftDeleteInput): Promise<void>;
54
+ }
55
+ export {};
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.FileService = void 0;
25
+ const common_1 = require("@nestjs/common");
26
+ const typeorm_1 = require("typeorm");
27
+ const aws_s3_service_1 = require("../aws/aws-s3.service");
28
+ const enums_common_1 = require("../enums.common");
29
+ const entities_1 = require("../database/entities");
30
+ let FileService = class FileService {
31
+ constructor(dataSource, s3Service) {
32
+ this.dataSource = dataSource;
33
+ this.s3Service = s3Service;
34
+ }
35
+ findAll(_a) {
36
+ return __awaiter(this, arguments, void 0, function* ({ target, target_id, group_number, }) {
37
+ const repo = this.dataSource.getRepository(entities_1.File);
38
+ return repo.find({ where: { target, target_id, group_number } });
39
+ });
40
+ }
41
+ createPending(_a) {
42
+ return __awaiter(this, arguments, void 0, function* ({ target, user_id, files, manager, group_number, }) {
43
+ const repo = manager
44
+ ? manager.getRepository(entities_1.File)
45
+ : this.dataSource.getRepository(entities_1.File);
46
+ const createdFiles = yield repo.save(files.map((file, index) => {
47
+ var _a;
48
+ return (Object.assign(Object.assign({ status: enums_common_1.FILE_STATUS.PENDING, target, target_id: 0, user_id }, file), { sort: (_a = file.sort) !== null && _a !== void 0 ? _a : index + 1, group_number }));
49
+ }));
50
+ return createdFiles;
51
+ });
52
+ }
53
+ statusCompleted(_a) {
54
+ return __awaiter(this, arguments, void 0, function* ({ target, target_id, user_id, file_ids, manager, }) {
55
+ const repo = manager
56
+ ? manager.getRepository(entities_1.File)
57
+ : this.dataSource.getRepository(entities_1.File);
58
+ yield repo.update({ target, user_id, id: (0, typeorm_1.In)(file_ids) }, { status: enums_common_1.FILE_STATUS.COMPLETED, target_id });
59
+ return;
60
+ });
61
+ }
62
+ softDelete(_a) {
63
+ return __awaiter(this, arguments, void 0, function* ({ target, target_id, user_id, delete_file_ids, manager, }) {
64
+ const repo = manager
65
+ ? manager.getRepository(entities_1.File)
66
+ : this.dataSource.getRepository(entities_1.File);
67
+ const files = yield repo.find({
68
+ where: { target, user_id, target_id, id: (0, typeorm_1.In)(delete_file_ids) },
69
+ });
70
+ yield this.s3Service.deleteObjectsByKeys(files.map((file) => this.s3Service.getFileKey(file)));
71
+ yield repo.update({ id: (0, typeorm_1.In)(files.map((file) => file.id)) }, { status: enums_common_1.FILE_STATUS.DELETED, deleted_at: new Date(), is_active: false });
72
+ return;
73
+ });
74
+ }
75
+ };
76
+ exports.FileService = FileService;
77
+ exports.FileService = FileService = __decorate([
78
+ (0, common_1.Injectable)(),
79
+ __param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => aws_s3_service_1.S3Service))),
80
+ __metadata("design:paramtypes", [typeorm_1.DataSource,
81
+ aws_s3_service_1.S3Service])
82
+ ], FileService);
@@ -0,0 +1,2 @@
1
+ export * from './permission-checker.service';
2
+ export * from './file.service';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./permission-checker.service"), exports);
18
+ __exportStar(require("./file.service"), exports);
@@ -0,0 +1,15 @@
1
+ import { Repository } from 'typeorm';
2
+ import { Config } from '../database/entities';
3
+ export declare class MessageTemplateService {
4
+ private configRepository;
5
+ constructor(configRepository: Repository<Config>);
6
+ getTemplate(type: 'email' | 'sms' | 'slack' | 'kakao', templateKey: string): Promise<any>;
7
+ getTemplates(): Promise<Record<string, any>>;
8
+ updateTemplates(templates: any): Promise<void>;
9
+ renderTemplate(template: {
10
+ content: string;
11
+ variables: string[];
12
+ required_vars: string[];
13
+ default_vars: Record<string, any>;
14
+ }, variables: Record<string, any>): string;
15
+ }
@@ -0,0 +1 @@
1
+ var e=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,i);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(a=(o<3?n(a):o>3?n(t,r,a):n(t,r))||a);return o>3&&a&&Object.defineProperty(t,r,a),a},t=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},r=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}},i=this&&this.__awaiter||function(e,t,r,i){return new(r||(r=Promise))(function(n,o){function fulfilled(e){try{step(i.next(e))}catch(e){o(e)}}function rejected(e){try{step(i.throw(e))}catch(e){o(e)}}function step(e){e.done?n(e.value):function adopt(e){return e instanceof r?e:new r(function(t){t(e)})}(e.value).then(fulfilled,rejected)}step((i=i.apply(e,t||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.MessageTemplateService=void 0;const n=require("@nestjs/common"),o=require("@nestjs/typeorm"),a=require("typeorm"),s=require("../database/entities");let c=class MessageTemplateService{constructor(e){this.configRepository=e}getTemplate(e,t){return i(this,void 0,void 0,function*(){var r;return null===(r=(yield this.getTemplates())[e])||void 0===r?void 0:r[t]})}getTemplates(){return i(this,void 0,void 0,function*(){const e=yield this.configRepository.findOne({where:{key:"message_templates",is_active:!0}});return(null==e?void 0:e.value)||{}})}updateTemplates(e){return i(this,void 0,void 0,function*(){yield this.configRepository.update({key:"message_templates"},{value:e,updated_at:new Date})})}renderTemplate(e,t){const r=e.required_vars.filter(r=>{var i;return void 0===t[r]&&void 0===(null===(i=e.default_vars)||void 0===i?void 0:i[r])});if(r.length>0)throw new Error(`Missing required variables: ${r.join(", ")}`);return e.content.replace(/\{\{(\w+)\}\}/g,(r,i)=>{var n;return void 0!==t[i]?t[i]:void 0!==(null===(n=e.default_vars)||void 0===n?void 0:n[i])?e.default_vars[i]:""})}};exports.MessageTemplateService=c,exports.MessageTemplateService=c=e([(0,n.Injectable)(),r(0,(0,o.InjectRepository)(s.Config)),t("design:paramtypes",[a.Repository])],c);
@@ -0,0 +1,38 @@
1
+ export declare const PERMISSIONS: {
2
+ readonly USER_LIST: "user:list";
3
+ readonly USER_READ: "user:read";
4
+ readonly USER_EDIT: "user:edit";
5
+ readonly USER_DELETE: "user:delete";
6
+ readonly USER_CREATE: "user:create";
7
+ readonly USER_LIST_DOWNLOAD: "user:list:download";
8
+ readonly USER_ROLE_ASSIGN: "user:role:assign";
9
+ readonly ADMIN: "admin:manage";
10
+ readonly PROGRAM: "program:manage";
11
+ readonly PROGRAM_COURSE: "program:course";
12
+ readonly PROGRAM_REQUEST_DOWNLOAD: "program:request:download";
13
+ readonly TEAM: "team:manage";
14
+ readonly TEAM_SUBMISSION: "team:submission";
15
+ readonly TEAM_USER_DOWNLOAD: "team:user:list:download";
16
+ readonly BLOG: "blog";
17
+ };
18
+ export declare const WILDCARD_PERMISSIONS: {
19
+ readonly ALL: "*";
20
+ readonly USER_ALL: "user:*";
21
+ readonly ADMIN_ALL: "admin:*";
22
+ readonly PROGRAM_ALL: "program:*";
23
+ readonly TEAM_ALL: "team:*";
24
+ readonly BLOG_ALL: "blog:*";
25
+ };
26
+ export interface UserMock {
27
+ id: number;
28
+ role: string;
29
+ permissions?: string[];
30
+ }
31
+ export declare abstract class PermissionCheckerService {
32
+ protected abstract getUserPermissions(user: UserMock): string[];
33
+ hasPermission(user: UserMock, requiredPermission: string): boolean;
34
+ hasAnyPermission(user: UserMock, requiredPermissions: string[]): boolean;
35
+ hasAllPermissions(user: UserMock, requiredPermissions: string[]): boolean;
36
+ private checkPermissionMatch;
37
+ protected matchesWildcard(wildcardPermission: string, requiredPermission: string): boolean;
38
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PermissionCheckerService = exports.WILDCARD_PERMISSIONS = exports.PERMISSIONS = void 0;
4
+ exports.PERMISSIONS = {
5
+ USER_LIST: 'user:list',
6
+ USER_READ: 'user:read',
7
+ USER_EDIT: 'user:edit',
8
+ USER_DELETE: 'user:delete',
9
+ USER_CREATE: 'user:create',
10
+ USER_LIST_DOWNLOAD: 'user:list:download',
11
+ USER_ROLE_ASSIGN: 'user:role:assign',
12
+ ADMIN: 'admin:manage',
13
+ PROGRAM: 'program:manage',
14
+ PROGRAM_COURSE: 'program:course',
15
+ PROGRAM_REQUEST_DOWNLOAD: 'program:request:download',
16
+ TEAM: 'team:manage',
17
+ TEAM_SUBMISSION: 'team:submission',
18
+ TEAM_USER_DOWNLOAD: 'team:user:list:download',
19
+ BLOG: 'blog',
20
+ };
21
+ exports.WILDCARD_PERMISSIONS = {
22
+ ALL: '*',
23
+ USER_ALL: 'user:*',
24
+ ADMIN_ALL: 'admin:*',
25
+ PROGRAM_ALL: 'program:*',
26
+ TEAM_ALL: 'team:*',
27
+ BLOG_ALL: 'blog:*',
28
+ };
29
+ class PermissionCheckerService {
30
+ hasPermission(user, requiredPermission) {
31
+ const userPermissions = this.getUserPermissions(user);
32
+ return this.checkPermissionMatch(userPermissions, requiredPermission);
33
+ }
34
+ hasAnyPermission(user, requiredPermissions) {
35
+ const userPermissions = this.getUserPermissions(user);
36
+ return requiredPermissions.some((permission) => this.checkPermissionMatch(userPermissions, permission));
37
+ }
38
+ hasAllPermissions(user, requiredPermissions) {
39
+ const userPermissions = this.getUserPermissions(user);
40
+ return requiredPermissions.every((permission) => this.checkPermissionMatch(userPermissions, permission));
41
+ }
42
+ checkPermissionMatch(userPermissions, requiredPermission) {
43
+ if (userPermissions.includes(requiredPermission)) {
44
+ return true;
45
+ }
46
+ for (const userPermission of userPermissions) {
47
+ if (this.matchesWildcard(userPermission, requiredPermission)) {
48
+ return true;
49
+ }
50
+ }
51
+ return false;
52
+ }
53
+ matchesWildcard(wildcardPermission, requiredPermission) {
54
+ if (wildcardPermission === '*') {
55
+ return true;
56
+ }
57
+ if (wildcardPermission.endsWith(':*')) {
58
+ const wildcardPrefix = wildcardPermission.slice(0, -2);
59
+ return (requiredPermission === wildcardPrefix ||
60
+ requiredPermission.startsWith(wildcardPrefix + ':'));
61
+ }
62
+ return false;
63
+ }
64
+ }
65
+ exports.PermissionCheckerService = PermissionCheckerService;
@@ -0,0 +1,5 @@
1
+ export declare enum ErrorCode {
2
+ ROLE_HAS_ASSIGNED_USERS = "ROLE_HAS_ASSIGNED_USERS",
3
+ ROLE_COUNT_LIMIT = "ROLE_COUNT_LIMIT",
4
+ CATEGORY_NAME_ALREADY_EXISTS = "CATEGORY_NAME_ALREADY_EXISTS"
5
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorCode = void 0;
4
+ var ErrorCode;
5
+ (function (ErrorCode) {
6
+ ErrorCode["ROLE_HAS_ASSIGNED_USERS"] = "ROLE_HAS_ASSIGNED_USERS";
7
+ ErrorCode["ROLE_COUNT_LIMIT"] = "ROLE_COUNT_LIMIT";
8
+ ErrorCode["CATEGORY_NAME_ALREADY_EXISTS"] = "CATEGORY_NAME_ALREADY_EXISTS";
9
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
@@ -1,3 +1,5 @@
1
1
  export declare const generateOrderId: () => string;
2
2
  export declare const convertExpirationToSeconds: (expiration: string) => number;
3
+ export declare function isSameArray(a: number[], b: number[]): boolean;
3
4
  export declare const _randomRange: (min: number, max: number) => number;
5
+ export declare const _sleep: (time: number) => Promise<unknown>;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports._randomRange = exports.convertExpirationToSeconds = exports.generateOrderId = void 0;
3
+ exports._sleep = exports._randomRange = exports.convertExpirationToSeconds = exports.generateOrderId = void 0;
4
+ exports.isSameArray = isSameArray;
4
5
  const date_fns_1 = require("date-fns");
5
6
  const generateOrderId = () => {
6
7
  const date_part = (0, date_fns_1.format)(new Date(), 'yyMMdd');
@@ -26,7 +27,16 @@ const convertExpirationToSeconds = (expiration) => {
26
27
  }
27
28
  };
28
29
  exports.convertExpirationToSeconds = convertExpirationToSeconds;
30
+ function isSameArray(a, b) {
31
+ if (a.length !== b.length)
32
+ return false;
33
+ const aSorted = [...a].sort();
34
+ const bSorted = [...b].sort();
35
+ return aSorted.every((val, idx) => val === bSorted[idx]);
36
+ }
29
37
  const _randomRange = (min, max) => {
30
38
  return Math.floor(min + Math.random() * (max - min + 1));
31
39
  };
32
40
  exports._randomRange = _randomRange;
41
+ const _sleep = (time) => new Promise((res) => setTimeout(res, time));
42
+ exports._sleep = _sleep;
@@ -1,4 +1,5 @@
1
1
  export * from './common.utils';
2
+ export * from './object-diff';
2
3
  export * from './enum.utils';
3
4
  export * from './pagination.utils';
4
5
  export * from './pagination-qb.utils';
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./common.utils"), exports);
18
+ __exportStar(require("./object-diff"), exports);
18
19
  __exportStar(require("./enum.utils"), exports);
19
20
  __exportStar(require("./pagination.utils"), exports);
20
21
  __exportStar(require("./pagination-qb.utils"), exports);
@@ -0,0 +1 @@
1
+ export declare function getObjectDiff(before: any, after: any, sensitiveFields?: string[]): Record<string, any>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getObjectDiff = getObjectDiff;
4
+ function getObjectDiff(before, after, sensitiveFields = []) {
5
+ const diff = {};
6
+ const keys = new Set([
7
+ ...Object.keys(before || {}),
8
+ ...Object.keys(after || {}),
9
+ ]);
10
+ keys.forEach((key) => {
11
+ if (sensitiveFields.includes(key))
12
+ return;
13
+ const beforeVal = before === null || before === void 0 ? void 0 : before[key];
14
+ const afterVal = after === null || after === void 0 ? void 0 : after[key];
15
+ if ((beforeVal === undefined || beforeVal === null) &&
16
+ (afterVal === undefined || afterVal === null)) {
17
+ return;
18
+ }
19
+ if (typeof beforeVal === 'object' &&
20
+ beforeVal !== null &&
21
+ typeof afterVal === 'object' &&
22
+ afterVal !== null) {
23
+ const nestedDiff = getObjectDiff(beforeVal, afterVal, sensitiveFields);
24
+ if (Object.keys(nestedDiff).length > 0) {
25
+ diff[key] = nestedDiff;
26
+ }
27
+ }
28
+ else if (beforeVal !== afterVal) {
29
+ diff[key] = { before: beforeVal, after: afterVal };
30
+ }
31
+ });
32
+ return diff;
33
+ }
package/package.json CHANGED
@@ -1,10 +1,28 @@
1
1
  {
2
2
  "name": "@comasoft/nestjs",
3
- "version": "0.0.97",
3
+ "version": "0.1.2",
4
4
  "description": "",
5
5
  "private": false,
6
+ "exports": {
7
+ ".": {
8
+ "import": "./dist/index.js",
9
+ "require": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ },
12
+ "./entities": {
13
+ "import": "./dist/database/entities/index.js",
14
+ "require": "./dist/database/entities/index.js",
15
+ "types": "./dist/database/entities/index.d.ts"
16
+ },
17
+ "./logger/pino-pretty-transport": {
18
+ "import": "./dist/logger/pino-pretty-transport.js",
19
+ "require": "./dist/logger/pino-pretty-transport.js",
20
+ "types": "./dist/logger/pino-pretty-transport.d.ts"
21
+ }
22
+ },
6
23
  "scripts": {
7
24
  "build": "tsc -p tsconfig.build.json",
25
+ "uglify": "find dist -name '*.js' -exec terser {} --compress --mangle --keep-fnames --module -o {};",
8
26
  "lint": "eslint 'lib/**/*.ts' --fix,",
9
27
  "prepublish:npm": "npm run build",
10
28
  "publish:npm": "npm publish --access public",
@@ -14,37 +32,64 @@
14
32
  "author": "",
15
33
  "license": "ISC",
16
34
  "dependencies": {
17
- "@nestjs/common": "10.4.15",
18
- "@nestjs/core": "10.4.15",
19
- "@nestjs/passport": "10.0.3",
20
- "@nestjs/swagger": "8.1.0",
21
- "class-transformer": "0.5.1",
22
- "class-validator": "0.14.1",
23
- "date-fns": "4.1.0",
35
+ "@aws-sdk/client-s3": "^3.842.0",
36
+ "@aws-sdk/s3-presigned-post": "^3.842.0",
37
+ "@nestjs/config": "^4.0.2",
38
+ "date-fns-tz": "^3.2.0",
24
39
  "express": "4.21.2",
40
+ "ioredis": "^5.6.1",
25
41
  "passport-jwt": "4.0.1",
26
42
  "passport-kakao": "1.0.1",
27
43
  "passport-local": "1.0.0",
28
- "rxjs": "7.8.1",
29
- "typeorm": "0.3.20"
44
+ "pino-pretty": "^13.0.0",
45
+ "ua-parser-js": "^2.0.3"
30
46
  },
31
47
  "devDependencies": {
48
+ "@nestjs/common": "10.4.15",
49
+ "@nestjs/core": "10.4.15",
50
+ "@nestjs/event-emitter": "^3.0.1",
51
+ "@nestjs/jwt": "^10.2.0",
52
+ "@nestjs/passport": "10.0.3",
53
+ "@nestjs/swagger": "8.1.0",
54
+ "@nestjs/testing": "^10.0.0",
55
+ "@nestjs/typeorm": "^10.0.2",
56
+ "@trivago/prettier-plugin-sort-imports": "^5.2.2",
57
+ "@types/jest": "^29.5.2",
32
58
  "@types/node": "22.10.2",
33
59
  "@typescript-eslint/eslint-plugin": "8.18.0",
34
60
  "@typescript-eslint/parser": "8.18.0",
61
+ "class-transformer": "0.5.1",
62
+ "class-validator": "0.14.1",
63
+ "date-fns": "4.1.0",
35
64
  "eslint": "9.16.0",
36
65
  "eslint-config-prettier": "9.1.0",
37
66
  "eslint-plugin-import": "2.31.0",
67
+ "jest": "^29.5.0",
68
+ "nanoid": "^3.0.0",
38
69
  "release-it": "^17.10.0",
39
70
  "release-it-pnpm": "^4.6.3",
71
+ "rxjs": "7.8.1",
72
+ "terser": "^5.43.1",
73
+ "ts-jest": "^29.1.0",
74
+ "typeorm": "0.3.20",
40
75
  "typescript": "5.7.2"
41
76
  },
42
77
  "peerDependencies": {
43
- "@nestjs/common": "10.4.15",
44
- "@nestjs/core": "10.4.15",
45
- "@nestjs/passport": "10.0.3",
46
- "@nestjs/swagger": "8.1.0",
47
- "class-transformer": "0.5.1",
48
- "class-validator": "0.14.1"
78
+ "@nestjs/common": "^10.0.0",
79
+ "@nestjs/config": "^4.0.2",
80
+ "@nestjs/core": "^10.0.0",
81
+ "@nestjs/event-emitter": "^3.0.1",
82
+ "@nestjs/jwt": "^10.2.0",
83
+ "@nestjs/passport": "^10.0.0",
84
+ "@nestjs/swagger": "^8.1.0",
85
+ "@nestjs/typeorm": "^10.0.2",
86
+ "class-transformer": "^0.5.1",
87
+ "class-validator": "^0.14.1",
88
+ "date-fns": "^4.0.0",
89
+ "ioredis": "^5.6.1",
90
+ "nanoid": "^3.0.0",
91
+ "pino-pretty": "^13.0.0",
92
+ "rxjs": "^7.8.1",
93
+ "typeorm": "0.3.20"
49
94
  }
50
95
  }