@flusys/nestjs-shared 1.1.0-beta → 1.2.0-rc.1
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 +146 -1330
- package/cjs/classes/api-controller.class.js +325 -49
- package/cjs/classes/api-service.class.js +271 -149
- package/cjs/classes/handle-custome-db.js +37 -0
- package/cjs/classes/index.js +2 -2
- package/cjs/classes/winston.logger.class.js +103 -70
- package/cjs/constants/index.js +15 -4
- package/cjs/constants/message-keys.js +68 -0
- package/cjs/constants/permissions.js +287 -0
- package/cjs/decorators/api-response.decorator.js +2 -3
- package/cjs/decorators/index.js +1 -0
- package/cjs/decorators/log-action.decorator.js +149 -0
- package/cjs/decorators/require-permission.decorator.js +5 -5
- package/cjs/dtos/delete.dto.js +10 -0
- package/cjs/dtos/filter-and-pagination.dto.js +24 -34
- package/cjs/dtos/get-by-ids.dto.js +65 -0
- package/cjs/dtos/identity-response.dto.js +4 -8
- package/cjs/dtos/index.js +1 -0
- package/cjs/dtos/pagination.dto.js +4 -8
- package/cjs/dtos/response-payload.dto.js +68 -112
- package/cjs/entities/identity.js +12 -6
- package/cjs/entities/index.js +1 -0
- package/cjs/entities/raw-type.js +4 -0
- package/cjs/entities/user-root.js +15 -15
- package/cjs/enums/index.js +20 -0
- package/cjs/enums/notification-type.enum.js +17 -0
- package/cjs/enums/participant-status.enum.js +17 -0
- package/cjs/enums/recurrence-type.enum.js +18 -0
- package/cjs/exceptions/base-app.exception.js +151 -0
- package/cjs/exceptions/index.js +1 -0
- package/cjs/exceptions/permission.exception.js +13 -9
- package/cjs/filters/global-exception.filter.js +279 -0
- package/cjs/filters/index.js +18 -0
- package/cjs/guards/jwt-auth.guard.js +4 -1
- package/cjs/guards/permission.guard.js +88 -148
- package/cjs/index.js +2 -0
- package/cjs/interceptors/idempotency.interceptor.js +1 -1
- package/cjs/interceptors/index.js +1 -4
- package/cjs/interceptors/set-user-field-on-body.interceptor.js +60 -0
- package/cjs/interceptors/slug.interceptor.js +30 -9
- package/cjs/interfaces/datasource.interface.js +4 -0
- package/cjs/interfaces/event-manager-adapter.interface.js +11 -0
- package/cjs/interfaces/index.js +4 -2
- package/cjs/interfaces/module-config.interface.js +4 -0
- package/cjs/interfaces/notification-adapter.interface.js +11 -0
- package/cjs/interfaces/permission.interface.js +1 -1
- package/cjs/middlewares/logger.middleware.js +133 -115
- package/cjs/modules/cache/cache.module.js +3 -3
- package/cjs/modules/datasource/index.js +0 -1
- package/cjs/modules/datasource/multi-tenant-datasource.service.js +60 -183
- package/cjs/modules/utils/utils.service.js +27 -206
- package/cjs/utils/date-time.util.js +94 -0
- package/cjs/utils/html-sanitizer.util.js +64 -0
- package/cjs/utils/index.js +5 -1
- package/cjs/utils/query-helpers.util.js +60 -0
- package/cjs/utils/request.util.js +96 -0
- package/cjs/utils/string.util.js +63 -0
- package/classes/api-controller.class.d.ts +16 -8
- package/classes/api-service.class.d.ts +30 -25
- package/classes/handle-custome-db.d.ts +3 -0
- package/classes/index.d.ts +2 -2
- package/classes/winston.logger.class.d.ts +1 -0
- package/constants/index.d.ts +2 -1
- package/constants/message-keys.d.ts +45 -0
- package/constants/permissions.d.ts +306 -0
- package/decorators/api-response.decorator.d.ts +1 -1
- package/decorators/current-user.decorator.d.ts +1 -1
- package/decorators/index.d.ts +1 -0
- package/decorators/log-action.decorator.d.ts +8 -0
- package/decorators/require-permission.decorator.d.ts +2 -2
- package/dtos/delete.dto.d.ts +1 -0
- package/dtos/filter-and-pagination.dto.d.ts +0 -2
- package/dtos/get-by-ids.dto.d.ts +4 -0
- package/dtos/index.d.ts +1 -0
- package/dtos/response-payload.dto.d.ts +8 -20
- package/entities/index.d.ts +1 -0
- package/entities/raw-type.d.ts +1 -0
- package/enums/index.d.ts +3 -0
- package/enums/notification-type.enum.d.ts +6 -0
- package/enums/participant-status.enum.d.ts +6 -0
- package/enums/recurrence-type.enum.d.ts +7 -0
- package/exceptions/base-app.exception.d.ts +41 -0
- package/exceptions/index.d.ts +1 -0
- package/exceptions/permission.exception.d.ts +2 -2
- package/fesm/classes/api-controller.class.js +326 -50
- package/fesm/classes/api-service.class.js +274 -152
- package/fesm/classes/handle-custome-db.js +19 -0
- package/fesm/classes/index.js +3 -2
- package/fesm/classes/winston.logger.class.js +100 -68
- package/fesm/constants/index.js +4 -1
- package/fesm/constants/message-keys.js +49 -0
- package/fesm/constants/permissions.js +200 -0
- package/fesm/decorators/api-response.decorator.js +3 -21
- package/fesm/decorators/index.js +1 -0
- package/fesm/decorators/log-action.decorator.js +139 -0
- package/fesm/decorators/require-permission.decorator.js +17 -65
- package/fesm/dtos/delete.dto.js +12 -2
- package/fesm/dtos/filter-and-pagination.dto.js +26 -47
- package/fesm/dtos/get-by-ids.dto.js +55 -0
- package/fesm/dtos/identity-response.dto.js +4 -8
- package/fesm/dtos/index.js +1 -0
- package/fesm/dtos/pagination.dto.js +4 -8
- package/fesm/dtos/response-payload.dto.js +68 -103
- package/fesm/entities/identity.js +12 -6
- package/fesm/entities/index.js +1 -0
- package/fesm/entities/raw-type.js +1 -0
- package/fesm/entities/user-root.js +15 -15
- package/fesm/enums/index.js +3 -0
- package/fesm/enums/notification-type.enum.js +7 -0
- package/fesm/enums/participant-status.enum.js +7 -0
- package/fesm/enums/recurrence-type.enum.js +8 -0
- package/fesm/exceptions/base-app.exception.js +115 -0
- package/fesm/exceptions/index.js +1 -0
- package/fesm/exceptions/permission.exception.js +16 -18
- package/fesm/filters/global-exception.filter.js +269 -0
- package/fesm/filters/index.js +1 -0
- package/fesm/guards/jwt-auth.guard.js +5 -2
- package/fesm/guards/permission.guard.js +90 -150
- package/fesm/index.js +2 -0
- package/fesm/interceptors/idempotency.interceptor.js +2 -2
- package/fesm/interceptors/index.js +1 -4
- package/fesm/interceptors/set-user-field-on-body.interceptor.js +39 -0
- package/fesm/interceptors/slug.interceptor.js +31 -10
- package/fesm/interfaces/datasource.interface.js +1 -0
- package/fesm/interfaces/event-manager-adapter.interface.js +1 -0
- package/fesm/interfaces/index.js +4 -2
- package/fesm/interfaces/module-config.interface.js +5 -0
- package/fesm/interfaces/notification-adapter.interface.js +1 -0
- package/fesm/interfaces/permission.interface.js +1 -3
- package/fesm/middlewares/logger.middleware.js +133 -109
- package/fesm/modules/cache/cache.module.js +2 -2
- package/fesm/modules/datasource/index.js +0 -1
- package/fesm/modules/datasource/multi-tenant-datasource.service.js +61 -184
- package/fesm/modules/utils/utils.service.js +27 -206
- package/fesm/utils/date-time.util.js +70 -0
- package/fesm/utils/html-sanitizer.util.js +69 -0
- package/fesm/utils/index.js +5 -1
- package/fesm/utils/query-helpers.util.js +85 -0
- package/fesm/utils/request.util.js +81 -0
- package/fesm/utils/string.util.js +71 -0
- package/filters/global-exception.filter.d.ts +9 -0
- package/filters/index.d.ts +1 -0
- package/guards/permission.guard.d.ts +4 -6
- package/index.d.ts +2 -0
- package/interceptors/idempotency.interceptor.d.ts +1 -1
- package/interceptors/index.d.ts +1 -4
- package/interceptors/set-user-field-on-body.interceptor.d.ts +5 -0
- package/interceptors/slug.interceptor.d.ts +2 -1
- package/interfaces/api.interface.d.ts +4 -2
- package/interfaces/datasource.interface.d.ts +5 -0
- package/interfaces/event-manager-adapter.interface.d.ts +43 -0
- package/interfaces/identity.interface.d.ts +4 -4
- package/interfaces/index.d.ts +4 -2
- package/interfaces/logged-user-info.interface.d.ts +0 -2
- package/interfaces/module-config.interface.d.ts +6 -0
- package/interfaces/notification-adapter.interface.d.ts +21 -0
- package/interfaces/permission.interface.d.ts +13 -9
- package/middlewares/logger.middleware.d.ts +2 -2
- package/modules/datasource/index.d.ts +0 -1
- package/modules/datasource/multi-tenant-datasource.service.d.ts +5 -16
- package/modules/utils/utils.service.d.ts +3 -14
- package/package.json +21 -14
- package/utils/date-time.util.d.ts +8 -0
- package/utils/html-sanitizer.util.d.ts +2 -0
- package/utils/index.d.ts +5 -1
- package/utils/query-helpers.util.d.ts +16 -0
- package/utils/request.util.d.ts +6 -0
- package/utils/string.util.d.ts +2 -0
- package/cjs/classes/request-scoped-api.service.js +0 -61
- package/cjs/classes/winston-logger-adapter.class.js +0 -121
- package/cjs/interceptors/query-performance.interceptor.js +0 -66
- package/cjs/interceptors/set-create-by-on-body.interceptor.js +0 -40
- package/cjs/interceptors/set-delete-by-on-body.interceptor.js +0 -40
- package/cjs/interceptors/set-update-by-on-body.interceptor.js +0 -40
- package/cjs/interfaces/base-query.interface.js +0 -6
- package/cjs/interfaces/logger.interface.js +0 -7
- package/cjs/modules/datasource/datasource.module.js +0 -120
- package/cjs/utils/error-handler.util.js +0 -67
- package/classes/request-scoped-api.service.d.ts +0 -13
- package/classes/winston-logger-adapter.class.d.ts +0 -20
- package/fesm/classes/request-scoped-api.service.js +0 -51
- package/fesm/classes/winston-logger-adapter.class.js +0 -124
- package/fesm/interceptors/query-performance.interceptor.js +0 -56
- package/fesm/interceptors/set-create-by-on-body.interceptor.js +0 -30
- package/fesm/interceptors/set-delete-by-on-body.interceptor.js +0 -30
- package/fesm/interceptors/set-update-by-on-body.interceptor.js +0 -30
- package/fesm/interfaces/base-query.interface.js +0 -3
- package/fesm/interfaces/logger.interface.js +0 -4
- package/fesm/modules/datasource/datasource.module.js +0 -110
- package/fesm/utils/error-handler.util.js +0 -59
- package/interceptors/query-performance.interceptor.d.ts +0 -8
- package/interceptors/set-create-by-on-body.interceptor.d.ts +0 -5
- package/interceptors/set-delete-by-on-body.interceptor.d.ts +0 -5
- package/interceptors/set-update-by-on-body.interceptor.d.ts +0 -5
- package/interfaces/base-query.interface.d.ts +0 -7
- package/interfaces/logger.interface.d.ts +0 -7
- package/modules/datasource/datasource.module.d.ts +0 -18
- package/utils/error-handler.util.d.ts +0 -24
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "LogAction", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return LogAction;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _winstonloggerclass = require("../classes/winston.logger.class");
|
|
13
|
+
const _loggermiddleware = require("../middlewares/logger.middleware");
|
|
14
|
+
function createLoggerAdapter(className, moduleName) {
|
|
15
|
+
if (moduleName) {
|
|
16
|
+
const winstonLogger = (0, _winstonloggerclass.createModuleLogger)(moduleName);
|
|
17
|
+
return {
|
|
18
|
+
log: (level, message, meta)=>{
|
|
19
|
+
winstonLogger.log(level, message, {
|
|
20
|
+
context: className,
|
|
21
|
+
...meta
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
error: (message, stack, meta)=>{
|
|
25
|
+
winstonLogger.error(message, {
|
|
26
|
+
context: className,
|
|
27
|
+
stack,
|
|
28
|
+
...meta
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const nestLogger = new _common.Logger(className);
|
|
34
|
+
return {
|
|
35
|
+
log: (level, message, meta)=>{
|
|
36
|
+
nestLogger[level](message, meta);
|
|
37
|
+
},
|
|
38
|
+
error: (message, stack, meta)=>{
|
|
39
|
+
nestLogger.error(message, stack, meta);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function LogAction(options = {}) {
|
|
44
|
+
return function(target, propertyKey, descriptor) {
|
|
45
|
+
const originalMethod = descriptor.value;
|
|
46
|
+
const className = target.constructor.name;
|
|
47
|
+
const methodName = String(propertyKey);
|
|
48
|
+
descriptor.value = async function(...args) {
|
|
49
|
+
const startTime = Date.now();
|
|
50
|
+
// Resolve module: decorator option > instance property > undefined
|
|
51
|
+
const moduleName = options.module || this.moduleName;
|
|
52
|
+
const logger = createLoggerAdapter(className, moduleName);
|
|
53
|
+
const action = options.action || `${this.entityName || className}.${methodName}`;
|
|
54
|
+
const logLevel = options.logLevel || 'debug';
|
|
55
|
+
const context = {
|
|
56
|
+
requestId: (0, _loggermiddleware.getRequestId)(),
|
|
57
|
+
userId: (0, _loggermiddleware.getUserId)(),
|
|
58
|
+
tenantId: (0, _loggermiddleware.getTenantId)(),
|
|
59
|
+
companyId: (0, _loggermiddleware.getCompanyId)(),
|
|
60
|
+
method: methodName,
|
|
61
|
+
module: moduleName
|
|
62
|
+
};
|
|
63
|
+
const startMessage = `Executing action method "${action}"`;
|
|
64
|
+
const startContext = options.includeParams ? {
|
|
65
|
+
...context,
|
|
66
|
+
params: sanitizeParams(args)
|
|
67
|
+
} : context;
|
|
68
|
+
logger.log(logLevel, startMessage, startContext);
|
|
69
|
+
try {
|
|
70
|
+
const result = await originalMethod.apply(this, args);
|
|
71
|
+
const duration = Date.now() - startTime;
|
|
72
|
+
const resultType = getResultType(result);
|
|
73
|
+
const successMessage = `Executed action method "${action}", returned result "${resultType}" in ${duration.toFixed(2)}ms.`;
|
|
74
|
+
const successContext = options.includeResult && result ? {
|
|
75
|
+
...context,
|
|
76
|
+
duration: `${duration}ms`,
|
|
77
|
+
resultType,
|
|
78
|
+
resultPreview: getResultPreview(result)
|
|
79
|
+
} : {
|
|
80
|
+
...context,
|
|
81
|
+
duration: `${duration}ms`,
|
|
82
|
+
resultType
|
|
83
|
+
};
|
|
84
|
+
logger.log(logLevel, successMessage, successContext);
|
|
85
|
+
return result;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
const duration = Date.now() - startTime;
|
|
88
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
89
|
+
logger.error(`Failed action method "${action}" after ${duration.toFixed(2)}ms: ${errorMessage}`, error instanceof Error ? error.stack : undefined, {
|
|
90
|
+
...context,
|
|
91
|
+
duration: `${duration}ms`,
|
|
92
|
+
error: errorMessage
|
|
93
|
+
});
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
return descriptor;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function sanitizeParams(args) {
|
|
101
|
+
return args.map((arg)=>{
|
|
102
|
+
if (arg === null || arg === undefined) return arg;
|
|
103
|
+
if (typeof arg === 'object') {
|
|
104
|
+
const sanitized = {
|
|
105
|
+
...arg
|
|
106
|
+
};
|
|
107
|
+
const sensitiveKeys = [
|
|
108
|
+
'password',
|
|
109
|
+
'secret',
|
|
110
|
+
'token',
|
|
111
|
+
'apiKey',
|
|
112
|
+
'authorization'
|
|
113
|
+
];
|
|
114
|
+
for (const key of Object.keys(sanitized)){
|
|
115
|
+
if (sensitiveKeys.some((sk)=>key.toLowerCase().includes(sk))) {
|
|
116
|
+
sanitized[key] = '[REDACTED]';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return sanitized;
|
|
120
|
+
}
|
|
121
|
+
return arg;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function getResultType(result) {
|
|
125
|
+
if (result === null) return 'null';
|
|
126
|
+
if (result === undefined) return 'undefined';
|
|
127
|
+
if (Array.isArray(result)) return `Array<${result.length} items>`;
|
|
128
|
+
if (typeof result === 'object') {
|
|
129
|
+
const name = result.constructor?.name;
|
|
130
|
+
return name && name !== 'Object' ? name : 'Object';
|
|
131
|
+
}
|
|
132
|
+
return typeof result;
|
|
133
|
+
}
|
|
134
|
+
function getResultPreview(result) {
|
|
135
|
+
if (Array.isArray(result)) {
|
|
136
|
+
return {
|
|
137
|
+
count: result.length,
|
|
138
|
+
sample: result.slice(0, 2)
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (typeof result === 'object' && result !== null) {
|
|
142
|
+
const keys = Object.keys(result).slice(0, 5);
|
|
143
|
+
return {
|
|
144
|
+
keys,
|
|
145
|
+
hasMore: Object.keys(result).length > 5
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
@@ -15,18 +15,18 @@ _export(exports, {
|
|
|
15
15
|
get RequirePermission () {
|
|
16
16
|
return RequirePermission;
|
|
17
17
|
},
|
|
18
|
-
get
|
|
19
|
-
return
|
|
18
|
+
get RequirePermissionLogic () {
|
|
19
|
+
return RequirePermissionLogic;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
const _common = require("@nestjs/common");
|
|
23
23
|
const _constants = require("../constants");
|
|
24
24
|
const RequirePermission = (...permissions)=>(0, _common.SetMetadata)(_constants.PERMISSIONS_KEY, {
|
|
25
25
|
permissions,
|
|
26
|
-
operator: '
|
|
26
|
+
operator: 'AND'
|
|
27
27
|
});
|
|
28
28
|
const RequireAnyPermission = (...permissions)=>(0, _common.SetMetadata)(_constants.PERMISSIONS_KEY, {
|
|
29
29
|
permissions,
|
|
30
|
-
operator: '
|
|
30
|
+
operator: 'OR'
|
|
31
31
|
});
|
|
32
|
-
const
|
|
32
|
+
const RequirePermissionLogic = (logic)=>(0, _common.SetMetadata)(_constants.PERMISSIONS_KEY, logic);
|
package/cjs/dtos/delete.dto.js
CHANGED
|
@@ -36,6 +36,7 @@ let DeleteDto = class DeleteDto {
|
|
|
36
36
|
constructor(){
|
|
37
37
|
_define_property(this, "id", void 0);
|
|
38
38
|
_define_property(this, "type", void 0);
|
|
39
|
+
_define_property(this, "deletedById", void 0);
|
|
39
40
|
}
|
|
40
41
|
};
|
|
41
42
|
_ts_decorate([
|
|
@@ -80,3 +81,12 @@ _ts_decorate([
|
|
|
80
81
|
]),
|
|
81
82
|
_ts_metadata("design:type", String)
|
|
82
83
|
], DeleteDto.prototype, "type", void 0);
|
|
84
|
+
_ts_decorate([
|
|
85
|
+
(0, _swagger.ApiPropertyOptional)({
|
|
86
|
+
description: 'User ID who initiated the deletion (auto-set by interceptor)',
|
|
87
|
+
example: 'f2e9c8d0-7a2a-11eb-9439-0242ac130002'
|
|
88
|
+
}),
|
|
89
|
+
(0, _classvalidator.IsOptional)(),
|
|
90
|
+
(0, _classvalidator.IsUUID)(),
|
|
91
|
+
_ts_metadata("design:type", String)
|
|
92
|
+
], DeleteDto.prototype, "deletedById", void 0);
|
|
@@ -49,7 +49,6 @@ let FilterAndPaginationDto = class FilterAndPaginationDto {
|
|
|
49
49
|
_define_property(this, "sort", void 0);
|
|
50
50
|
_define_property(this, "select", void 0);
|
|
51
51
|
_define_property(this, "withDeleted", void 0);
|
|
52
|
-
_define_property(this, "extraKey", void 0);
|
|
53
52
|
}
|
|
54
53
|
};
|
|
55
54
|
_ts_decorate([
|
|
@@ -97,7 +96,7 @@ _ts_decorate([
|
|
|
97
96
|
type: [
|
|
98
97
|
String
|
|
99
98
|
],
|
|
100
|
-
description: 'Fields to return. If empty, returns all fields.',
|
|
99
|
+
description: 'Fields to return. Must be valid field names (alphanumeric, underscores only). If empty, returns all fields.',
|
|
101
100
|
example: [
|
|
102
101
|
'id',
|
|
103
102
|
'name',
|
|
@@ -107,6 +106,17 @@ _ts_decorate([
|
|
|
107
106
|
}),
|
|
108
107
|
(0, _classvalidator.IsOptional)(),
|
|
109
108
|
(0, _classvalidator.IsArray)(),
|
|
109
|
+
(0, _classvalidator.IsString)({
|
|
110
|
+
each: true
|
|
111
|
+
}),
|
|
112
|
+
(0, _classvalidator.Matches)(/^[a-zA-Z_][a-zA-Z0-9_]*$/, {
|
|
113
|
+
each: true,
|
|
114
|
+
message: 'Select fields must be valid identifiers (alphanumeric and underscores only)'
|
|
115
|
+
}),
|
|
116
|
+
(0, _classvalidator.MaxLength)(64, {
|
|
117
|
+
each: true,
|
|
118
|
+
message: 'Field names must be 64 characters or less'
|
|
119
|
+
}),
|
|
110
120
|
_ts_metadata("design:type", Array)
|
|
111
121
|
], FilterAndPaginationDto.prototype, "select", void 0);
|
|
112
122
|
_ts_decorate([
|
|
@@ -119,25 +129,9 @@ _ts_decorate([
|
|
|
119
129
|
(0, _classvalidator.IsBoolean)(),
|
|
120
130
|
_ts_metadata("design:type", Boolean)
|
|
121
131
|
], FilterAndPaginationDto.prototype, "withDeleted", void 0);
|
|
122
|
-
_ts_decorate([
|
|
123
|
-
(0, _swagger.ApiPropertyOptional)({
|
|
124
|
-
type: [
|
|
125
|
-
String
|
|
126
|
-
],
|
|
127
|
-
description: 'Additional relation keys to include',
|
|
128
|
-
example: [
|
|
129
|
-
'category',
|
|
130
|
-
'createdBy'
|
|
131
|
-
]
|
|
132
|
-
}),
|
|
133
|
-
(0, _classvalidator.IsOptional)(),
|
|
134
|
-
(0, _classvalidator.IsArray)(),
|
|
135
|
-
_ts_metadata("design:type", Array)
|
|
136
|
-
], FilterAndPaginationDto.prototype, "extraKey", void 0);
|
|
137
132
|
let GetByIdBodyDto = class GetByIdBodyDto {
|
|
138
133
|
constructor(){
|
|
139
134
|
_define_property(this, "select", void 0);
|
|
140
|
-
_define_property(this, "extraKey", void 0);
|
|
141
135
|
}
|
|
142
136
|
};
|
|
143
137
|
_ts_decorate([
|
|
@@ -145,7 +139,7 @@ _ts_decorate([
|
|
|
145
139
|
type: [
|
|
146
140
|
String
|
|
147
141
|
],
|
|
148
|
-
description: 'Fields to return. If empty, returns all fields.',
|
|
142
|
+
description: 'Fields to return. Must be valid field names (alphanumeric, underscores only). If empty, returns all fields.',
|
|
149
143
|
example: [
|
|
150
144
|
'id',
|
|
151
145
|
'name',
|
|
@@ -155,20 +149,16 @@ _ts_decorate([
|
|
|
155
149
|
}),
|
|
156
150
|
(0, _classvalidator.IsOptional)(),
|
|
157
151
|
(0, _classvalidator.IsArray)(),
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
(0,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
'createdBy'
|
|
169
|
-
]
|
|
152
|
+
(0, _classvalidator.IsString)({
|
|
153
|
+
each: true
|
|
154
|
+
}),
|
|
155
|
+
(0, _classvalidator.Matches)(/^[a-zA-Z_][a-zA-Z0-9_]*$/, {
|
|
156
|
+
each: true,
|
|
157
|
+
message: 'Select fields must be valid identifiers (alphanumeric and underscores only)'
|
|
158
|
+
}),
|
|
159
|
+
(0, _classvalidator.MaxLength)(64, {
|
|
160
|
+
each: true,
|
|
161
|
+
message: 'Field names must be 64 characters or less'
|
|
170
162
|
}),
|
|
171
|
-
(0, _classvalidator.IsOptional)(),
|
|
172
|
-
(0, _classvalidator.IsArray)(),
|
|
173
163
|
_ts_metadata("design:type", Array)
|
|
174
|
-
], GetByIdBodyDto.prototype, "
|
|
164
|
+
], GetByIdBodyDto.prototype, "select", void 0);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "GetByIdsDto", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return GetByIdsDto;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _swagger = require("@nestjs/swagger");
|
|
12
|
+
const _classvalidator = require("class-validator");
|
|
13
|
+
function _define_property(obj, key, value) {
|
|
14
|
+
if (key in obj) {
|
|
15
|
+
Object.defineProperty(obj, key, {
|
|
16
|
+
value: value,
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true
|
|
20
|
+
});
|
|
21
|
+
} else {
|
|
22
|
+
obj[key] = value;
|
|
23
|
+
}
|
|
24
|
+
return obj;
|
|
25
|
+
}
|
|
26
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
27
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
28
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
29
|
+
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;
|
|
30
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
31
|
+
}
|
|
32
|
+
function _ts_metadata(k, v) {
|
|
33
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
34
|
+
}
|
|
35
|
+
let GetByIdsDto = class GetByIdsDto {
|
|
36
|
+
constructor(){
|
|
37
|
+
_define_property(this, "ids", void 0);
|
|
38
|
+
_define_property(this, "select", void 0);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
_ts_decorate([
|
|
42
|
+
(0, _swagger.ApiProperty)({
|
|
43
|
+
description: 'Array of IDs to retrieve',
|
|
44
|
+
type: [
|
|
45
|
+
String
|
|
46
|
+
],
|
|
47
|
+
example: [
|
|
48
|
+
'uuid-1',
|
|
49
|
+
'uuid-2'
|
|
50
|
+
]
|
|
51
|
+
}),
|
|
52
|
+
(0, _classvalidator.IsNotEmpty)(),
|
|
53
|
+
(0, _classvalidator.IsArray)(),
|
|
54
|
+
(0, _classvalidator.IsUUID)('all', {
|
|
55
|
+
each: true
|
|
56
|
+
}),
|
|
57
|
+
_ts_metadata("design:type", Array)
|
|
58
|
+
], GetByIdsDto.prototype, "ids", void 0);
|
|
59
|
+
_ts_decorate([
|
|
60
|
+
(0, _swagger.ApiPropertyOptional)({
|
|
61
|
+
description: 'Select specific fields to return (comma-separated or array)'
|
|
62
|
+
}),
|
|
63
|
+
(0, _classvalidator.IsOptional)(),
|
|
64
|
+
_ts_metadata("design:type", Object)
|
|
65
|
+
], GetByIdsDto.prototype, "select", void 0);
|
|
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "IdentityResponseDto", {
|
|
|
8
8
|
return IdentityResponseDto;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _classtransformer = require("class-transformer");
|
|
12
11
|
const _swagger = require("@nestjs/swagger");
|
|
12
|
+
const _classtransformer = require("class-transformer");
|
|
13
13
|
function _define_property(obj, key, value) {
|
|
14
14
|
if (key in obj) {
|
|
15
15
|
Object.defineProperty(obj, key, {
|
|
@@ -44,28 +44,28 @@ let IdentityResponseDto = class IdentityResponseDto {
|
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
_ts_decorate([
|
|
47
|
+
(0, _classtransformer.Expose)(),
|
|
47
48
|
(0, _swagger.ApiProperty)({
|
|
48
49
|
type: String,
|
|
49
50
|
format: 'uuid'
|
|
50
51
|
}),
|
|
51
|
-
(0, _classtransformer.Expose)(),
|
|
52
52
|
_ts_metadata("design:type", String)
|
|
53
53
|
], IdentityResponseDto.prototype, "id", void 0);
|
|
54
54
|
_ts_decorate([
|
|
55
|
+
(0, _classtransformer.Expose)(),
|
|
55
56
|
(0, _swagger.ApiProperty)({
|
|
56
57
|
type: String,
|
|
57
58
|
format: 'date-time'
|
|
58
59
|
}),
|
|
59
|
-
(0, _classtransformer.Expose)(),
|
|
60
60
|
(0, _classtransformer.Type)(()=>Date),
|
|
61
61
|
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
62
62
|
], IdentityResponseDto.prototype, "createdAt", void 0);
|
|
63
63
|
_ts_decorate([
|
|
64
|
+
(0, _classtransformer.Expose)(),
|
|
64
65
|
(0, _swagger.ApiProperty)({
|
|
65
66
|
type: String,
|
|
66
67
|
format: 'date-time'
|
|
67
68
|
}),
|
|
68
|
-
(0, _classtransformer.Expose)(),
|
|
69
69
|
(0, _classtransformer.Type)(()=>Date),
|
|
70
70
|
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
71
71
|
], IdentityResponseDto.prototype, "updatedAt", void 0);
|
|
@@ -76,7 +76,6 @@ _ts_decorate([
|
|
|
76
76
|
nullable: true,
|
|
77
77
|
required: false
|
|
78
78
|
}),
|
|
79
|
-
(0, _classtransformer.Expose)(),
|
|
80
79
|
(0, _classtransformer.Type)(()=>Date),
|
|
81
80
|
_ts_metadata("design:type", Object)
|
|
82
81
|
], IdentityResponseDto.prototype, "deletedAt", void 0);
|
|
@@ -87,7 +86,6 @@ _ts_decorate([
|
|
|
87
86
|
nullable: true,
|
|
88
87
|
required: false
|
|
89
88
|
}),
|
|
90
|
-
(0, _classtransformer.Expose)(),
|
|
91
89
|
_ts_metadata("design:type", Object)
|
|
92
90
|
], IdentityResponseDto.prototype, "createdById", void 0);
|
|
93
91
|
_ts_decorate([
|
|
@@ -97,7 +95,6 @@ _ts_decorate([
|
|
|
97
95
|
nullable: true,
|
|
98
96
|
required: false
|
|
99
97
|
}),
|
|
100
|
-
(0, _classtransformer.Expose)(),
|
|
101
98
|
_ts_metadata("design:type", Object)
|
|
102
99
|
], IdentityResponseDto.prototype, "updatedById", void 0);
|
|
103
100
|
_ts_decorate([
|
|
@@ -107,6 +104,5 @@ _ts_decorate([
|
|
|
107
104
|
nullable: true,
|
|
108
105
|
required: false
|
|
109
106
|
}),
|
|
110
|
-
(0, _classtransformer.Expose)(),
|
|
111
107
|
_ts_metadata("design:type", Object)
|
|
112
108
|
], IdentityResponseDto.prototype, "deletedById", void 0);
|
package/cjs/dtos/index.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
});
|
|
5
5
|
_export_star(require("./delete.dto"), exports);
|
|
6
6
|
_export_star(require("./filter-and-pagination.dto"), exports);
|
|
7
|
+
_export_star(require("./get-by-ids.dto"), exports);
|
|
7
8
|
_export_star(require("./identity-response.dto"), exports);
|
|
8
9
|
_export_star(require("./pagination.dto"), exports);
|
|
9
10
|
_export_star(require("./response-payload.dto"), exports);
|
|
@@ -35,17 +35,13 @@ function _ts_metadata(k, v) {
|
|
|
35
35
|
}
|
|
36
36
|
let PaginationDto = class PaginationDto {
|
|
37
37
|
constructor(){
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
*/ _define_property(this, "pageSize", 10);
|
|
41
|
-
/**
|
|
42
|
-
* Zero-based page index. Defaults to 0 when not provided or invalid.
|
|
43
|
-
*/ _define_property(this, "currentPage", 0);
|
|
38
|
+
_define_property(this, "pageSize", 10);
|
|
39
|
+
_define_property(this, "currentPage", 0);
|
|
44
40
|
}
|
|
45
41
|
};
|
|
46
42
|
_ts_decorate([
|
|
47
43
|
(0, _swagger.ApiPropertyOptional)({
|
|
48
|
-
description: 'Number of items per page
|
|
44
|
+
description: 'Number of items per page (default: 10)',
|
|
49
45
|
example: 10
|
|
50
46
|
}),
|
|
51
47
|
(0, _classvalidator.IsOptional)(),
|
|
@@ -58,7 +54,7 @@ _ts_decorate([
|
|
|
58
54
|
], PaginationDto.prototype, "pageSize", void 0);
|
|
59
55
|
_ts_decorate([
|
|
60
56
|
(0, _swagger.ApiPropertyOptional)({
|
|
61
|
-
description: 'Zero-based page index
|
|
57
|
+
description: 'Zero-based page index (default: 0)',
|
|
62
58
|
example: 0
|
|
63
59
|
}),
|
|
64
60
|
(0, _classvalidator.IsOptional)(),
|