@triproject/nestjs-core 1.0.5

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 (91) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +140 -0
  3. package/dist/bootstrap.d.ts +2 -0
  4. package/dist/bootstrap.js +43 -0
  5. package/dist/config.d.ts +46 -0
  6. package/dist/config.js +50 -0
  7. package/dist/controllers/controller.d.ts +8 -0
  8. package/dist/controllers/controller.js +56 -0
  9. package/dist/drivers/cache/cache.d.ts +18 -0
  10. package/dist/drivers/cache/cache.driver.d.ts +2 -0
  11. package/dist/drivers/cache/cache.driver.js +22 -0
  12. package/dist/drivers/cache/cache.js +92 -0
  13. package/dist/drivers/cache/index.d.ts +3 -0
  14. package/dist/drivers/cache/index.js +19 -0
  15. package/dist/drivers/cache/redis.d.ts +10 -0
  16. package/dist/drivers/cache/redis.js +52 -0
  17. package/dist/drivers/db/db.helper.d.ts +55 -0
  18. package/dist/drivers/db/db.helper.js +217 -0
  19. package/dist/drivers/db/db.module.d.ts +2 -0
  20. package/dist/drivers/db/db.module.js +44 -0
  21. package/dist/drivers/db/db.service.d.ts +10 -0
  22. package/dist/drivers/db/db.service.js +49 -0
  23. package/dist/drivers/db/index.d.ts +5 -0
  24. package/dist/drivers/db/index.js +21 -0
  25. package/dist/drivers/db/migration.d.ts +42 -0
  26. package/dist/drivers/db/migration.js +81 -0
  27. package/dist/drivers/db/repository.d.ts +41 -0
  28. package/dist/drivers/db/repository.js +255 -0
  29. package/dist/drivers/encryptions/encryption.d.ts +8 -0
  30. package/dist/drivers/encryptions/encryption.js +50 -0
  31. package/dist/drivers/encryptions/encryption.module.d.ts +2 -0
  32. package/dist/drivers/encryptions/encryption.module.js +24 -0
  33. package/dist/drivers/encryptions/index.d.ts +3 -0
  34. package/dist/drivers/encryptions/index.js +19 -0
  35. package/dist/drivers/encryptions/jwt.d.ts +6 -0
  36. package/dist/drivers/encryptions/jwt.js +46 -0
  37. package/dist/drivers/encryptions/password-hash.d.ts +11 -0
  38. package/dist/drivers/encryptions/password-hash.js +38 -0
  39. package/dist/drivers/encryptions/snap.signature.d.ts +32 -0
  40. package/dist/drivers/encryptions/snap.signature.js +110 -0
  41. package/dist/drivers/logger/app.logger.d.ts +23 -0
  42. package/dist/drivers/logger/app.logger.js +183 -0
  43. package/dist/drivers/logger/index.d.ts +2 -0
  44. package/dist/drivers/logger/index.js +18 -0
  45. package/dist/drivers/logger/slack.logger.d.ts +4 -0
  46. package/dist/drivers/logger/slack.logger.js +24 -0
  47. package/dist/drivers/mail/index.d.ts +6 -0
  48. package/dist/drivers/mail/index.js +22 -0
  49. package/dist/drivers/mail/mail-template.d.ts +8 -0
  50. package/dist/drivers/mail/mail-template.js +74 -0
  51. package/dist/drivers/mail/mail.config.d.ts +18 -0
  52. package/dist/drivers/mail/mail.config.js +4 -0
  53. package/dist/drivers/mail/mail.d.ts +23 -0
  54. package/dist/drivers/mail/mail.js +98 -0
  55. package/dist/drivers/mail/mail.module.d.ts +2 -0
  56. package/dist/drivers/mail/mail.module.js +26 -0
  57. package/dist/drivers/mail/mail.queue.d.ts +9 -0
  58. package/dist/drivers/mail/mail.queue.js +37 -0
  59. package/dist/drivers/mail/mailer.d.ts +13 -0
  60. package/dist/drivers/mail/mailer.js +62 -0
  61. package/dist/drivers/notifications/index.d.ts +5 -0
  62. package/dist/drivers/notifications/index.js +21 -0
  63. package/dist/drivers/notifications/notification.config.d.ts +8 -0
  64. package/dist/drivers/notifications/notification.config.js +4 -0
  65. package/dist/drivers/notifications/notification.module.d.ts +2 -0
  66. package/dist/drivers/notifications/notification.module.js +25 -0
  67. package/dist/drivers/notifications/notification.queue.d.ts +9 -0
  68. package/dist/drivers/notifications/notification.queue.js +37 -0
  69. package/dist/drivers/notifications/push-notification.d.ts +10 -0
  70. package/dist/drivers/notifications/push-notification.js +75 -0
  71. package/dist/drivers/notifications/slack.d.ts +15 -0
  72. package/dist/drivers/notifications/slack.js +95 -0
  73. package/dist/drivers/queues/app.queue.d.ts +11 -0
  74. package/dist/drivers/queues/app.queue.js +66 -0
  75. package/dist/drivers/queues/index.d.ts +2 -0
  76. package/dist/drivers/queues/index.js +18 -0
  77. package/dist/drivers/queues/queue.module.d.ts +2 -0
  78. package/dist/drivers/queues/queue.module.js +41 -0
  79. package/dist/helpers/exception.helper.d.ts +35 -0
  80. package/dist/helpers/exception.helper.js +71 -0
  81. package/dist/helpers/http.helper.d.ts +23 -0
  82. package/dist/helpers/http.helper.js +134 -0
  83. package/dist/helpers/swagger.helper.d.ts +20 -0
  84. package/dist/helpers/swagger.helper.js +287 -0
  85. package/dist/helpers/totp.helper.d.ts +16 -0
  86. package/dist/helpers/totp.helper.js +30 -0
  87. package/dist/index.d.ts +8 -0
  88. package/dist/index.js +24 -0
  89. package/dist/middlewares/log.middleware.d.ts +9 -0
  90. package/dist/middlewares/log.middleware.js +59 -0
  91. package/package.json +145 -0
@@ -0,0 +1,134 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.HandleResponse = exports.ResponseInterceptor = exports.TransformResponseInterceptor = exports.HttpExceptionFilter = void 0;
16
+ exports.CatchError = CatchError;
17
+ const common_1 = require("@nestjs/common");
18
+ const helpers_1 = require("@triproject/helpers");
19
+ const moment_1 = __importDefault(require("moment"));
20
+ const rxjs_1 = require("rxjs");
21
+ const app_logger_1 = require("../drivers/logger/app.logger");
22
+ const exception_helper_1 = require("./exception.helper");
23
+ function CatchError(err) {
24
+ return (target, key, descriptor) => {
25
+ const originalMethod = descriptor.value;
26
+ descriptor.value = async function (...args) {
27
+ try {
28
+ return await originalMethod.apply(this, args);
29
+ }
30
+ catch (error) {
31
+ if (error instanceof exception_helper_1.AppBadRequestException ||
32
+ error instanceof common_1.BadRequestException ||
33
+ error instanceof common_1.UnprocessableEntityException ||
34
+ error instanceof common_1.NotFoundException ||
35
+ error instanceof common_1.ForbiddenException ||
36
+ error instanceof common_1.UnauthorizedException ||
37
+ error instanceof common_1.ConflictException ||
38
+ error instanceof common_1.BadGatewayException ||
39
+ error instanceof common_1.GatewayTimeoutException) {
40
+ throw error;
41
+ }
42
+ const errorLogger = new app_logger_1.AppLogger(target.constructor.name + '.' + key);
43
+ errorLogger.error(err, ...args, error);
44
+ throw new common_1.InternalServerErrorException(err);
45
+ }
46
+ };
47
+ };
48
+ }
49
+ let HttpExceptionFilter = class HttpExceptionFilter {
50
+ catch(exception, host) {
51
+ const ctx = host.switchToHttp();
52
+ const response = ctx.getResponse();
53
+ const request = ctx.getRequest();
54
+ const status = exception.getStatus();
55
+ if (status === 400) {
56
+ response.status(status).json(exception.getResponse());
57
+ }
58
+ else if (status === 404) {
59
+ response.status(status).json({
60
+ statusCode: status,
61
+ message: 'Not found',
62
+ });
63
+ }
64
+ else {
65
+ response.status(status).json((0, helpers_1.removeEmptyValues)({
66
+ statusCode: status,
67
+ message: exception.message,
68
+ meta: [500, 502, 504].includes(status)
69
+ ? {
70
+ // @ts-ignore
71
+ timestamp: request?.requestStartAt
72
+ ? (0, moment_1.default)(request?.requestStartAt).utc().toISOString(true)
73
+ : undefined,
74
+ path: request.url,
75
+ //@ts-ignore
76
+ reqId: request?.requestId,
77
+ }
78
+ : undefined,
79
+ }));
80
+ }
81
+ }
82
+ };
83
+ exports.HttpExceptionFilter = HttpExceptionFilter;
84
+ exports.HttpExceptionFilter = HttpExceptionFilter = __decorate([
85
+ (0, common_1.Catch)(common_1.HttpException)
86
+ ], HttpExceptionFilter);
87
+ const handleDataValue = (data) => {
88
+ return data?.statusCode && data?.message
89
+ ? data
90
+ : data?.data && typeof data?.data === 'object'
91
+ ? {
92
+ statusCode: 200,
93
+ message: 'Success',
94
+ ...data?.data,
95
+ }
96
+ : {
97
+ statusCode: 200,
98
+ message: 'Success',
99
+ data,
100
+ };
101
+ };
102
+ let TransformResponseInterceptor = class TransformResponseInterceptor {
103
+ //@ts-ignore
104
+ intercept(context, next) {
105
+ //@ts-ignore
106
+ return next.handle().pipe((0, rxjs_1.map)((data) => handleDataValue(data)));
107
+ }
108
+ };
109
+ exports.TransformResponseInterceptor = TransformResponseInterceptor;
110
+ exports.TransformResponseInterceptor = TransformResponseInterceptor = __decorate([
111
+ (0, common_1.Injectable)()
112
+ ], TransformResponseInterceptor);
113
+ let ResponseInterceptor = class ResponseInterceptor {
114
+ message;
115
+ status;
116
+ constructor(message = 'Success', status = common_1.HttpStatus.OK) {
117
+ this.message = message;
118
+ this.status = status;
119
+ }
120
+ //@ts-ignore
121
+ intercept(context, next) {
122
+ //@ts-ignore
123
+ return next.handle().pipe((0, rxjs_1.map)((data) => handleDataValue(data)));
124
+ }
125
+ };
126
+ exports.ResponseInterceptor = ResponseInterceptor;
127
+ exports.ResponseInterceptor = ResponseInterceptor = __decorate([
128
+ (0, common_1.Injectable)(),
129
+ __metadata("design:paramtypes", [String, Number])
130
+ ], ResponseInterceptor);
131
+ const HandleResponse = (message, status = common_1.HttpStatus.OK) => {
132
+ return (0, common_1.UseInterceptors)(new ResponseInterceptor(message, status));
133
+ };
134
+ exports.HandleResponse = HandleResponse;
@@ -0,0 +1,20 @@
1
+ export declare const SwaggerApiBadRequestResponse: MethodDecorator & ClassDecorator;
2
+ export declare const SwaggerApiUnauthorizedResponse: MethodDecorator & ClassDecorator;
3
+ export declare const SwaggerApiForbiddenResponse: MethodDecorator & ClassDecorator;
4
+ export declare const SwaggerApiNotFoundResponse: MethodDecorator & ClassDecorator;
5
+ export declare const SwaggerApiBadSwaGatewayResponse: MethodDecorator & ClassDecorator;
6
+ export declare const SwaggerApiInternalServerErrorResponse: MethodDecorator & ClassDecorator;
7
+ export declare const SwaggerApiConflictResponse: MethodDecorator & ClassDecorator;
8
+ export declare const SwaggerApiNoContentResponse: MethodDecorator & ClassDecorator;
9
+ export declare const SwaggerApiSuccessResponse: (classType: any) => MethodDecorator & ClassDecorator;
10
+ export declare const SwaggerApiCreatedResponse: (classType: any) => MethodDecorator & ClassDecorator;
11
+ export declare function SwaggerApiPaginateResponse<T extends new (...args: any[]) => any>(classType: T): MethodDecorator & ClassDecorator;
12
+ export declare const ApiNameProperty: PropertyDecorator;
13
+ export declare const ApiEmailProperty: PropertyDecorator;
14
+ export declare const ApiPasswordProperty: PropertyDecorator;
15
+ export declare const ApiTokenProperty: PropertyDecorator;
16
+ export declare const ApiUuidProperty: PropertyDecorator;
17
+ export declare const ApiBooleanProperty: PropertyDecorator;
18
+ export declare const ApiNumberProperty: PropertyDecorator;
19
+ export declare const ApiStringProperty: PropertyDecorator;
20
+ export declare const ApiEnumProperty: (enums: string[]) => PropertyDecorator;
@@ -0,0 +1,287 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ApiEnumProperty = exports.ApiStringProperty = exports.ApiNumberProperty = exports.ApiBooleanProperty = exports.ApiUuidProperty = exports.ApiTokenProperty = exports.ApiPasswordProperty = exports.ApiEmailProperty = exports.ApiNameProperty = exports.SwaggerApiCreatedResponse = exports.SwaggerApiSuccessResponse = exports.SwaggerApiNoContentResponse = exports.SwaggerApiConflictResponse = exports.SwaggerApiInternalServerErrorResponse = exports.SwaggerApiBadSwaGatewayResponse = exports.SwaggerApiNotFoundResponse = exports.SwaggerApiForbiddenResponse = exports.SwaggerApiUnauthorizedResponse = exports.SwaggerApiBadRequestResponse = void 0;
13
+ exports.SwaggerApiPaginateResponse = SwaggerApiPaginateResponse;
14
+ const swagger_1 = require("@nestjs/swagger");
15
+ const paginateResponseCache = new Map();
16
+ class BadRequestExample {
17
+ statusCode;
18
+ message;
19
+ errors;
20
+ }
21
+ __decorate([
22
+ (0, swagger_1.ApiProperty)({ example: 400 }),
23
+ __metadata("design:type", Number)
24
+ ], BadRequestExample.prototype, "statusCode", void 0);
25
+ __decorate([
26
+ (0, swagger_1.ApiProperty)({ example: 'Error Message 1, Error Message 2' }),
27
+ __metadata("design:type", String)
28
+ ], BadRequestExample.prototype, "message", void 0);
29
+ __decorate([
30
+ (0, swagger_1.ApiProperty)({
31
+ example: { field1: ['Error message 1', 'Error message 2'], field2: ['Error message 3'] },
32
+ description: 'Validation errors',
33
+ }),
34
+ __metadata("design:type", Object)
35
+ ], BadRequestExample.prototype, "errors", void 0);
36
+ exports.SwaggerApiBadRequestResponse = (0, swagger_1.ApiResponse)({
37
+ status: 400,
38
+ description: 'Bad Request',
39
+ type: BadRequestExample,
40
+ });
41
+ class UnauthorizedExample {
42
+ statusCode;
43
+ message;
44
+ }
45
+ __decorate([
46
+ (0, swagger_1.ApiProperty)({ example: 401 }),
47
+ __metadata("design:type", Number)
48
+ ], UnauthorizedExample.prototype, "statusCode", void 0);
49
+ __decorate([
50
+ (0, swagger_1.ApiProperty)({ example: 'Unauthorized' }),
51
+ __metadata("design:type", String)
52
+ ], UnauthorizedExample.prototype, "message", void 0);
53
+ exports.SwaggerApiUnauthorizedResponse = (0, swagger_1.ApiResponse)({
54
+ status: 401,
55
+ description: 'Unauthorized',
56
+ type: UnauthorizedExample,
57
+ });
58
+ class ForbiddenExample {
59
+ statusCode;
60
+ message;
61
+ }
62
+ __decorate([
63
+ (0, swagger_1.ApiProperty)({ example: 403 }),
64
+ __metadata("design:type", Number)
65
+ ], ForbiddenExample.prototype, "statusCode", void 0);
66
+ __decorate([
67
+ (0, swagger_1.ApiProperty)({ example: 'Forbidden' }),
68
+ __metadata("design:type", String)
69
+ ], ForbiddenExample.prototype, "message", void 0);
70
+ exports.SwaggerApiForbiddenResponse = (0, swagger_1.ApiResponse)({
71
+ status: 403,
72
+ description: 'Forbidden',
73
+ type: ForbiddenExample,
74
+ });
75
+ class NotFoundExample {
76
+ statusCode;
77
+ message;
78
+ }
79
+ __decorate([
80
+ (0, swagger_1.ApiProperty)({ example: 404 }),
81
+ __metadata("design:type", Number)
82
+ ], NotFoundExample.prototype, "statusCode", void 0);
83
+ __decorate([
84
+ (0, swagger_1.ApiProperty)({ example: 'Resource not found' }),
85
+ __metadata("design:type", String)
86
+ ], NotFoundExample.prototype, "message", void 0);
87
+ exports.SwaggerApiNotFoundResponse = (0, swagger_1.ApiResponse)({
88
+ status: 404,
89
+ description: 'Not Found',
90
+ type: NotFoundExample,
91
+ });
92
+ class BadSwaGatewayExample {
93
+ statusCode;
94
+ message;
95
+ }
96
+ __decorate([
97
+ (0, swagger_1.ApiProperty)({ example: 502 }),
98
+ __metadata("design:type", Number)
99
+ ], BadSwaGatewayExample.prototype, "statusCode", void 0);
100
+ __decorate([
101
+ (0, swagger_1.ApiProperty)({ example: 'Bad Gateway' }),
102
+ __metadata("design:type", String)
103
+ ], BadSwaGatewayExample.prototype, "message", void 0);
104
+ exports.SwaggerApiBadSwaGatewayResponse = (0, swagger_1.ApiResponse)({
105
+ status: 502,
106
+ description: 'Bad Gateway',
107
+ type: BadSwaGatewayExample,
108
+ });
109
+ class InternalServerErrorExample {
110
+ statusCode;
111
+ message;
112
+ }
113
+ __decorate([
114
+ (0, swagger_1.ApiProperty)({ example: 500 }),
115
+ __metadata("design:type", Number)
116
+ ], InternalServerErrorExample.prototype, "statusCode", void 0);
117
+ __decorate([
118
+ (0, swagger_1.ApiProperty)({ example: 'Internal server error' }),
119
+ __metadata("design:type", String)
120
+ ], InternalServerErrorExample.prototype, "message", void 0);
121
+ exports.SwaggerApiInternalServerErrorResponse = (0, swagger_1.ApiResponse)({
122
+ status: 500,
123
+ description: 'Internal Server Error',
124
+ type: InternalServerErrorExample,
125
+ });
126
+ class ConflictExample {
127
+ statusCode;
128
+ message;
129
+ }
130
+ __decorate([
131
+ (0, swagger_1.ApiProperty)({ example: 409 }),
132
+ __metadata("design:type", Number)
133
+ ], ConflictExample.prototype, "statusCode", void 0);
134
+ __decorate([
135
+ (0, swagger_1.ApiProperty)({ example: 'Conflict error' }),
136
+ __metadata("design:type", String)
137
+ ], ConflictExample.prototype, "message", void 0);
138
+ exports.SwaggerApiConflictResponse = (0, swagger_1.ApiResponse)({
139
+ status: 409,
140
+ description: 'Conflict',
141
+ type: ConflictExample,
142
+ });
143
+ class NoContentExample {
144
+ statusCode;
145
+ message;
146
+ }
147
+ __decorate([
148
+ (0, swagger_1.ApiProperty)({ example: 204 }),
149
+ __metadata("design:type", Number)
150
+ ], NoContentExample.prototype, "statusCode", void 0);
151
+ __decorate([
152
+ (0, swagger_1.ApiProperty)({ example: 'No content' }),
153
+ __metadata("design:type", String)
154
+ ], NoContentExample.prototype, "message", void 0);
155
+ exports.SwaggerApiNoContentResponse = (0, swagger_1.ApiResponse)({
156
+ status: 204,
157
+ description: 'No Content',
158
+ type: NoContentExample,
159
+ });
160
+ const MergeSwaggerSuccessExample = (classType) => {
161
+ const className = classType.name;
162
+ const cacheKey = `Success${className}Response`;
163
+ if (paginateResponseCache.has(cacheKey)) {
164
+ return paginateResponseCache.get(cacheKey);
165
+ }
166
+ class SuccessResponse {
167
+ statusCode;
168
+ message;
169
+ data;
170
+ }
171
+ __decorate([
172
+ (0, swagger_1.ApiProperty)({ example: 200 }),
173
+ __metadata("design:type", Number)
174
+ ], SuccessResponse.prototype, "statusCode", void 0);
175
+ __decorate([
176
+ (0, swagger_1.ApiProperty)({ example: 'Success' }),
177
+ __metadata("design:type", String)
178
+ ], SuccessResponse.prototype, "message", void 0);
179
+ __decorate([
180
+ (0, swagger_1.ApiProperty)({ description: 'Response data', type: classType }),
181
+ __metadata("design:type", Object)
182
+ ], SuccessResponse.prototype, "data", void 0);
183
+ Object.defineProperty(SuccessResponse, 'name', { value: cacheKey });
184
+ paginateResponseCache.set(cacheKey, SuccessResponse);
185
+ return SuccessResponse;
186
+ };
187
+ const SwaggerApiSuccessResponse = (classType) => (0, swagger_1.ApiResponse)({
188
+ status: 200,
189
+ description: 'Success',
190
+ type: MergeSwaggerSuccessExample(classType),
191
+ });
192
+ exports.SwaggerApiSuccessResponse = SwaggerApiSuccessResponse;
193
+ const MergeSwaggerCreatedExample = (classType) => {
194
+ const className = classType.name;
195
+ const cacheKey = `Created${className}Response`;
196
+ if (paginateResponseCache.has(cacheKey)) {
197
+ return paginateResponseCache.get(cacheKey);
198
+ }
199
+ class CreatedResponse {
200
+ statusCode;
201
+ message;
202
+ data;
203
+ }
204
+ __decorate([
205
+ (0, swagger_1.ApiProperty)({ example: 201 }),
206
+ __metadata("design:type", Number)
207
+ ], CreatedResponse.prototype, "statusCode", void 0);
208
+ __decorate([
209
+ (0, swagger_1.ApiProperty)({ example: 'Resource created successfully' }),
210
+ __metadata("design:type", String)
211
+ ], CreatedResponse.prototype, "message", void 0);
212
+ __decorate([
213
+ (0, swagger_1.ApiProperty)({ description: 'Response data', type: classType }),
214
+ __metadata("design:type", Object)
215
+ ], CreatedResponse.prototype, "data", void 0);
216
+ Object.defineProperty(CreatedResponse, 'name', { value: cacheKey });
217
+ paginateResponseCache.set(cacheKey, CreatedResponse);
218
+ return CreatedResponse;
219
+ };
220
+ const SwaggerApiCreatedResponse = (classType) => (0, swagger_1.ApiResponse)({
221
+ status: 201,
222
+ description: 'Created',
223
+ type: MergeSwaggerCreatedExample(classType),
224
+ });
225
+ exports.SwaggerApiCreatedResponse = SwaggerApiCreatedResponse;
226
+ const MergeSwaggerPaginateExample = (classType) => {
227
+ const className = classType.name;
228
+ const cacheKey = `Paginate${className}Response`;
229
+ if (paginateResponseCache.has(cacheKey)) {
230
+ return paginateResponseCache.get(cacheKey);
231
+ }
232
+ class ApiPaginateResponse {
233
+ statusCode;
234
+ message;
235
+ meta;
236
+ timestamp;
237
+ }
238
+ __decorate([
239
+ (0, swagger_1.ApiProperty)({ example: 200 }),
240
+ __metadata("design:type", Number)
241
+ ], ApiPaginateResponse.prototype, "statusCode", void 0);
242
+ __decorate([
243
+ (0, swagger_1.ApiProperty)({ example: 'Success' }),
244
+ __metadata("design:type", String)
245
+ ], ApiPaginateResponse.prototype, "message", void 0);
246
+ __decorate([
247
+ (0, swagger_1.ApiProperty)({ isArray: true, type: classType }),
248
+ __metadata("design:type", Array)
249
+ ], ApiPaginateResponse.prototype, "data", void 0);
250
+ __decorate([
251
+ (0, swagger_1.ApiProperty)({
252
+ example: {
253
+ total: 100,
254
+ totalPage: 10,
255
+ perPage: 10,
256
+ prevPage: null,
257
+ page: 1,
258
+ nextPage: 2,
259
+ },
260
+ }),
261
+ __metadata("design:type", Object)
262
+ ], ApiPaginateResponse.prototype, "meta", void 0);
263
+ __decorate([
264
+ (0, swagger_1.ApiProperty)({ example: '2024-01-01T00:00:00.000Z' }),
265
+ __metadata("design:type", String)
266
+ ], ApiPaginateResponse.prototype, "timestamp", void 0);
267
+ Object.defineProperty(ApiPaginateResponse, 'name', { value: cacheKey });
268
+ paginateResponseCache.set(cacheKey, ApiPaginateResponse);
269
+ return ApiPaginateResponse;
270
+ };
271
+ function SwaggerApiPaginateResponse(classType) {
272
+ return (0, swagger_1.ApiResponse)({
273
+ status: 200,
274
+ description: 'Success',
275
+ type: MergeSwaggerPaginateExample(classType),
276
+ });
277
+ }
278
+ exports.ApiNameProperty = (0, swagger_1.ApiProperty)({ example: 'John Doe' });
279
+ exports.ApiEmailProperty = (0, swagger_1.ApiProperty)({ example: 'john@gmail.com' });
280
+ exports.ApiPasswordProperty = (0, swagger_1.ApiProperty)({ example: 'Password@#123' });
281
+ exports.ApiTokenProperty = (0, swagger_1.ApiProperty)({ example: 'abcdef1234567890' });
282
+ exports.ApiUuidProperty = (0, swagger_1.ApiProperty)({ example: '123e4567-e89b-12d3-a456-426614174000' });
283
+ exports.ApiBooleanProperty = (0, swagger_1.ApiProperty)({ example: true });
284
+ exports.ApiNumberProperty = (0, swagger_1.ApiProperty)({ example: 42000 });
285
+ exports.ApiStringProperty = (0, swagger_1.ApiProperty)({ example: 'Some string value' });
286
+ const ApiEnumProperty = (enums) => (0, swagger_1.ApiProperty)({ example: enums[0], enum: enums });
287
+ exports.ApiEnumProperty = ApiEnumProperty;
@@ -0,0 +1,16 @@
1
+ interface GenerateSecretTotpReq {
2
+ email: string;
3
+ issuer: string;
4
+ }
5
+ interface GenerateSecretTotpResponse {
6
+ secret: string;
7
+ url: string;
8
+ qrCodeBase64: string;
9
+ }
10
+ declare class Totp {
11
+ private encoding;
12
+ generateSecret(params: GenerateSecretTotpReq): Promise<GenerateSecretTotpResponse>;
13
+ verify(secret: string, otp: string): boolean;
14
+ }
15
+ export declare const totp: Totp;
16
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.totp = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const qrcode_1 = require("qrcode");
6
+ const speakeasy_1 = require("speakeasy");
7
+ class Totp {
8
+ encoding = 'base32';
9
+ async generateSecret(params) {
10
+ const issuer = params?.issuer;
11
+ const secret = (0, speakeasy_1.generateSecret)({ name: `${issuer}:${params?.email}`, issuer });
12
+ if (!secret?.otpauth_url)
13
+ throw new common_1.UnprocessableEntityException('Failed to generate secret');
14
+ const qrCodeBase64 = await (0, qrcode_1.toDataURL)(secret.otpauth_url, {
15
+ type: 'image/png',
16
+ width: 256,
17
+ margin: 2,
18
+ color: { dark: '#000000', light: '#FFFFFF' },
19
+ });
20
+ return {
21
+ secret: secret.base32,
22
+ url: secret.otpauth_url,
23
+ qrCodeBase64,
24
+ };
25
+ }
26
+ verify(secret, otp) {
27
+ return speakeasy_1.totp.verify({ secret: secret, encoding: this.encoding, token: otp, window: 1 });
28
+ }
29
+ }
30
+ exports.totp = new Totp();
@@ -0,0 +1,8 @@
1
+ export * from './config';
2
+ export * from './helpers/exception.helper';
3
+ export * from './helpers/http.helper';
4
+ export * from './helpers/swagger.helper';
5
+ export * from './helpers/totp.helper';
6
+ export * from './controllers/controller';
7
+ export * from './middlewares/log.middleware';
8
+ export * from './bootstrap';
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
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("./config"), exports);
18
+ __exportStar(require("./helpers/exception.helper"), exports);
19
+ __exportStar(require("./helpers/http.helper"), exports);
20
+ __exportStar(require("./helpers/swagger.helper"), exports);
21
+ __exportStar(require("./helpers/totp.helper"), exports);
22
+ __exportStar(require("./controllers/controller"), exports);
23
+ __exportStar(require("./middlewares/log.middleware"), exports);
24
+ __exportStar(require("./bootstrap"), exports);
@@ -0,0 +1,9 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { NextFunction, Request, Response } from 'express';
3
+ export declare class LogMiddleware implements NestMiddleware {
4
+ use(req: Request, res: Response, next: NextFunction): Promise<void>;
5
+ }
6
+ export declare class LogResponseMiddleware implements NestMiddleware {
7
+ private log;
8
+ use(req: Request, res: Response, next?: NextFunction): Promise<void>;
9
+ }
@@ -0,0 +1,59 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LogResponseMiddleware = exports.LogMiddleware = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const helpers_1 = require("@triproject/helpers");
12
+ const app_logger_1 = require("../drivers/logger/app.logger");
13
+ let LogMiddleware = class LogMiddleware {
14
+ async use(req, res, next) {
15
+ req.requestId = (0, helpers_1.generateId)();
16
+ req.requestStartAt = new Date().getTime();
17
+ next();
18
+ }
19
+ };
20
+ exports.LogMiddleware = LogMiddleware;
21
+ exports.LogMiddleware = LogMiddleware = __decorate([
22
+ (0, common_1.Injectable)()
23
+ ], LogMiddleware);
24
+ let LogResponseMiddleware = class LogResponseMiddleware {
25
+ log = new app_logger_1.AppLogger('Log Request');
26
+ async use(req, res, next) {
27
+ try {
28
+ const time = Date.now() - req.requestStartAt;
29
+ const timeString = time < 1000 ? `${time}ms` : `${(time / 1000).toFixed(2)}s`;
30
+ const logs = [
31
+ 'Request' + ` ${req.requestId} completed in ${timeString}`,
32
+ (0, helpers_1.removeEmptyValues)({
33
+ method: req.method,
34
+ url: req.protocol + '://' + req.hostname + req.originalUrl,
35
+ origin: req.get('origin'),
36
+ ipAddress: req.ip,
37
+ body: Object.keys(req?.body).length ? req?.body : undefined,
38
+ }),
39
+ ];
40
+ // @ts-ignore
41
+ if (req?.user)
42
+ logs.push(req.user);
43
+ if (req?.errorMessage)
44
+ logs.push(req.errorMessage);
45
+ this.log.log(...logs);
46
+ }
47
+ catch (error) {
48
+ this.log.error('Error logging response', error);
49
+ }
50
+ finally {
51
+ if (next)
52
+ next();
53
+ }
54
+ }
55
+ };
56
+ exports.LogResponseMiddleware = LogResponseMiddleware;
57
+ exports.LogResponseMiddleware = LogResponseMiddleware = __decorate([
58
+ (0, common_1.Injectable)()
59
+ ], LogResponseMiddleware);